基于PSO粒子群优化算法的TSP路径规划matlab仿真

1.算法描述

粒子群优化算法(PSO),粒子群中的每一个粒子都代表一个问题的可能解, 通过粒子个体的简单行为,群体内的信息交互实现问题求解的智能性。


在求解TSP这种整数规划问题的时候, PSO显然与ACO不同, PSO需要对算法本身进行一定的修改, 毕竟PSO刚开始是应用在求解连续优化问题上的.


    在路径规划中,我们将每一条路径规划为一个粒子,每个粒子群群有 n 个粒 子,即有 n 条路径,同时,每个粒子又有 m 个染色体,即中间过渡点的个数,每 个点(染色体)又有两个维度(x,y),在代码中用 posx 和 posy 表示一个种群。 通过每一代的演化,对粒子群进行演化操作,选择合适个体(最优路径)。


最终算法伪代码如下:


初始化: 每个粒子获得一个随机解和一个随机的SS (命名为速度)


For 在位置 X_{id} 的所有粒子, 计算新的位置 X_{id}':


计算P_{id} 与 X_{id} 之间的差 A = P_{id} - X_{id}, 其中 A 为 BSS


计算B = P_{gd} - X_{id}, 其中 B 为 BSS


根据速度更新公式计算新的速度V_{id}', 并将 V_{id}' 转换为一个 BSS


计算新的解X_{id}' = X_{id} + V_{id} (也就是 V_{id} 作用在 X_{id} 上)


更新P_{id} 如果新的解更好


更新P_{gd} 若出现新的全局最好的解


2.matlab算法仿真效果

matlab2017b仿真结果如下:


3.MATLAB核心程序

%% 初始化所有粒子

for i=1:m

x(i,:)=randperm(n);  %粒子位置

end

F=fitness(x,C,D);         %计算种群适应度

%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,C,D);

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

%  nummin=xulie(Pb)           %最小适应度种群序号

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-2))+1;

end   

chb1=min(c1,c2);

chb2=max(c1,c2);

cros=Tour_pbest(i,chb1:chb2); %交叉区域矩阵

ncros=size(cros,2);       %交叉区域元素个数

%删除与交叉区域相同元素

for j=1:ncros

for k=1:n

if xnew1(i,k)==cros(j)

xnew1(i,k)=0;

for t=1:n-k

temp=xnew1(i,k+t-1);

xnew1(i,k+t-1)=xnew1(i,k+t);

xnew1(i,k+t)=temp;

end                 

end

end

end

xnew=xnew1;

%插入交叉区域

for j=1:ncros

xnew1(i,n-ncros+j)=cros(j);

end

%判断产生新路径长度是否变短

dist=0;

for j=1:n-1

dist=dist+D(xnew1(i,j),xnew1(i,j+1));

end

dist=dist+D(xnew1(i,1),xnew1(i,n));

if F(i)>dist

x(i,:)=xnew1(i,:);

end

%% 与全体最优进行交叉

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-2))+1;

end   

chb1=min(c1,c2);

chb2=max(c1,c2);

cros=Tour_gbest(chb1:chb2); %交叉区域矩阵

ncros=size(cros,2);       %交叉区域元素个数

%删除与交叉区域相同元素

for j=1:ncros

for k=1:n

if xnew1(i,k)==cros(j)

xnew1(i,k)=0;

for t=1:n-k

temp=xnew1(i,k+t-1);

xnew1(i,k+t-1)=xnew1(i,k+t);

xnew1(i,k+t)=temp;

end                 

end

end

end

xnew=xnew1;

%插入交叉区域

for j=1:ncros

xnew1(i,n-ncros+j)=cros(j);

end

%判断产生新路径长度是否变短

dist=0;

for j=1:n-1

dist=dist+D(xnew1(i,j),xnew1(i,j+1));

end

dist=dist+D(xnew1(i,1),xnew1(i,n));

if F(i)>dist

x(i,:)=xnew1(i,:);

end

%% 进行变异操作

c1=round(rand*(n-1))+1;   %在[1,n]范围内随机产生一个变异位

c2=round(rand*(n-1))+1;

temp=xnew1(i,c1);

xnew1(i,c1)=xnew1(i,c2);

xnew1(i,c2)=temp;

%判断产生新路径长度是否变短

dist=0;

for j=1:n-1

dist=dist+D(xnew1(i,j),xnew1(i,j+1));

end

dist=dist+D(xnew1(i,1),xnew1(i,n));

%dist=dist(xnew1(i,:),D);

if F(i)>dist

x(i,:)=xnew1(i,:);

end

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%  F=(x,C,D)         %计算种群适应度

%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;

L_best(N)=min(F);

Tour_gbest=x(xuhao,:);     %当前全局最优路径

N=N+1;

figure(1)

scatter(C(:,1),C(:,2));

hold on

plot([C(Tour_gbest(1),1),C(Tour_gbest(n),1)],[C(Tour_gbest(1),2),C(Tour_gbest(n),2)],'ms-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g')

for ii=2:n

plot([C(Tour_gbest(ii-1),1),C(Tour_gbest(ii),1)],[C(Tour_gbest(ii-1),2),C(Tour_gbest(ii),2)],'ms-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g')

end

hold off

figure(2)

plot(L_best);

%     set(findobj('tag','N'),'string',num2str(N-1));%当前迭代次数

%     set(findobj('tag','tour'),'string',num2str(Tour_gbest));%当前最优路径

%     set(findobj('tag','L'),'string',num2str(min(L_best)));%当前最优路径长度       %%%这里的L_best是当前最优路径???


end

for j=1:Nmax

if j==1

Nbest=1;

elseif L_best(j)<L_best(j-1)

Nbest=j;

end

end

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容