zoukankan      html  css  js  c++  java
  • 差异演化

    差异演化和昨天实现的PSO很类似,都属于优化算法。

    算法步骤:

    1.设定种群个体个数和需要迭代的次数。当然也可以设定条件,然后判断是否停止迭代。

    2.定义交叉概率CR,个体有一定概率进行变异,如果变异则进行第3步,如果不变异则下一代个体和当前个体一样。

    3.在种群中随机选出三个互不相同的个体进行变异,变异公式如下(有博士论文总结了一大堆变异公式):

    Xi,g+1=Xr1,g+F(Xr2,g-Xr3,g)

    其中X是种群中个体特征向量,这里就是x和y坐标。g是种群的代数。i代表当前个体,r1,r2,r3是和i不同,并且也互不相同的个体。

    4.计算变异后个体的适应度,如果变异后适应度不如变异前,那么将变异后个体重新恢复为变异前个体。

    5.比较变异后个体适应度和种群最优个体适应度,将适应度高的个体赋给种群最优个体。

    最后当然还是需要目标函数才能计算适应度。

    算法结果如下图,小绿点代表种群最优个体适应度:

    clc;
    clear all;
    close all;

    [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
    %% 初始化种群,定义结构体
    pop_size = 20;%种群个体的数量
    pop = struct([]);
    for i = 1:pop_size
    pop(i).x = -100 + 200*rand;
    pop(i).y = -100 + 200*rand;
    pop(i).fit = 0;
    end
    pop_best = pop(1);
    p1 = plot3(pop(1).x +100,pop(1).y +100,pop(1).fit,'k.','markersize',20);
    for itervater = 1:1000;
    set(p1,'xdata',pop_best.x +100,'ydata',pop_best.y+100,'zdata',pop_best.fit);
    drawnow
    pause(.1)
    [pop,pop_best] = select_and_combine(pop,pop_best,pop_size);
    end

    function [pop,pop_best] = select_and_combine(pop,pop_best,pop_size)
    a = 0.5;%加速因子
    pr = 0.8;%变异率
    new_pop = pop;%新种群
    for i = 1:pop_size
    % while 1
    % r1 = floor(1 + 20*rand);
    % r2 = floor(1 + 20*rand);
    % r3 = floor(1 + 20*rand);
    % if r1~= i && r2 ~= i && r3~=i...
    % r1~= r2 && r2 ~= r3 && r1 ~= r3;
    % break;
    % end
    % end
    tem = randperm(pop_size);
    r1 = tem(1);
    r2 = tem(2);
    r3 = tem(3);
    if rand < pr
    new_pop(i).x = pop(r1).x + a*(pop(r2).x - pop(r3).x);
    new_pop(i).y = pop(r1).y + a*(pop(r2).y - pop(r3).y);
    end
    new_pop(i).fit = compute_fit(new_pop(i));
    if pop(i).fit > new_pop(i).fit
    new_pop(i) = pop(i);
    end
    if new_pop(i).fit > pop_best.fit
    pop_best = new_pop(i);
    end
    end
    end

    function re = compute_fit(pop)
    x = pop.x;
    y = pop.y;
    sigma = 50;
    if x < -100 || x>100|| y < -100 || y > 100
    re =0;
    else
    re =(1/(2*pi*sigma^2))*exp(-(x.^2 + y.^2)/(2*sigma^2));
    end
    end

    来源于:http://www.cnblogs.com/tiandsp/p/3159778.html

  • 相关阅读:
    WAMP环境下访问PHP提示下载PHP文件
    安装CMS遇到php5.3的问题
    Win2003打不开https的问题
    查看服务器硬件信息
    添加删除程序无法安装IIS 提示没法加载模块
    Spring Autowiring by AutoDetect
    Spring Autowiring by Constructor
    Spring Autowiring by Name
    Spring Autowiring by Type
    Spring Auto-Wiring Beans
  • 原文地址:https://www.cnblogs.com/Kermit-Li/p/4051167.html
Copyright © 2011-2022 走看看