一个小弟找我写一个遗传算法程序,解决一个算术问题,是老师布置的作业题吧,偶最近很忙的,再说遗传算法偶也没接触过!!
就拜托那位大侠搞定了。源代码如下:(参考程序)
具体的题目,那位看了感兴趣或有把握就给我mail吧:我把题目发过去(有图片和PDF文件)
mail:[email protected]/*  遗传算法参考程序  */#include "float.h"
#include "time.h"
#include "math.h"
#include "graphics.h"
#include "stdlib.h"
#define maxpop 100
#define maxstring 64
 struct pp
   {unsigned char chrom[maxstring];
    float x1[10],fitness;
    unsigned int parent1,parent2,xsite;
   };
 struct pp *oldpop,*newpop,*p1; unsigned int popsize,lchrom,gen,maxgen,nmutation,ncross,jcross,maxpp,minpp,jrand; float pcross, pmutation,sumfitness,avg,max,min,seed,r1[maxpop],r2[maxpop],oldrand[maxpop]; double coef; int num,num1[10]; float xvalue[10], searchpointl[10],searchpointh[10],min1; float objfunc();
 void xvalue1();
 float decode();
 void statistics();
 int select();
 int flip(float);
 int crossover();
 int mutation();
 void generation();
 void initialize();
 void report();
 void initdata();
 void initreport();
 float random1();
 void randomize1();
 float h2[10],h1[5],L[10],z[10];
 int i;/*  主程序  */
 main()
 {
  long int gen,k,j,j1;
  float oldmax,checkv,h2[10];
  int oldmaxpp,m;
if(!(oldpop=(struct pp*)malloc(maxpop* sizeof(struct pp)) ) )
    {printf("memory request failed!\n");exit(0);}
 if(!(newpop=(struct pp*)malloc(maxpop *sizeof(struct pp))))
       {printf("memory request failed)\n");exit(0);}
 if(!(p1=(struct pp*)malloc(sizeof(struct pp))))
    {printf("memory request failed!\n");exit(0); }
 for(k=0;k<maxpop;k++) oldpop[k].chrom[0]='\0';
 for(k=0;k<maxpop;k++) newpop[k].chrom[0]='\0';
 gen=0;
 initialize();
 clrscr();
 p1=newpop;
 newpop=oldpop;
 statistics();
 initreport();
 newpop=p1;
 getch();
 do
 {
     gen=gen+1;
     random1();
     oldmax=max;
     oldmaxpp=maxpp;
     generation();
     statistics();
     j1=0;
     do
     {
        for(m=0;m<num;m++)
       {
   h2[m]=newpop[maxpp].x1[m];
       }
       L[0]=2*h2[0]-5-h2[4]*(2*h2[0]+1)-h2[5]*(2*h2[0]-1)-h2[6]*(4*h2[0]+2);
L[1]=2*h2[1]-5-h2[4]*(2*h2[1]-1)-4*h2[5]*h2[1]-h2[6]*(2*h2[1]-1);
L[2]=4*h2[2]-21-h2[4]*(2*h2[2]+1)-2*h2[5]*h2[2]-2*h2[6]*h2[2];
L[3]=2*h2[3]+7-h2[4]*(2*h2[3]-1)-h2[5]*(4*h2[3]-1)+h2[6];
L[4]=h2[0]*h2[0]+h2[1]*h2[1]+h2[2]*h2[2]+h2[3]*h2[3]+h2[0]-h2[1]+h2[2]-h2[3]-7+h2[7]*h2[7];
L[5]=h2[0]*h2[0]+2*h2[1]*h2[1]+h2[2]*h2[2]+2*h2[3]*h2[3]-h2[0]-h2[3]-9+ h2[8]*h2[8];
L[6]=2*h2[0]*h2[0]+h2[1]*h2[1]+h2[2]*h2[2]+2*h2[0]-h2[1]-h2[3]-5+h2[9]*h2[9];
for(i=7;i<10;i++)
L[i]=-2*h2[i-3]*h2[i];
h2[10]=0;
    for(i=0;i<10;i++)
h2[10]=h2[10]+L[i]*L[i];
h2[10]=-h2[10];
      if(h2[10]!=newpop[maxpp].fitness)
      {
         for(j=0;j<lchrom;j++)
     newpop[maxpp].chrom[j]=oldpop[oldmaxpp].chrom[j];
         for(m=0;m<num;m++)
      newpop[maxpp].x1[m]=oldpop[oldmaxpp].x1[m];
      newpop[maxpp].fitness=oldpop[oldmaxpp].fitness;
        statistics();
       }
      j1=j1+1;     }
     while(j1<popsize);
     if(max<oldmax)
      {
         for(j=0;j<lchrom;j++)
           newpop[minpp].chrom[j]=oldpop[oldmaxpp].chrom[j];
         for(m=0;m<num;m++)
    newpop[minpp].x1[m]=oldpop[oldmaxpp].x1[m];
          newpop[minpp].fitness=oldpop[oldmaxpp].fitness;
         statistics();
     p1=oldpop;
     oldpop=newpop;
     newpop=p1;
    }
  }
    while(gen<maxgen);
 statistics();
 report(maxgen-1);
 free(p1);
 free(oldpop);
 free(newpop);
 exit(0);
}
/*  个体适应度计算 ok */ float objfunc(float *xvalue)
{
 float y;
 int i;
 z[0]=xvalue[0];
 z[1]=xvalue[1];
 z[2]=xvalue[2];
 z[3]=xvalue[3];
 z[4]=xvalue[4];
 z[5]=xvalue[5];
 z[6]=xvalue[6];
 z[7]=xvalue[7];
 z[8]=xvalue[8];
 z[9]=xvalue[9];
 L[0]=2*z[0]-5-z[4]*(2*z[0]+1)-z[5]*(2*z[0]-1)-z[6]*(4*z[0]+2);
 L[1]=2*z[1]-5-z[4]*(2*z[1]-1)-4*z[5]*z[1]-z[6]*(2*z[1]-1);
 L[2]=4*z[2]-21-z[4]*(2*z[2]+1)-2*z[5]*z[2]-2*z[6]*z[2];
 L[3]=2*z[3]+7-z[4]*(2*z[3]-1)-z[5]*(4*z[3]-1)+z[6];
 L[4]=z[0]*z[0]+z[1]*z[1]+z[2]*z[2]+z[3]*z[3]+z[0]-z[1]+z[2]-z[3]-7+z[7]*z[7];
 L[5]=z[0]*z[0]+2*z[1]*z[1]+z[2]*z[2]+2*z[3]*z[3]-z[0]-z[3]-9+z[8]*z[8];
 L[6]=2*z[0]*z[0]+z[1]*z[1]+z[2]*z[2]+2*z[0]-z[1]-z[3]-5+z[9]*z[9];
 for(i=7;i<10;i++)
L[i]=-2*z[i-3]*z[i];
 z[10]=0;
 for(i=0;i<10;i++)
z[10]=z[10]+L[i]*L[i];
 y=-z[10];
 return (y);
}
/*  译码ok  */
float decode(unsigned char *pp,int lenth)
{
 int j;
 float tt,tt1;
 tt1=1.0;
 tt=0.0;
 for(j=lenth-1;j>-1;j--)
{
if(pp[j]) tt=tt+tt1;
     tt1=2.0*tt1;
   }
 return tt;
}
/*  x值计算 ok */
void xvalue1(pp,num,num1,xvalue,searchpointl,searchpointh)
unsigned char *pp;
int num,num1[10];
float *xvalue,*searchpointl,*searchpointh;
{
 int i,j1,m;
 double k;
 unsigned char pp1[30];
 j1=0;
 for(i=0;i<num;i++)
   {
     for(m=0;m<num1[i];m++)
       pp1[m]=pp[j1+m];
     pp1[num1[i]]='\0';
     xvalue[i]=decode(pp1,num1[i]);
     k=pow(2.0,num1[i])-1.0;
     xvalue[i]=searchpointl[i]+(searchpointh[i]-searchpointl[i])/k*xvalue[i];
    j1=j1+num1[i];
    }
}
……下面太长了,系统不让发,有兴趣的我一道发mail过去!
谢谢!
 

解决方案 »

  1.   

    偶已经给各位mail了,请查收!元旦之前希望能解答出来,年末散分!不够分,开贴另散!(偶有500分:)
      

  2.   

    [email protected]
    Thanks
    俺也正学AI呢
      

  3.   

    MATLAB?呵呵,那是简单的,8过这是他们老师要求的作业。,楼上的朋友,我今天也给你发了:)
      

  4.   

    [email protected]
    看看啥东东~
      

  5.   


       我从头开始学遗传算法,花了整整两天时间,终于把程序写出来了。已经发到你的邮箱[email protected]。收到后可别忘了给我加分哦。哈哈~~~~
      

  6.   


          忘了说明一下,程序是用VC++.NET写的,里面的项目文件要用VC++.NET打开。当然,建立一个VC++空项目,把那几个文件导进去也是可以的。
      

  7.   

    我也正在研究遗传算法
    [email protected]
      

  8.   

    [email protected]
    给我来一份。我想看看。
      

  9.   

    谢谢大家的关注,尤其谢谢yaozijian110!你发的我已经发给我的学弟,现在散分!
    有空回复我(论坛消息),我开贴另给你100分如何?:)
    各位顶过的朋友也谢谢了!各1分聊表谢意!