如果两者都是智能演化算法,都是具有突变、交叉、选择部分组成,原理都比较简单。
先看一下两者的原理:
差分进化原理伪代码(matlab):
%differential evolution algorithm
P=rand(Np,D) ;%初始化种群
for k=1:iter
r1=1;r2=1
for i=1:Np
while r1==r2||r1==i||r2==i
r1=ceil(rand(Np,D));
r1=ceil(rand(Np,D));
for j=1:D
v(i,j)=x(i,j)+F*(x(r1,j)-x(r2,j)); %突变
if rand(0,1)<Cr %交叉
u(i,j)=v(i,j);
else
u(i,j)=x(i,j);
end
if f(u(i,j))<f(x(i,j)) %选择
x(i,j)=u(i,j);
else
x(i,j)=x(i,j);
end
end
end
粒子群算法原理伪代码(matlab):
for i=1:N
for j=1:D
x=xmin+rand(N,D)*(xmax-xmin); %随机初始化位置
v=rand(N,D); %随机初始化速度
end
end
%------先计算各个粒子的适应度,并初始化Pi和Pg----------------------
for i=1:N
p(i)=fitness(x(i,:)); %计算初始粒子的适应度值
y(i,:)=x(i,:); %个体极值中的变量值等于粒子的初始值---为了后期进行保存全局最优值
end
pg=x(N,:); %Pg为全局最优值---将初始位置的最后一列元素赋给全局最优值---目的在于保存全局最优值
for i=1:(N-1)
if fitness(x(i,:)) <fitness(pg)
pg=x(i,:); %更新全局最优值,保存最优值
end
end
%------进入主要循环,按照公式依次迭代,直到满足精度要求------------
for t=1:M %做一个主循环,用于迭代
time(t)=t;
for i=1:N %更新速度、位移
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
if v(i,:)<xmin %做防止越界
v(i,:)=xmin;
end
if v(i,:)>xmax
v(i,:)=xmax;
end
x(i,:)=x(i,:)+v(i,:); %更新之后的点
if fitness(x(i,:))< p(i) %使用选择函数
p(i)=fitness(x(i,:));
y(i,:)=x(i,:);%更新个体极值
end
if p(i)<fitness(pg) %选择保存最优值
pg=y(i,:);
% pg=x(i,:);
end
end
Pbest(t)=fitness(pg); %将全局最优值赋给Pbest
end
从上可以看出,两者的不同之处不多,就基本上在突变和交叉方式上不同!
从编程上来看,两者都比较简单,在处理问题上,差分进化算法效果要强一点。