基于PSO的最优路径优化仿真,带GUI界面,可以设置粒子数目,迭代次数,优化目标,输出最优解和最优路径

112 阅读4分钟

1.算法描述

        PSO从这种模型中得到启示并用于解决优化问题。PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitnessvalue),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。

 

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

 

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

 

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

 

d04be00acba7e734c4f28125d2b7307e_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.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.仿真效果预览

matlab2022a仿真结果如下:

 

ca287b858b3539c1d07624c1ed5f6549_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

  38c767676ce5c864fc5d7a2e5bf14f6b_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

3.MATLAB核心程序 `%  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;`