差异演化和昨天实现的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;endpop_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); endendendfunction 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));endend
来源于:http://www.cnblogs.com/tiandsp/p/3159778.html