您好,欢迎访问三七文档
智能优化算法第一次作业--------------遗传算法洪文杰S151000853问题:用遗传算法求解f(x)=xsin(10π*x)+2.0的最大值,x取[-1,2].一、分析:遗传算法基本思路二、实例简介1.产生初始种群s1=13(01101)s2=24(11000)s3=8(01000)s4=19(10011)2.计算适应度假定适应度为f(s)=s^2,则f(s1)=f(13)=13^2=169f(s2)=f(24)=24^2=576f(s3)=f(8)=8^2=64f(s4)=f(19)=19^2=3613.选择染色体的选择概率为:染色体的累计概率为:根据上面的式子,可得到:例如设从区间[0,1]中产生4个随机数:r1=0.450126,r2=0.110347r3=0.572496,r4=0.985034.交叉基本遗传算法(SGA)中交叉算子采用单点交叉算子。单点交叉运算5.变异6.至下一代,适应度计算→选择→交叉→变异,直至满足终止条件三、解决问题初始化输入种群大小,交叉概率,变异概率等条件根据精度编码将区间[-1,2]分成Num份,再通过Num求解种群基因个数([-1,2]用二进制等分)计算每个个体的适应度,该题适应度函数就是f(X)根据适应度求解积累概率,并用轮盘赌法选着个体产生备选种群在备选种群中,利用交叉概率,随机选择个体,再随机选择交叉点进行单点交叉,形成交叉后的种群在交叉后种群中,利用变异概率,随机选择个体,再随机选择变异点进行单点变异,形成变异后的种群是否达到迭代次数输出结果最大值。是否四、实验结果源代码:/*问题:用遗传算法求解f(x)=xsin(10π*x)+2.0的最大值,x取[-1,2].*//*洪文杰2016-3-9.智能优化算法第一次作业*/#includeiostream//#includstdio.h#includestdlib.h#includemath.h#includetime.h#includefloat.husingnamespacestd;#defineNUMBER50//种群规模#defineGENE_NUMBER10000//迭代次数intUnit[NUMBER][30];//初始种群intUnit_choose[NUMBER][30];//选择、交叉、变异后的种群intNumber[NUMBER];//被选择的个体编号floatFitness[NUMBER];//适应度floatselect_probability[NUMBER];//选择概率floataccumula_probability[NUMBER];//积累概率floatf_max=0.0;//最大值floatf_x=0.0;//最大值对应的自变量inthwj_coding(intstart,intend);//编码voidhwj_initial_population(intnum);//产生初始种群voidhwj_fitness(intnum);//适应度计算voidhwj_choose();//选择个体inthwj_binary_search(intl,intr,floattemp);//查找选择//voidhwj_N_M(inta[],intb[],intN,intM);//从M个数中选N个不一样的数voidhwj_cross(intnum,floatcross);//交叉后的得到种群voidhwj_aberrance(intnum,floataberrance);//变异后的得到的种群voidhwj_max(intnum);//找到最适应的个体intmain(){intstrat,end;//区间intNum;//编码大小floatcross=0.8;//交叉概率floataberrance=0.04;//变异概率intkey=1;cout请输入求解区间:endl;cinstratend;Num=hwj_coding(strat,end);coutNum:Numendl;//cout--------------------------1-----------------endl;hwj_initial_population(Num);//cout--------------------------2初始种群-----------------endl;/*for(inti=0;iNUMBER;i++){for(intj=0;jNum;j++){coutUnit[i][j]'';}coutendl;}*/while(key!=GENE_NUMBER){hwj_fitness(Num);//cout--------------------------3适应度-----------------endl;//for(inti=0;iNUMBER;i++){//coutFitness[i]endl;//}hwj_choose();//cout--------------------------4被选择的个体-----------------endl;/*for(inti=0;iNUMBER;i++){for(intj=0;jNum;j++){coutUnit_choose[i][j]'';}coutendl;}*/hwj_cross(Num,cross);/*cout--------------------------5交叉后的种群-----------------endl;for(inti=0;iNUMBER;i++){for(intj=0;jNum;j++){coutUnit[i][j]'';}coutendl;}*/hwj_aberrance(Num,aberrance);/*cout--------------------------6变异后的种群-----------------endl;for(inti=0;iNUMBER;i++){for(intj=0;jNum;j++){coutUnit[i][j]'';}coutendl;}*/key++;hwj_max(Num);}cout最大值是对应的x值是:endl;coutf_xendl;cout最大值为:f_maxendl;return0;}inthwj_coding(intstart,intend){//种群编码floatprecision;inttemp=2;intsum;intN=1;cout请输入精度范围:endl;cinprecision;if(precision==0){cout对不起精度不能为零:endl;return0;}else{sum=(end-start)/precision;coutsum:sumendl;while(tempsum){temp*=2;N++;}returnN;}}voidhwj_initial_population(intnum){//生成初始种群srand(time(NULL));for(inti=0;iNUMBER;i++){for(intj=0;jnum;j++){Unit[i][j]=rand()%2;}}}voidhwj_fitness(intnum){//计算适应度floatsum;inttemp;for(inti=0;iNUMBER;i++){temp=1;sum=0.0;for(intj=num-1;j=0;j--){sum+=Unit[i][j]*temp;temp*=2.0;}Fitness[i]=sum*3/(temp-1.0)-1.0;//coutFitness[i];//cout--------------+++++;Fitness[i]=Fitness[i]*sin(10*3.1415926*Fitness[i])+2.0;//coutFitness[i]endl;}}inthwj_binary_search(intl,intr,floattemp){for(inti=0;iNUMBER;i++){if(temp=accumula_probability[i]&&tempaccumula_probability[i-1]){returni;}}return-1;}voidhwj_choose(){//选择个体floatsum=0.0;floattemp;inti;for(i=0;iNUMBER;i++){sum+=Fitness[i];}select_probability[0]=Fitness[0]/sum;temp=accumula_probability[0]=select_probability[0];for(i=1;iNUMBER;i++){select_probability[i]=Fitness[i]/sum;temp+=select_probability[i];accumula_probability[i]=temp;//coutaccumula_probability[i]endl;}for(i=0;iNUMBER;i++){//srand(time(NULL));temp=(rand()%1000000)/1000000.0;//couttemp;Number[i]=hwj_binary_search(0,NUMBER,temp);//coutNumber[i]endl;for(intj=0;jNUMBER;j++){Unit_choose[i][j]=Unit[Number[i]][j];}}}/*voidhwj_N_M(inta[],intb[],intN,intM){//从M个数中选N个不一样的数inti=1;srand(time(NULL));a[0]=rand()%M;b[a[0]]=1;while(i!=N){a[i]=rand()%M;if(b[a[i]]==0){i++;b[a[i]]=1;couta[i]endl;}}//couta[i]''b[a[i]]endl;}*/voidhwj_cross(intnum,floatcross){//交叉后的得到种群intnum_cross=NUMBER*cross;intk;//交叉点inti,j;if(num_cross%2!=0){num_cross=num_cross+1;}//需要交叉的个体数intcro[NUMBER];//被交叉的个体编号inttemp[NUMBER];//是否交叉数组一览for(i=0;iNUMBER;i++){cro[i]=-1;temp[i]=0;}//hwj_N_M(cro,temp,num_cross,NUMBER);srand(time(NULL));cro[0]=rand()%NUMBER;temp[cro[0]]=1;i=1;while(i!=num_cross){cro[i]=rand()%NUMBER;if(temp[cro[i]]==0){temp[cro[i]]=1;i++;}}//for(inti=0;iNUMBER;i++){//couttemp[i]cro[i]endl;//}//coutnum_crossendl;for(i=0;inum_cross/2;i++){srand(time(NULL));k=rand()%num;for(j=0;jnum;j++){if(j=k){Unit[i][j]=Unit_choose[cro[num_cross-i]][j];Unit[i+num_cross/2][j]=Unit_choose[cro[i]][j];}else{Unit[i]
本文标题:遗传算法求函数极值
链接地址:https://www.777doc.com/doc-3200387 .html