写在前面:考虑到该算法工程应用较多,这里先用Matlab语言讲解
PSO算法主要根据速度更新来更新当前位置,进而逼近最优解。
但是,PSO算法不能保证在解为序列时,序列解出现重复的情况。
这里以实例分析:
假设第i个粒子为x[i, :],size(x,2)即为序列长度
我们假设x[i, :] = [1,2,3,4,5]
设此时v[i, :] = [-2,2,1,-1,1]
更新后x[i, :] = x[i, :] + v[i, :] = [-1,4,4,3,6]
更新后的序列会出现大于5或者小于1且重复的情况
如何解决呢?
基本的想法是:
将更新速度大的序列中的元素先进行更新,更新后如果出现重复的情况,则替换重复元素。
遗传算法的交叉变异则提供了一种更好的替换思路。
附上核心代码:
初始化所有粒子
for i=1:m
x(i,:)=randperm(round(n)); %粒子位置,生成m个初始化序列,
end
F=fitness(x,X,Y,Z,D,S,C,T); %计算种群适应度
%xuhao=xulie(F) %最小适应度种群序号
a1=F(1);
a2=1;
for i=1:m
if a1>=F(i)
a1=F(i);
a2=i;
end
end
xuhao=a2;
Tour_pbest=x; %当前个体最优
Tour_gbest=x(xuhao,:) ; %当前全局最优路径
Pb=inf*ones(1,m); %个体最优记录
Gb=F(a2); %群体最优记录
xnew1=x;
N=1;
while N<=Nmax
%计算适应度
F=fitness(x,X,Y,Z,D,S,C,T);
for i=1:m
if F(i)<Pb(i)
Pb(i)=F(i); %将当前值赋给新的最佳值
Tour_pbest(i,:)=x(i,:); %将当前路径赋给个体最优路径
end
if F(i)<Gb
Gb=F(i);
Tour_gbest=x(i,:);
end
end
a1=Pb(1);
a2=1;
for i=1:m
if a1>=Pb(i)
a1=Pb(i);
a2=i;
end
end
nummin=a2;
Gb(N)=Pb(nummin); %当前群体最优长度
与个体最优进行交叉
for i=1:m
c1=round(rand*(n-2))+1; %在[1,n-1]范围内随机产生一个交叉位
c2=round(rand*(n-2))+1;
while c1==c2
c1=round(rand*(n-2))+1; %在[1,n-1]范围内随机产生一个交叉位
c2=round(rand*(n-