zoukankan      html  css  js  c++  java
  • matlab练习程序(差异演化DE)

    这两天在看M.Tim Jones的《人工智能》,书中不只介绍原理,而且都有相应的c代码实现。

    虽然代码不完全,不过缺少的部分完全可以自己补完。

    差异演化和昨天实现的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.比较变异后个体适应度和种群最优个体适应度,将适应度高的个体赋给种群最优个体。

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

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

    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=20;   %种群个体的数量
    
    %初始化种群,定义结构体
    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=0;               %个体适应度为0初始化
    end
    par_best=par(1);    %初始化种群中最佳个体
    
    for k=1:100     %迭代次数
        plot3(par_best.x+100,par_best.y+100,par_best.fit,'g*'); %画出最佳个体的位置,+100为相对偏移
        [par par_best]=select_and_recombine(par,par_best,n);     %差异演化函数
    end

    select_and_recombine.m

    function [next_par par_best]=select_and_recombine(par,par_best,n)
        F=0.5;          %加速因子
        CR=0.8;         %变异率
        next_par=par;   %新种群
        for i=1:n
            
            while 1         %在原种群中任选三个互不相同的个体进行交叉变异
                r1=floor(1+20*rand());
                r2=floor(1+20*rand());
                r3=floor(1+20*rand());
                if i~=r1 && i~=r2 && i~=r3 &&...
                   r1~=r2 && r1~=r3 && r2~=r3
                    break;
                end
            end
                         
            if rand()<CR    %变异率,可以对每一个特征分别设置,我这里要变一起变了
                next_par(i).x=par(r1).x+F*(par(r2).x-par(r3).x);    %交叉变异准则
                next_par(i).y=par(r1).y+F*(par(r2).y-par(r3).y);              
            end
            
            %计算变异后个体的适应度
            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
  • 相关阅读:
    第8章 传输层(4)_可靠传输
    第8章 传输层(3)_TCP协议
    第8章 传输层(2)_UDP协议
    第8章 传输层(1)_TCP/UDP协议的应用场景
    【Sqlsever系列】日期和时间
    【SqlServer系列】聚合函数
    【Sqlserver系列】CAST和CONVERT
    【SqlServer系列】AS的用法
    【博客目录】SqlServer篇
    【SqlServer系列】集合运算
  • 原文地址:https://www.cnblogs.com/tiandsp/p/3159778.html
Copyright © 2011-2022 走看看