matlab练习程序(演化策略ES)还是这本书上的内容,不过我看演化计算这一章是倒着看的,这里练习的算法正好和书中介绍的顺序是相反的。演化策略是最古老的的演化算法之一,和上一篇DE算法类似,都是基于种群的随机演化产生最优解的算法。算法步骤如下:1.设定种群个体数和需要迭代的次数。2.选择父代中的个体按照公式z1=sqrt(-2*ln(u1))*sin(2*pi*u2)*m,z2=sqrt(-2*ln(u1))*cos(2*pi*u2)*m进行演化。这里u1,u2都是随机值,m是控制因子,演化次数越多m,m越小,父代通过与z1,z2相加得到后代。3.计算后代的适应性。4.选择后代中最优的适应性作为全局最优适应性。其实整个过程和DE非常类似。过程都是随机变异,求适应性,再找最优。我还试着将z1和z2横设为1,竟也能得到非常好的解。算法结果如下:matlab代码如下:main.mclearall;closeall;clc;[xy]=meshgrid(-100:100,-100:100);sigma=50;img=(1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2));%目标函数,高斯函数mesh(img);holdon;n=50;%种群个体的数量iter=100;%迭代次数%初始化种群,定义结构体par=struct([]);fori=1:npar(i).x=-100+200*rand();%个体的x特征在[-100100]随机初始化par(i).y=-100+200*rand();%个体的y特征在[-100100]随机初始化par(i).fit=compute_fit(par(i));%个体在[x,y]处的适应度endpar_best=par(1);%初始化种群中最佳个体fork=1:iter%迭代次数plot3(par_best.x+100,par_best.y+100,par_best.fit,'g*');%画出最佳个体的位置,+100为相对偏移[parpar_best]=select_and_recombin(par,par_best,n,k,iter);%差异演化函数Endselect_and_recombin.mfunction[next_parpar_best]=select_and_recombin(par,par_best,n,k,iter)mul=(iter-k)/iter;%限制进化因子,代数越高变异越小next_par=par;%新种群fori=1:n%产生变异随机数u1=rand();u2=rand();z1=sqrt(-2*log(u1))*sin(2*pi*u2)*mul;z2=sqrt(-2*log(u1))*cos(2*pi*u2)*mul;%变异next_par(i).x=par(i).x+z1;next_par(i).y=par(i).y+z2;%计算变异后个体的适应度next_par(i).fit=compute_fit(next_par(i));%如果新个体没有变异前个体适应度高,新个体还原为旧个体ifpar(i).fitnext_par(i).fitnext_par(i)=par(i);end%如果变异后适应度高于种群最高适应个体,则更新种群适应度最高个体ifnext_par(i).fitpar_best.fitpar_best=next_par(i);endendendcompute_fit.mfunctionre=compute_fit(par)x=par.x;y=par.y;sigma=50;ifx-100||x100||y-100||y100re=0;%超出范围适应度为0else%否则适应度按目标函数求解re=(1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2));endend