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.m

clear all;close all;clc;

[x y]=meshgrid(-100:100,-100:100);
sigma=50;
img = (1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2)); %目标函数,高斯函数
mesh(img);
hold on;
n=50;       %种群个体的数量
iter=100;   %迭代次数

%初始化种群,定义结构体
par=struct([]);
for i=1:n
    par(i).x=-100+200*rand();       %个体的x特征在[-100 100]随机初始化
    par(i).y=-100+200*rand();       %个体的y特征在[-100 100]随机初始化
    par(i).fit=compute_fit(par(i));       %个体在[x,y]处的适应度
end
par_best=par(1);    %初始化种群中最佳个体

for k=1:iter     %迭代次数
    plot3(par_best.x+100,par_best.y+100,par_best.fit,'g*'); %画出最佳个体的位置,+100为相对偏移
    [par par_best]=select_and_recombin(par,par_best,n,k,iter);     %差异演化函数
end

select_and_recombin.m

function [next_par par_best]=select_and_recombin(par,par_best,n,k,iter)
    mul=(iter-k)/iter;  %限制进化因子,代数越高变异越小
    next_par=par;       %新种群
    for i=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));
        %如果新个体没有变异前个体适应度高,新个体还原为旧个体
        if par(i).fit>next_par(i).fit
            next_par(i)=par(i);
        end
        %如果变异后适应度高于种群最高适应个体,则更新种群适应度最高个体
        if next_par(i).fit>par_best.fit
            par_best=next_par(i);
        end
    end    
end

compute_fit.m

function re=compute_fit(par)
    x=par.x;
    y=par.y;
    sigma=50;
    if x<-100 || x>100 || y<-100 || y>100 
        re=0;        %超出范围适应度为0
    else            %否则适应度按目标函数求解
        re=(1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2)); 
    end
end

 

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
clear format long u=15; %个体数 %a=1.4; %a=1.6 %a=1.8; %a=2.0; %a=2.5; %a=3.0; %a=3.5; %a=4.0; %a=4.5; a=5.0; lemda=7.*u;% 扩充的个体数 x=rand(u,1); y=((exp(a.*x)-exp((-a).*x))./(exp(a.*x)+exp((-a).*x)))-x;%计算函数值 shizhi=1./(1+y.^2);%计算适应度值 f=zeros(u,1);%初始群体的适应度值空间 f=shizhi; ff=zeros(lemda,1);%经过重组、变异后的群体的适应度值空间 [maxf,index]=max(shizhi);%将最大的适应度值取出来 mbig=maxf(end); episilon=0.999999999; sigma=zeros(lemda,1); sigma(:,:)=3.0; r=1; r1=1; s=0; xx=zeros(lemda,1); while(mbig<episilon) %重组----任选两个个体第k1(:,1),k1(:,2)个 for i=1:lemda k1=floor(u*rand(lemda,2))+1; xx(i,1)=x(k1(i,1),1)*0.5+x(k1(i,2),1)*0.5;%对群体(群体为整数)进行黄金分割重组 Sigma(i,1)=sigma(k1(i,1),1)*0.5+sigma(k1(i,2),1)*0.5;%对标准差也进行黄金分割重组 end %突变 ra=2.*rand(lemda,1)-1; ra1=2.*rand(lemda,1)-1; Sigma=Sigma.*exp(r1.*ra1+r.*ra); xx=xx+Sigma.*ra;%扩充后的群体 for i=1:lemda if xx(i,1)1 xx(i,1)=rand(1,1); end end y1=((exp(a.*xx)-exp((-a).*xx))./(exp(a.*xx)+exp((-a).*xx)))-xx;%计算函数值 shizhi1=1./(1+y1.^2);%适应度值得大小 [maxff,index]=sort(shizhi1);%将最大的适应值取出来 mbig=maxff(end); %扩充后的最大的适应度 %下面选择最优的u个个体 x=xx(index(lemda-u+1:end),:);%从经过突变后的新个体中选取最优的u个个体作为下一代的初始群体 sigma=Sigma(index(lemda-u+1:end),:); x(end,1); s=s+1 end x(end) %取最优的系数解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值