matlab练习程序(差别演化DE)

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

虽然代码不彻底,不过缺乏的部分彻底能够本身补完。算法

差别演化和昨天实现的PSO很相似,都属于优化算法。函数

算法步骤:优化

1.设定种群个体个数和须要迭代的次数。固然也能够设定条件,而后判断是否中止迭代。人工智能

2.定义交叉几率CR,个体有必定几率进行变异,若是变异则进行第3步,若是不变异则下一代个体和当前个体同样。spa

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

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

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

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

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
相关文章
相关标签/搜索