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

150 阅读4分钟

1.算法描述

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

 

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

 

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

1.png

最终算法伪代码如下:

 

初始化: 每个粒子获得一个随机解和一个随机的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仿真结果如下:

2.png

3.png 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`