资源描述:
《y=x^2函数问题》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、遗传算法,解决y=x^2x属于[0,31]的最大值问题。C言语#include#include#includetypedef struct { int code; //染色体 int degree;//适应度}Indi;Indi group[40];//种群规模为40void Judge(Indi &x){ x.degree=x.code*x.code;}int happened(double p)//发生一个p=0~1间概率的事件{ return rand()<(int)(p*RAND_MAX);}
2、void Cross(Indi &x,Indi &y)//交叉操作{ Indi z,z1; int temp,temp1; temp=x.code&0x3; temp1=y.code&0x3; z.code=x.code-temp+temp1; z1.code=y.code-temp1+temp; Judge(z); Judge(z1); if(x.degree=x.degree) //如果新个体不如双亲,淘汰之 x=z; } else { if(z.degree>=y.degree) y=
3、z; } if(x.degree=x.degree) //如果新个体不如双亲,淘汰之 x=z1; } else { if(z1.degree>=y.degree) y=z1; }}void main(){ Indi indidest; int i,j,best,x,y,c; int sum,strick,SUM=0; static int n=0; srand(time(NULL)); for(i=0;i<40;++i)//随机得到初始种群 { group[i].code=rand()%
4、32; Judge(group[i]); } for(i=1;i<=10;++i)//固定进化10代 { for(sum=0,best=0,j=0;j<40;++j) { sum+=group[j].degree;//求总的适应度sum if(group[j].degree>group[best].degree) { best=j;//求当前最优个体 } } printf("第%2d代中 最优个体为 %d (%d) 平均适应度为 %10f", i,group[best].code,group[best].degre
5、e,sum/40.0); for(c=40;c;--c) { strick=(int)((float)rand()/RAND_MAX*sum); //赌盘中的色子,选择个体x,y for(x=0;x<40&&strick>=group[x].degree;++x) strick-=group[x].degree; strick=(int)((float)rand()/RAND_MAX*sum); for(y=0;y<40&&strick>=group[y].degree;++y) strick-=group[y].degre
6、e; if(happened(0.9)) Cross(group[x],group[y]);//交叉 } }}一个非常简单的遗传算法源代码,是由DenisCormier(NorthCarolinaStateUniversity)开发的,SitaS.Raghavan(UniversityofNorthCarolinaatCharlotte)修正。代码保证尽可能少,实际上也不必查错。对一特定的应用修正此代码,用户只需改变常数的定义并且定义“评价函数”即可。注意代码的设计是求最大值,其中的目标函数只能取正值;且函数值和个体的适应值之间没有区别。该系统使
7、用比率选择、精华模型、单点杂交和均匀变异。如果用Gaussian变异替换均匀变异,可能得到更好的效果。代码没有任何图形,甚至也没有屏幕输出,主要是保证在平台之间的高可移植性。读者可以从ftp.uncc.edu,目录coe/evol中的文件prog.c中获得。要求输入的文件应该命名为‘gadata.txt’;系统产生的输出文件为‘galog.txt’。输入的文件由几行组成:数目对应于变量数。且每一行提供次序——对应于变量的上下界。如第一行为第一个变量提供上下界,第二行为第二个变量提供上下界,等等。/*******************************
8、**************************