实验利用遗传算法进行函数优化一、实验目的1了解及掌握遗传算法的基本操作2利用遗传算法解决实际问题3熟悉MATLAB编程语言二、实验内容编写一个基于遗传算法的函数寻优程序,完成如下任务:1、在区间[-1,2]上搜索函数f1=x*sin(10πx)+2的最大值。2、搜索函数f2=x12+x22的最小值(其中,-5.12x1,x25.12)程序由选择、交叉和变异三个遗传操作及群体更新等主要算法模块以及随机函数发生器、译码、适应度评估模块组成。程序输入参数为群体规模、染色体长度,交叉概率,变异概率等。其中,群体规模的取值范围为2—100之间的任意偶数,染色体长度取不大于64的整数,交叉概率和变异概率的取值范围为[0,1]。输出数据包括每代最优个体码串、译码值、目标函数值以及用图形显示逐渐逼近最优解的过程。三、实验原理遗传算法模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止。四、程序与运行结果第一题:figure(1);fplot('variable.*sin(10*pi*variable)+2.0',[-1,2]);%画出函数曲线%定义遗传算法参数NIND=40;%个体数目MAXGEN=25;%最大遗传代数PRECI=20;%变量的二进制位数GGAP=0.9;%代沟trace=zeros(2,MAXGEN);%寻优结果的初始值FieldD=[20;-1;2;1;0;1;1];%区域描述器Chrom=crtbp(NIND,PRECI);%初始种群gen=0;%代计数器variable=bs2rv(Chrom,FieldD);%计算初始种群的十进制转换ObjV=variable.*sin(10*pi*variable)+2.0;%计算目标函数值whilegenMAXGENFitnV=ranking(-ObjV);%分配适应度值SelCh=select('sus',Chrom,FitnV,GGAP);%选择SelCh=recombin('xovsp',SelCh,0.7);%重组SelCh=mut(SelCh);%变异variable=bs2rv(SelCh,FieldD);%子代个体的十进制转换ObjVSel=variable.*sin(10*pi*variable)+2.0;%计算子代的目标函数值[ChromObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);%重新插入子代的新种群variable=bs2rv(Chrom,FieldD);gen=gen+1;%代计数器增加%输出最优解及其序号,并在目标函数图像中标出,Y为最优解,I为种群的序号[Y,I]=max(ObjV);holdon;plot(variable(I),Y,'bo');trace(1,gen)=max(ObjV);%遗传算法性能跟踪trace(2,gen)=sum(ObjV)/length(ObjV);endvariable=bs2rv(Chrom,FieldD);%最优个体的十进制转换holdon,grid;plot(variable,ObjV,'b*');figure(2);holdon;plot(trace(2,:),'-.');gridlegend('解的变化','种群均值的变化')最后寻优结果为:x=1.8505,f(x)=3.8503第二题:functionresult=zuoye23(Size,umin,umax,pc,pm,e)clc;clear;tic;Size=80;G=100;CodeL=10;umax=5.12;umin=-5.12;E=round(rand(Size,3*CodeL));fork=1:1:Gtime(k)=k;fors=1:1:Sizem=E(s,:);y1=0;y2=0;m1=m(1:1:CodeL);fori=1:1:CodeLy1=y1+m1(i)*2^(i-1);endx1=(umax-umin)*y1/1023+umin;m2=m(CodeL+1:1:2*CodeL);fori=1:1:CodeLy2=y2+m2(i)*2^(i-1);endx2=(umax-umin)*y2/1023+umin;F(s)=x1^2+x2^2;endBestJ(k)=min(F);fi=F;%适应度函数[Oderfi,Indexfi]=sort(fi);%按照适应度大小排序Bestfi=Oderfi(1);%Oderfi中最后一个即是最大的适应度BestS=E(Indexfi(1),:);%记录每一代中最优个体的0-1编码bfi(k)=Bestfi;%记录每一代中最优个体的适应度%******Step2:选择与复制******fi_sum=sum(fi);fi_Size=(Oderfi/fi_sum)*Size;%按照适应度大小排序fi_S=floor(fi_Size);%对80个个体依据相对适应度进行划分等级kk=1;fori=1:1:Sizeforj=1:1:fi_S(i)%选择等级高的个体,等级越高被选次数越多TempE(kk,:)=E(Indexfi(i),:);kk=kk+1;%选择进入下一代个体的个数,显然不够80个个体endend%************Step3:交叉操作********pc=0.60;n=ceil(20*rand);fori=1:2:(Size-1)temp=rand;ifpctemp%交叉条件TempE(i,n:end)=E(i+1,n:end);TempE(i+1,n:end)=E(i,n:end);endendTempE(Size,:)=BestS;%最优个体E=TempE;%种群替换%************Step4:变异操作************%pm=0.001;%pm=0.001-[1:1:Size]*(0.001)/Size;%自适应变异概率%pm=0.0;%没有变异pm=0.1;%较大的变异概率fori=1:1:Sizeforj=1:1:2*CodeLtemp=rand;ifpmtemp%变异条件ifTempE(i,j)==0TempE(i,j)=1;elseTempE(i,j)=0;endendendendTempE(Size,:)=BestS;E=TempE;%种群替换end%x1=-1:0.01:2;%x2=-1:0.01:2;[x1,x2]=meshgrid(-5.12:0.01:5.12,-5.12:0.01:5.12);k=x1.^2+x2.^2;surf(x1,x2,k)%fplot('x1.^2+x2.^2',[ab]);holdonplot3(TempE,TempE,BestS,'TempE*');holdoffxlabel('x');ylabel('BestS');[BestSindex]=min(BestS);%计算大值及其位置result=[TempE(index)TempE(index)BestS];%返回优化结果寻优结果为:min()fx=4.2550五、总结本实验主要是要求以matlab为实验平台,采用遗传算法求解一个简单的目标最小化函数,程序运行的最终结果表明,遗传算法能够无限的接近于计算出一个最优解。本实验中所设计的程序采用了改进的遗传算法,不仅加快了算法的收敛速度,同时依旧保持了种群的多样性,保证算法能够找到最优解。遗传算法只是一种求解手段,本实验的主要目的是为了让我们通过设计一个遗传算法程序,以达到比较熟练使用matlab撰写程序的效果。在编写程序的过程中,我体会到了matlab是一种很好的数值计算软件。它的语言简洁易懂,十分容易掌握;matlab有比较完善的纠错机制,方便我们对程序进行调试;另外,matlab的计算能力十分强大,运算速度非常快。当然,matlab也有十分强大的绘图本领,同时有许多专门的工具箱供不同学科的人直接使用。这些都是matlab十分显著的优点。通过本次实验,我学习到了很多,收获很多,这些无疑会对我未来的学习带来极大的帮助。