实用标准文案精彩文档实验三:简单的遗传优化(3学时)一、实验目的(1)熟悉和掌握遗传算法的运行机制和求解的基本方法。(2)利用C语言编写程序实现利用遗传算法中的编码,变异,交叉,复制来求解函数最大值。二、实验内容利用遗传算法求解函数:的最大值,其中,x∈[-1,2]|。三、实验原理遗传算法是模拟生物遗传学和自然选择机理,通过人工方式构造的一类优化搜索算法,是对生物进化过程进行的一种数学仿真,是进化计算的一种重要形式。遗传算法与传统数学模型截然不同,它为那些难以找到传统数学模型的难题找出了一个解决方法。同时,遗传算法借鉴了生物科学中的某些知识,从而体现了人工智能的这一交叉学科的特点。遗传算法基本机理主要分为以下三方面:1、编码与解码将问题结构变换为位串形式编码表示的过程叫做编码;相反的,将位串形式编码表示变换为原问题结构的过程叫做解码或者译码。把位串形式编码表示叫做染色体,有时也叫做个体。2、适应度函数为了体现染色体的适应能力,引入了对问题中的每一个染色体都进行度量的函数,叫做适应度函数(fitnessfunction)。通过适应度函数来决定染色体的优劣程度,它体现了自然界进化中的优胜劣汰原则。对于优化问题,适应度函数就是目标函数。3、遗传操作简单的遗传算法操作主要有三种:选择(selection)、交叉(crossover)、变异(mutation)。改进的遗传算法大量扩充了遗传操作,以达到更高的效率。选择操作也叫做复制操作(reproduction)操作,根据个体的适应度函数值所度量的优劣程度决定它在下一代是被淘汰还是被遗传。交叉操作的简单方式是将被选择出的两个个体P1和P2作为父母个体,将两者的部分码值进行交换。变异操作的简单方式是改变数码串的某个位置上的数码。四、实验步骤1、初始化种群;2、计算种群上每个个体的适应度值;3、按由个体适应度值所决定的某个规则选择将进入下一代的个体4、按概率PC进行交叉操作5、按概率PC进行变异操作6、若没有满足某种停止条件,则转步骤2),否则进入下一步;7、输入种群中适应度值最优的染色体作为问题的满足解或最优解五、实验报告要求1、按实验报告书的格式书写实验报告2、简明扼要地将实验步骤写清楚3、事实求是地填写实验结果实用标准文案精彩文档4、对实验结果、实验操作过程中遇到的问题进行认真分析讨论。六、程序代码constintMAX=4194304;constintMIN=0;#includeiostream#includetime.h//产生随机数要用到time(int),以使每次产生的数不同。#includemath.h//sin(float)在这儿。usingnamespacestd;constdoublepi=3.1415926;classIndividuality{private:intchromosome;//染色体public:voidset(intchromosome){this-chromosome=chromosome;}Individualityoperator=(Individualityc){this-chromosome=c.chromosome;return*this;}booloperator==(Individualityc){returnthis-chromosome==c.chromosome;}floatresolve()//通过染色体取得x的值.{return-1.0+(float)chromosome*3.0/(MAX-1);}floatevaluate()//求f(){returnresolve()*(float)sin(10*pi*resolve())+1.0;}voidprint(){cout'\t';for(intj=21;j=0;j--)//以下循环是在以二进制串的形式打印染色体if((1j)&chromosome)cout'1';elsecout'0';cout\t\tx=resolve()\tf(x)=evaluate()endl;}//以下是对当前个体进行变异的操作Individualityvariate(){inti=rand()%21+1;this-chromosome^=1i;return*this;}//以下是两个个体进行交叉,并且返回两个新个体的操作voidcrisscross(Individualityprnt1,Individualityprnt2,Individuality&child1,Individuality&child2){实用标准文案精彩文档inti=rand()%21+1;inttemp1=prnt1.chromosome;inttemp2=prnt2.chromosome;inttemp=0;for(;i22;i++)temp+=1i;temp1&=temp;temp2&=temp;prnt1.chromosome&=~temp;prnt2.chromosome&=~temp;prnt1.chromosome|=temp2;prnt2.chromosome|=temp1;child1=prnt1;child2=prnt2;}};constintPOP_SIZE=200;//建立一个种群的类,并且有固定的大小//每次遗传,选出f(x)的排名在前50%的个体进行遗传(排名通过希尔排序实现),都会有约1%的个体变异,10%的个体发生交叉遗传,其余的直接遗传。每次遗传都记录下本次f(x)为最大的个体Max。遗传150次,如果过程中发现已有30代的Max一直不变了,说明已达到最优,基本不需要再遗传了,所以提前跳出循环。classPopulation{private:Individualityind[POP_SIZE];public:Population(){for(inti=0;iPOP_SIZE;i++)ind[i].set((((double)rand()/(double)RAND_MAX)*MAX+MIN));}voidshellSort(){intgap,i,j;Individualitytemp;for(gap=POP_SIZE/2;gap0;gap/=2)for(i=gap;iPOP_SIZE;i++)for(j=i-gap;j=0&&ind[j].evaluate()ind[j+gap].evaluate();j-=gap){temp=ind[j];ind[j]=ind[j+gap];ind[j+gap]=temp;}}voidinherit(){Population::shellSort();constintNT=POP_SIZE/2;实用标准文案精彩文档intnc=(rand()%(POP_SIZE/10)+(POP_SIZE/4))/2;intnv=rand()%(POP_SIZE/100+1)+(POP_SIZE/100);inti,n1,n2;Individualitytemp[NT];for(i=0;iNT;i++)temp[i]=ind[i];for(i=0;inv;i++){n1=rand()%NT;ind[i]=temp[n1].variate();}for(i=nv;inc;i+=2){n1=rand()%NT;n2=rand()%NT;Individualitytemp1,temp2;temp-crisscross(temp[n1],temp[n2],temp1,temp2);ind[i]=temp1;ind[i+1]=temp2;}for(i=nv+nc*2;iPOP_SIZE;i++){n1=rand()%NT;ind[i]=temp[n1];}}IndividualitygetMax(){Individualitymax=ind[0];for(inti=0;iPOP_SIZE-1;i++){if(ind[i+1].evaluate()ind[i].evaluate())max=ind[i+1];}returnmax;}voidtraverse(){for(inti=0;iPOP_SIZE;i++)ind[i].print();coutendl;}};intmain(){srand((unsigned)time(NULL));Populationa;a.traverse();intcount=0;intgen=0;for(inti=0;i150;i++){Individualitytemp=a.getMax();a.inherit();实用标准文案精彩文档if(a.getMax()==temp)count++;if(count30)break;a.traverse();gen++;}coutThemaxis:\n;a.getMax().print();coutAftergengenerations.\n;return0;}