差异演化

差异演化和昨天实现的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

原文地址:https://www.cnblogs.com/Kermit-Li/p/4051167.html