一个小弟找我写一个遗传算法程序,解决一个算术问题,是老师布置的作业题吧,偶最近很忙的,再说遗传算法偶也没接触过!!
就拜托那位大侠搞定了。源代码如下:(参考程序)
具体的题目,那位看了感兴趣或有把握就给我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过去!
谢谢!
就拜托那位大侠搞定了。源代码如下:(参考程序)
具体的题目,那位看了感兴趣或有把握就给我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过去!
谢谢!
Thanks
俺也正学AI呢
看看啥东东~
我从头开始学遗传算法,花了整整两天时间,终于把程序写出来了。已经发到你的邮箱[email protected]。收到后可别忘了给我加分哦。哈哈~~~~
忘了说明一下,程序是用VC++.NET写的,里面的项目文件要用VC++.NET打开。当然,建立一个VC++空项目,把那几个文件导进去也是可以的。
[email protected]
给我来一份。我想看看。
有空回复我(论坛消息),我开贴另给你100分如何?:)
各位顶过的朋友也谢谢了!各1分聊表谢意!