...

来源:互联网 发布:js防水双组分配方 编辑:程序博客网 时间:2024/06/05 19:35


#include<iostream>

using namespace std;

struct person
{
 int value[8][8];//静态评估表的
 int sum;  //静态评估表的所有数据之和
 int num;  //赢的盘数
};

int n=20;
struct person p[20];

void calcu();

void competition();
void selbest(int best[]);
void crossvar(int best[]);
void copyps(struct person q[20]);


int main()
{
 //readdata();

 //init();

 calcu();

 //output();

 return 0;
}


void calcu()
{
 int i;
 int best[20]; //选优的结果。

 for(i=0; i<500; i++)
 {
  //1、竞争
  competition();
  //2、选优(只选了标号)
  selbest(best);
  //3、交叉(现根据选优的结果复制样本)
  crossvar(best);
  

 }

}

void competition()
{
 

}


void selbest(int best[])
{
 int q[20];
 int i,j,sum;
 int randnum;

 sum=0;
 for(i=0; i<20; i++)
 {
  sum=sum+p[i].num;
  q[i]=sum;
 }
 for(i=0; i<n; i++)
 {
  randnum=rand()%1721;
  j=0;
  while(randnum>=q[j])
  {
   j++;

  }
  best[i]=j;
 }

}

void crossvar(int best[])
{//先复制,再交叉后结果放在q[20]里,最后变异

 int pos; //交叉的位置
 int tmp;
 struct person q[20];
 int r,c,sum;
 int i,j,k;

 //1、复制
 copyps(q);

 pos=rand()%50 + 5;

 //2、交叉
 for(i=0; i<n; i=i+2)
 {//交换best[i]和best[i+1]的尾部数据(pos位置以后所有的元素)
  for(j=pos; j<64; j++)
  {
   r=j/8;
   c=j%8;
   tmp=q[i].value [r][c];
   q[i].value [r][c]=q[i+1].value [r][c];
   q[i+1].value [r][c]=tmp;

  }
  
 }

 //3、填回到样本集并变异
 for(i=0; i<n; i++)
 {
  sum=0;
  for(j=0; j<8; j++)
  {
   for(k=0;k<8; k++)
   {
    if(rand()<0.002)
    {
     p[i].value [j][k]=q[i].value [j][k]+(rand()%5-2);
    }
    else
    {
     p[i].value [j][k]=q[i].value [j][k];
    }
    sum=sum+p[i].value [j][k];
   }
  }
  p[i].sum =sum;
 }

}




void copyps(struct person q[20])
{
 int i,j,k;
 for(i=0; i<n; i++)
 {
  for(j=0; j<8; j++)
  {
   for(k=0; k<8; k++)
   {
    q[i].value[j][k]=p[i].value [j][k];
   }
  }
 }
}