⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yichuan.txt

📁 遗传算法的一个代码
💻 TXT
📖 第 1 页 / 共 3 页
字号:
  size=(double)(wx*wy);
  num=(int)(size/40.0);
  if(num>MAX_POP) num=MAX_POP;
  for(i=0;i<num;i++)
  {
  find_empty(&x,&y);
  world[x][y]=4;
  }
  num=(int)(size/5.0);
  if(num>MAX_FOOD) num=MAX_FOOD;
  for(i=0;i<num;i++)
  {
  ok=0;
  while(ok==0)
  {
  x=random(wx);y=random(wy);
  if((world[x][y]!=4) &&
  (world[x][y-1]==4 || world[x][y+1]==4 ||
  world[x-1][y]==4 || world[x+1][y]==4))
  { world[x][y]=4;
  ok=1;
  }
  }
  }
  for(y=0;y<wy;y++)
  for(x=0;x<wx;x++)
  if(world[x][y]==0)
  {
  num=0;
  for(i=-1;i<=1;i++)
  for(j=-1;j<=1;j++)
  if(get_world(x+j,y+i)==4)
  num++;
  if(num>=6) world[x][y]=4;
  }
  /* 设定生物 */
  num=(int)(size*R_LIFE);
  for(i=0;i<num;i++)
  { find_empty(&x,&y);
  world[x][y]=random(2)+1;
  }
  /* 设定食物 */
  num=(int)(size*R_FOOD);
  for(i=0;i<num;i++)
  {
  find_empty(&x,&y);
  world[x][y]=3;
  }
  }
  void load_world_file() /* 读取虚拟环境数据文件设定 */
  {
  FILE *fopen(),*fpt;
  char st[100],c;
  int i,j;
  if((fpt=fopen("\ga\world","r"))==NULL) exit(-1);
  else
  {
  fscanf(fpt,"%d",&wx);
  fscanf(fpt,"%d",&wy);
  for(i=0;i<wy;i++)
  for(j=0;j<wx;j++)
  fscanf(fpt,"%d",&world[j] [ i]);
  fclose(fpt);
  }
  }
  int get_world(x,y) /*坐标(x,y)处环境值 */
  int x,y;
  {
  if(x>=0 && x<wx && y>=0 && y<wy)
  return(world[x][y]);
  else
  return(-1);
  }
  int decode_gene(n,sb,bw) /* 第n个个体基因型解码 */
  int n,sb,bw; /* sb开始位 bw位长 */
  {
  int i,sum;
  sum=0;
  for(i=sb;i<sb+bw;i++)
  sum=sum*2+gene[n] [ i];
  return(sum);
  }
  void move_pos(n,x1,y1,x2,y2) /* 个体n从(x1,y1)移动到(x2,y2) */
  int n,x1,y1,x2,y2;
  {
  int sp,loss;
  loss=decode_gene(n,12,1)+1; /* 移动消耗 */
  iatr[n][2]=iatr[n][2]-loss; /* 内部能量更新 */
  if(iatr[n][2]<=0) remove_life(n);
  else
  {
  /* 个体属性更新 */
  iatr[n][0]=x2;iatr[n][1]=y2; /* x,y坐标更新 */
  /* 显示更新 */
  sp=gene[n][0]+1;
  g_disp_unit(x1,y1,0); /* 当前位置(x,y)图形消除 */
  world[x1][y1]=0;
  g_disp_unit(x2,y2,sp); /* 新位置图形表示 */
  world[x2][y2]=sp;
  }
  }
  void move_randomly(n) /* 个体n按照移动模式随机移动 */
  int n;
  {
  /* 基本移动模式1 */
  int pat1[8][2]={{1,0},{1,1},{0,1},{-1,1},
  {-1,0},{-1,-1},{0,-1},{1,-1}};
  /* 基本移动模式2与3 */
  int pat2_3[2][4][2]={{{1,0},{0,1},{-1,0},{0,-1}},
  {{1,1},{-1,1},{-1,-1},{1,-1}}};
  int pat,x1,y1,x2,y2,rndnum;
  pat=decode_gene(n,7,2);
  /* pat(0,1,2,3): 表示基本移动模式 */
  x1=iatr[n][0]; /* 当前x坐标 */
  y1=iatr[n][1]; /* 当前y坐标 */
  if(pat<=1) /* 基本移动模式1 */
  {
  rndnum=random(8);
  x2=x1+pat1[rndnum][0]; /* 移动目的点x坐标 */
  y2=y1+pat1[rndnum][1]; /* 移动目的点y坐标 */
  }
  else /* 基本移动模式2与3 */
  {
  rndnum=random(4);
  x2=x1+pat2_3[pat-2][rndnum][0];
  y2=y1+pat2_3[pat-2][rndnum][1];
  }
  if(x2>=0 && x2<wx && y2>=0 && y2<wy)
  if(get_world(x2,y2)==0)
  move_pos(n,x1,y1,x2,y2);
  /* 非法目的点的场合不作移动 */
  }
  void move_individual(n) /* 个体n移动 */
  int n;
  {
  int cx,cy,dx,dy,sp,vf,sumx,sumy;
  int i,j,a,sgn[3],num;
  double vect[8][2]={{1,0},{1,1},{0,1},{-1,1},
  {-1,0},{-1,-1},{0,-1},{1,-1}};
  double vx,vy,d1,d2;
  double _cos,cos_max;
  cx=iatr[n][0]; /* 当前x坐标 */
  cy=iatr[n][1]; /* 当前y坐标 */
  sp=decode_gene(n,0,1)+1; /* 生物种1和2 */
  for(i=0;i<3;i++) /* 移动特点CM */
  {
  sgn [ i]=decode_gene(n,9+i,1);
  if(sgn [ i]==0) sgn [ i]=-1;
  }
  sumx=0;sumy=0;num=0;
  vf=decode_gene(n,5,2)+1; /* 视野 */
  for(i=-vf;i<=vf;i++)
  for(j=-vf;j<=vf;j++)
  {
  if(i!=0||j!=0)
  {
  a=get_world(cx+j,cy+i);
  if(a==1||a==2) /* 生物 1和2 */
  { num++;
  if(a==sp) /* 同种生物 */
  {
  sumx=sumx+sgn[0]*j;
  sumy=sumy+sgn[0]*i;
  }
  else /* 异种生物 */
  {
  sumx=sumx+sgn[1]*j;
  sumy=sumy+sgn[1]*i;
  }
  } else
  if(a==3||a==5) /* 食物 */
  {
  num++;
  sumx=sumx+sgn[2]*j;
  sumy=sumy+sgn[2]*i;
  }
  }
  }
  if(num!=0) /* 视野内有其他生物和食物时 */
  {
  vx=(double)sumx/(double)num;
  vy=(double)sumy/(double)num;
  if(vx!=0||vy!=0)
  {
  cos_max=-1.0;
  j=0;
  for(i=0;i<8;i++)
  {
  d1=sqrt(vx*vx+vy*vy);
  d2=sqrt(vect [ i][0]*vect [ i][0]+vect [ i][1]*vect [ i][1]);
  _cos=(vx*vect [ i][0]+vy*vect [ i][1])/d1/d2;
  if(_cos>cos_max)
  {
  cos_max=_cos;j=i;
  }
  }
  dx=cx+(int)vect[j][0];
  dy=cy+(int)vect[j][1];
  if(dx>=0 && dx<wx && dy>=0 && dy<wy)
  if(world[dx][dy]==0)
  move_pos(n,cx,cy,dx,dy);
  }
  else move_randomly(n);
  }
  else move_randomly(n);
  /* 视野内有其他生物和食物时 */
  }
  void act1_attack(n) /* 个体 n攻击行动范围内的其他生物个体 */
  int n;
  {
  int sft[8][2]={{1,0},{1,1},{0,1},{-1,1},
  {-1,0},{-1,-1},{0,-1},{1,-1}};
  int x1,y1,x2,y2,n2;
  int found,rndnum;
  double attack1,attack2,sa1,sa2,da1,da2,rnd1,rnd2,La1,La2;
  x1=iatr[n][0];y1=iatr[n][1];
  /* 获得攻击对象的坐标(x2,y2) */
  found=0;
  while(found==0)
  {
  rndnum=random(8);
  x2=x1+sft[rndnum][0];
  y2=y1+sft[rndnum][1];
  if(get_world(x2,y2)==1||get_world(x2,y2)==2)
  found=1;
  }
  /* 检查攻击对象个体号n2 */
  found=0;n2=0;
  while(found==0)
  {
  if(iatr[n2][0]==x2 && iatr[n2][1]==y2 && iflg[n2]==1)
  found=1; else n2++;
  }
  /* 计算双方的 Attack量 */
  sa1=(double)decode_gene(n,19,3);
  da1=(double)decode_gene(n,22,3);
  sa2=(double)decode_gene(n2,19,3);
  da2=(double)decode_gene(n2,22,3);
  rnd1=(double)random(1001)/1000.0;
  rnd2=(double)random(1001)/1000.0;
  attack1=(double)iatr[n][2]+sa1*20.0/7.0*rnd1+da1*20.0/7.0*rnd2;
  rnd1=(double)random(1001)/1000.0;
  rnd2=(double)random(1001)/1000.0;
  attack2=(double)iatr[n2][2]+sa2*20.0/7.0*rnd1+da2*20.0/7.0*rnd2;
  /* 减少内部能量 */
  La1=decode_gene(n,25,3);
  La2=decode_gene(n2,25,3);
  rnd1=(double)random(1001)/1000.0;
  iatr[n][2]=iatr[n][2]-(int)((double)La1*rnd1);
  rnd2=(double)random(1001)/1000.0;
  iatr[n2][2]=iatr[n2][2]-(int)((double)La2*rnd2);
  if(attack1>=attack2) /* 胜者: n 败者:n2 */
  iatr[n2][2]=iatr[n2][2]-40;
  else /* 胜者: n2 败者:n */
  iatr[n][2]=iatr[n][2]-40;
  if(iatr[n][2]<=0) remove_life(n);
  if(iatr[n2][2]<=0) remove_life(n2);
  }
  void act2_eat(n) /* 个体n获取行动范围内的食物 */
  int n;
  {
  int sft[8][2]={{1,0},{1,1},{0,1},{-1,1},
  {-1,0},{-1,-1},{0,-1},{1,-1}};
  int x1,y1,x2,y2,n2,ef;
  int found,rndnum;
  x1=iatr[n][0];y1=iatr[n][1];
  /* 获取食物位置(x2,y2) */
  found=0;
  while(found==0)
  {
  rndnum=random(8);
  x2=x1+sft[rndnum][0];
  y2=y1+sft[rndnum][1];
  if(get_world(x2,y2)==3||get_world(x2,y2)==5)
  found=1;
  }
  /* 增加内部能量 */
  ef=decode_gene(n,28,4); /* 食物吸取效率 */
  iatr[n][2]=iatr[n][2]+(int)(40.0*(50.0+(double)ef*50.0/15.0)/100.0);
  if(iatr[n][2]>100) iatr[n][2]=100;
  /* 检查食物号n2 */
  found=0;n2=0;
  while(found==0)
  {
  if(fatr[n2][0]==x2 && fatr[n2][1]==y2 && fflg[n2]==1)
  found=1; else n2++;
  }
  remove_food(n2);
  }
  void act3_makechild(n) /* 个体n与行动范围内的其他生物个体交配产生子个体 */
  int n;
  {
  int i,j,k,x,y,x2,y2,found,n2,trial;
  int x3,y3;
  double rnd;
  if(pop_size+1<=MAX_POP)
  {
  x=iatr[n][0];y=iatr[n][1];
  found=0;
  while(found==0)
  {
  x2=x+random(3)-1;
  y2=y+random(3)-1;
  if(x2!=x||y2!=y)
  if(get_world(x2,y2)==gene[n][0]+1);
  found=1;
  }
  /* 检查交配对象个体号n2 */
  found=0; n2=0;
  while(found==0)
  {
  if((iatr[n2][0]==x2 || iatr[n2][1]==y2) && iflg[n2]==1)
  found=1; else n2++;
  if(n2>=pop_size-1) return;
  }
  /* 确定产生个体位置 */
  found=0;trial=0;
  while(found==0 && trial<50)
  {
  i=random(3)-1;j=random(3)-1;
  k=random(2);
  if(k==0) { x3=x+i;y3=y+j;}
  else { x3=x2+i;y3=y2+j;}
  if(get_world(x3,y3)==0) found=1;
  trial++;
  }
  if(found==1)
  {
  /* 个体 n与个体 n2产生子个体 */
  pop_size++;
  /* 均匀交叉 */
  uni_crossover(gene,n,n2,pop_size-1,0.5,G_LENGTH);
  /* 变异 */
  for(i=1;i<G_LENGTH;i++)
  {
  rnd=random(10001)/10000.0;
  if(rnd<=MUTATION)
  if(gene[pop_size-1] [ i]==1)
  gene[pop_size-1] [ i]=0;
  else gene[pop_size-1] [ i]=1;
  }
  /* 交配后父个体能量减少 */
  iatr[n][2]=iatr[n][2]-45;
  if(iatr[n][2]<=0) remove_life(n);
  iatr[n2][2]=iatr[n2][2]-45;
  if(iatr[n2][2]<=0) remove_life(n2);
  /* 子个体属性输入 */
  iatr[pop_size-1][0]=x3;
  iatr[pop_size-1][1]=y3;
  iatr[pop_size-1][2]=100;
  iatr[pop_size-1][3]=0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -