本文件的目的是减少您打字的烦恼%主程序:用遗传算法求解y=200*exp(-0.05*x).*sin(x)在[-22]区间上的最大值clc;clearall;closeall;globalBitLengthglobalboundsbeginglobalboundsendbounds=[-22];%一维自变量的取值范围precision=0.0001;%运算精度boundsbegin=bounds(:,1);boundsend=bounds(:,2);%计算如果满足求解精度至少需要多长的染色体BitLength=ceil(log2((boundsend-boundsbegin)'./precision));popsize=50;%初始种群大小Generationnmax=12;%最大代数pcrossover=0.90;%交配概率pmutation=0.09;%变异概率%产生初始种群population=round(rand(popsize,BitLength));%计算适应度,返回适应度Fitvalue和累积概率cumsump[Fitvalue,cumsump]=fitnessfun(population);Generation=1;whileGeneration<Generationnmax+1forj=1:2:popsize%选择操作seln=selection(population,cumsump);%交叉操作scro=crossover(population,seln,pcrossover);scnew(j,:)=scro(1,:);scnew(j+1,:)=scro(2,:);%变异操作smnew(j,:)=mutation(scnew(j,:),pmutation);smnew(j+1,:)=mutation(scnew(j+1,:),pmutation);endpopulation=smnew;%产生了新的种群%计算新种群的适应度[Fitvalue,cumsump]=fitnessfun(population);%记录当前代最好的适应度和平均适应度[fmax,nmax]=max(Fitvalue);fmean=mean(Fitvalue);ymax(Generation)=fmax;ymean(Generation)=fmean;%记录当前代的最佳染色体个体x=transform2to10(population(nmax,:));%自变量取值范围是[-22],需要把经过遗传运算的最佳染色体整合到[-22]区间xx=boundsbegin+x*(boundsend-boundsbegin)/(power((boundsend),BitLength)-1);xmax(Generation)=xx;Generation=Generation+1;endGeneration=Generation-1;%显示结果Bestpoplation=xxBesttargetfunvalue=targetfun(xx)%绘制经过遗传运算后的适应度曲线。一般的,如果进化过程中种群的平均适应度与最大适应度在曲线上有相互%趋同的形态,表示算法收敛进行的很顺利,没有出现震荡;在这种前提下,最大适应度个体连续若干代都没有发生进化表明种群已经成熟%作图figure(1);hand1=plot(1:Generation,ymax);set(hand1,'linestyle','-','linewidth',1.8,'marker','*','markersize',6)holdon;hand2=plot(1:Generation,ymean);set(hand2,'color','r','linestyle','-','linewidth',1.8,'marker','h','markersize',6)xlabel('进化代数');ylabel('最大/平均适应度');xlim([1Generationnmax]);legend('最大适应度','平均适应度');boxoff;holdoff;%子程序:新种群交叉操作,函数名称存储为crossover.mfunctionscro=crossover(population,seln,pc);BitLength=size(population,2);pcc=IfCroIfMut(pc);%根据交叉概率决定是否进行交叉操作,1则是,0则否ifpcc==1chb=round(rand*(BitLength-2))+1;%在[1,BitLength-1]范围内随机产生一个交叉位scro(1,:)=[population(seln(1),1:chb)population(seln(2),chb+1:BitLength)];scro(2,:)=[population(seln(2),1:chb)population(seln(1),chb+1:BitLength)];elsescro(1,:)=population(seln(1),:);scro(2,:)=population(seln(2),:);end%子程序:计算适应度函数,函数名称存储为fitnessfunfunction[Fitvalue,cumsump]=fitnessfun(population);globalBitLengthglobalboundsbeginglobalboundsendpopsize=size(population,1);%有popsize个个体fori=1:popsizex=transform2to10(population(i,:));%将二进制转化为十进制%转化为[-22]区间的实数xx=boundsbegin+x*(boundsend-boundsbegin)/(power((boundsend),BitLength)-1);Fitvalue(i)=targetfun(xx);%计算函数值,即适应度end%给适应度函数加上一个大小合理的数以便保证种群适应值为正数Fitvalue=Fitvalue'+230;%计算选择概率fsum=sum(Fitvalue);Pperpopulation=Fitvalue/fsum;%计算累积概率cumsump(1)=Pperpopulation(1);fori=2:popsizecumsump(i)=cumsump(i-1)+Pperpopulation(i);endcumsump=cumsump';%子程序,新种群变异操作,函数名称存储为mutation.mfunctionsnnew=mutation(snew,pmutation);BitLength=size(snew,2);snnew=snew;pmm=IfCroIfMut(pmutation);%根据变异概率决定是否进行变异操作,1则是,0则否ifpmm==1chb=round(rand*(BitLength-1))+1;%在[1,BitLength]范围内随机产生一个变异位snnew(chb)=abs(snew(chb)-1);end%子程序:判断遗传运算是否进行交叉或变异,函数名称存储为IfCroIfMut.mfunctionpcc=IfCroIfMut(mutORcro);test(1:100)=0;l=round(100*mutORcro);test(1:1)=1;n=round(rand*99)+1;pcc=test(n);%子程序:新种群选择操作,函数名称存储为selection.mfunctionseln=selection(population,cumsump);%从种群中选择两个个体fori=1:2r=rand;%产生一个随机数prand=cumsump-r;j=1;whileprand(j)<0j=j+1;endseln(i)=j;%选中个体的序号end%子程序:将二进制数转换为十进制数,函数名称存储为transform2to10.mfunctionx=transform2to10(Population);BitLength=size(Population,2);x=Population(BitLength);fori=1:BitLength-1x=x+Population(BitLength-i)*power(2,i);end%子程序:对于优化最大值或极大值函数问题,目标函数可以作为适应度函数%函数名称存储为targetfun.mfunctiony=targetfun(x);%目标函数y=200*exp(-0.05*x).*sin(x);