zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    java实现第八届蓝桥杯数位和
    java实现第八届蓝桥杯数位和
    java实现第八届蓝桥杯数位和
    java实现第八届蓝桥杯数位和
    java实现第八届蓝桥杯数位和
    java实现第九届蓝桥杯三角形面积
    java实现第九届蓝桥杯三角形面积
    java实现第九届蓝桥杯三角形面积
    JAVA中this的三种用法的详解
    JSON字符串转换为Map
  • 原文地址:https://www.cnblogs.com/tiandsp/p/3165388.html
Copyright © 2011-2022 走看看