基于改进连续蚁群优化多个无人地面车辆路径规划研究(Matlab代码实现)

👨‍🎓个人主页:研学社的博客   

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

本文提出了一种基于蚁群的连续多UGV路径规划,该规划器由UGV路径规划和多UGV协调组成。该文提出一种基于概率的随机游走策略和自适应航点修复机制的连续蚁群优化,以优化每个UGV的路径。然后通过速度偏移优化算法解决多智能体协调问题UGV之间的碰撞避免问题。

路径规划最为基本的要求是规划一条从起始点到目标点的无碰撞路线并在执行过程中动态避障,在此基础上规划的路径尽量考虑动力学约束与动能的消耗和效率问题。

📚2 运行结果

 

部分代码:


% ParticleSwarm: (Dimension, SwarmSize)
function FitValue=SingleCostFunction(ParticleSwarm, ModelInfor, AgentIndex)

%AgentIndex=1;
%flag_collisionUAV=0;  % 0 do not calculate the collision among UAVs; 1 otherwise
flag_threat=0; % one way to calculate it
[Dimension, SwarmSize]=size(ParticleSwarm); % Dimension is the number of waypoints
X=ModelInfor.x; % Dimension, AgentNumber
[~, AgentNumber]=size(X);
if AgentNumber==1   % means the coordinate system has been transformed for each agent
    AgentIndex=1;
end
Y=ModelInfor.y; % Dimension, AgentNumber, the y axis of waypoints of all agents
SX=X(:,AgentIndex);
Threat=ModelInfor.Threat;
Obstacle=ModelInfor.Obstacle;
Task=ModelInfor.Task;
Penalty=3;
%TimeSafe=0.1;
%Velocity=10;
%d_safe=1;

if Task(5)<=100
    MaximumLength=300;
else
    MaximumLength=500;
end
    
StartPoint=Task(AgentIndex,1:2);
TargetPoint=Task(AgentIndex,3:4);
ST=dist(StartPoint, TargetPoint');  % the length of the straight line connencting the starting point and the target point

for i=1: SwarmSize
   SY=ParticleSwarm(:, i);
   if ~isreal (SY)
       SY=real(SY);
       %FitValue(i)=nan;
       %break;
   end
   Waypoints=[SX SY];
   Path=[StartPoint; SX SY; TargetPoint]; % (D+2,2)  the path of the UAV 
   
   %% Calculate the cost associated with the total length \in [0,1]
   d=Path(2:Dimension+2,:)-Path(1:Dimension+1,:);
   PathLength=sum((sum(d.*d,2)).^0.5);
   CLength=1-(ST/PathLength);
   
   %% Calculate the cost associated with turning \in [0,1] 
   for ii=2:Dimension+1
       %Theta=d(ii,:)*d(ii-1,:)'/(d(ii,:)*d(ii,:)'^0.5)*((d(ii,:)*d(ii,:)'^0.5));
       turning(ii-1)=dot(d(ii,:),d(ii-1,:))/(norm(d(ii,:))*norm(d(ii-1,:)));
   end
   CTurning=(1-mean(turning))/2;  
   
    %% Calculate the cost associated with the threats \in [0,1] 
    if  ~isempty (Threat) 
       [n, ~]=size(Threat);  % n: the number of Threats 
       dThreat=pdist2(Path, Threat(:,1:2)); %dd(i,j) is the distance between i (D+2) point and j Threat
       dDanger=0;
       for j=1:n  % for each Threat
           for k=2:Dimension+2  % for each point. Note: the start point is collision free
              x1=Path(k-1,1); y1=Path(k-1,2);
              x2=Path(k,1); y2=Path(k,2);
              x3=Threat(j,1);y3=Threat(j,2);r=Threat(j,3);
              A=(x2-x1)^2+(y2-y1)^2; %A>0
              B=2*((x2-x1)*(x1-x3)+(y2-y1)*(y1-y3));
              C=x3^2+y3^2+x1^2+y1^2-2*(x3*x1+y3*y1)-r^2;
              delta=B^2-4*A*C;

              if delta<=0 %&& dThreat(k,j)>=Threat(j,3)
                  % do nothing, no intersection
              else
                  mu1=(-B+delta^0.5)/(2*A); mu2=(-B-delta^0.5)/(2*A); % mu2<mu1
                  x_int1=x1+mu1*(x2-x1); y_int1= y1+mu1*(y2-y1);   % the point of intersection
                  x_int2=x1+mu2*(x2-x1); y_int2= y1+mu2*(y2-y1);
                  if dThreat(k,j)>=Threat(j,3) % x2 the point is outside the Threat
                     if dThreat(k-1,j)>=Threat(j,3)
                         if (mu1<1 && mu1>0 ) && (mu2<1 && mu2>0)
                         d=((x_int1-x_int2)^2+(y_int1-y_int2)^2)^0.5;
                         dDanger=dDanger+d;
                         else
                             % do nothing
                         end
                     else
                         d=((x1-x_int1)^2+(y1-y_int1)^2)^0.5;
                         dDanger=dDanger+d;
                     end
                  else
                     if dThreat(k-1,j)>=Threat(j,3)
                         d=((x2-x_int2)^2+(y2-y_int2)^2)^0.5;
                         dDanger=dDanger+d;
                     else
                         d=A^0.5;
                         dDanger=dDanger+d;
                     end
                  end

              end

           end
       end
       if dDanger>0
           CDanger=dDanger/PathLength;
       else
           CDanger=0;
       end

       if CDanger>1
           CDanger=1;
       end
    else
        CDanger=0;
    end
   
    %% Another way to calculate the cost associated with the threats \in [0,1]
    if flag_threat==1  
    if ~isempty (Threat)
       [m, ~]=size(Threat);  % m: the number of threats 
       dThreat=pdist2(Path, Threat(:,1:2)); % dThreat(i,j) is the distance between i (D+2) point and j threat

       for j=1:m  % for each threat
           for k=2:Dimension+2  % for each point/line segment
              if dThreat(k,j)<=Threat(j,3) 
                   if dThreat(k-1,j)<=Threat(j,3)  % the segment is in the circle
                       TS(k)=norm(Path(k,:)-Path(k-1,:));
                   else                            % intersect 
                       x1=Path(k-1,1); y1=Path(k-1,2);
                       x2=Path(k,1); y2=Path(k,2);
                       x3=Threat(j,1);y3=Threat(j,2);r=Threat(j,3);
                       A=(x2-x1)^2+(y2-y1)^2;
                       B=2*((x2-x1)*(x1-x3)+(y2-y1)*(y1-y3));
                       C=x3^2+y3^2+x1^2+y1^2-2*(x3*x1+y3*y1)-r^2;
                       delta=B^2-4*A*C;
                       mu1=(-B+delta^0.5)/(2*A); mu2=(-B-delta^0.5)/(2*A);
                       if  0<=mu1&& mu1<=1
                           TS(k)=norm(Path(k,:)-Path(k-1,:))*(1-mu1);
                       else
                           if  0<=mu2 && mu2<=1
                               TS(k)=norm(Path(k,:)-Path(k-1,:))*(1-mu2);
                           else
                               TS(k)=0;
                           end
                       end

                   end
              else 
                  if dThreat(k-1,j)<=Threat(j,3)   % intersect
                      x1=Path(k-1,1); y1=Path(k-1,2);
                      x2=Path(k,1); y2=Path(k,2);
                      x3=Threat(j,1);y3=Threat(j,2);r=Threat(j,3);
                      A=(x2-x1)^2+(y2-y1)^2;
                      B=2*((x2-x1)*(x1-x3)+(y2-y1)*(y1-y3));
                      C=x3^2+y3^2+x1^2+y1^2-2*(x3*x1+y3*y1)-r^2;
                      delta=B^2-4*A*C;
                      mu1=(-B+delta^0.5)/(2*A); mu2=(-B-delta^0.5)/(2*A);
                      if  0<=mu1&& mu1<=1
                           TS(k)=norm(Path(k,:)-Path(k-1,:))*mu1;
                       else
                           if  0<=mu2 && mu2<=1
                               TS(k)=norm(Path(k,:)-Path(k-1,:))*mu2;
                           else
                               TS(k)=0;
                           end
                       end
                  else
                      x1=Path(k-1,1); y1=Path(k-1,2);
                      x2=Path(k,1); y2=Path(k,2);
                      x3=Threat(j,1);y3=Threat(j,2);r=Threat(j,3);
                      A=(x2-x1)^2+(y2-y1)^2;
                      B=2*((x2-x1)*(x1-x3)+(y2-y1)*(y1-y3));
                      C=x3^2+y3^2+x1^2+y1^2-2*(x3*x1+y3*y1)-r^2;
                      delta=B^2-4*A*C;
                      if delta<=0      % no intersection
                          TS(k)=0;
                      else             % two intersections 
                          mu1=(-B+delta^0.5)/(2*A); mu2=(-B-delta^0.5)/(2*A);
                         TS(k)=norm(Path(k,:)-Path(k-1,:))*(mu1-mu2);
                      end
                  end
              end
           end
       end
       CDanger=sum(TS)/sum(Threat(:,3));
       if CDanger>1
           CDanger=1;
       end
    else
        CDanger=0;
    end
    end
   

   %% Calculate the cost associated with the collision with obstacles \in [p,p+1]
   [n, ~]=size(Obstacle);  % n: the number of obstacles 
   dObstacle=pdist2(Path, Obstacle(:,1:2)); %dd(i,j) is the distance between i (D+2) point and j obstacle
   dCollision=0;
   for j=1:n  % for each obstacle
       for k=2:Dimension+2  % for each point. Note: the start point is collision free
          %if dObstacle(k,j)<Obstacle(j,3)
          %     Collision=Collision+1;
          %else 
          x1=Path(k-1,1); y1=Path(k-1,2);
          x2=Path(k,1); y2=Path(k,2);
          x3=Obstacle(j,1);y3=Obstacle(j,2);r=Obstacle(j,3);
          A=(x2-x1)^2+(y2-y1)^2; %A>0
          B=2*((x2-x1)*(x1-x3)+(y2-y1)*(y1-y3));
          C=x3^2+y3^2+x1^2+y1^2-2*(x3*x1+y3*y1)-r^2;
          delta=B^2-4*A*C;
          
          if delta<=0 %&& dObstacle(k,j)>=Obstacle(j,3)
              % do nothing, no intersection
          else
              mu1=(-B+delta^0.5)/(2*A); mu2=(-B-delta^0.5)/(2*A); % mu2<mu1
              x_int1=x1+mu1*(x2-x1); y_int1= y1+mu1*(y2-y1);   % the point of intersection
              x_int2=x1+mu2*(x2-x1); y_int2= y1+mu2*(y2-y1);
              if dObstacle(k,j)>=Obstacle(j,3) % x2 the point is outside the obstacle
                 if dObstacle(k-1,j)>=Obstacle(j,3)
                     if (mu1<1 && mu1>0 ) && (mu2<1 && mu2>0)
                     d=((x_int1-x_int2)^2+(y_int1-y_int2)^2)^0.5;
                     dCollision=dCollision+d;
                     else
                         % do nothing
                     end
                 else
                     d=((x1-x_int1)^2+(y1-y_int1)^2)^0.5;
                     dCollision=dCollision+d;
                 end
              else
                 if dObstacle(k-1,j)>=Obstacle(j,3)
                     d=((x2-x_int2)^2+(y2-y_int2)^2)^0.5;
                     dCollision=dCollision+d;
                 else
                     d=A^0.5;
                     dCollision=dCollision+d;
                 end
              end    
          end
       end
   end
   if dCollision>0
       CCollision=Penalty*(1+dCollision); %/PathLength; !!!!
   else
       CCollision=0;
   end
   
    
   %% Calculate the cost associated with the fuel represented by fly length \in [p,p+1]
   if PathLength<=MaximumLength
       CFuel=0;
   else
       CFuel=Penalty+(PathLength-MaximumLength)/MaximumLength;
   end
   
   FitValue(i)=CLength+CDanger+CTurning+ CCollision+CFuel;
   
end

end

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]Jing Liu, Sreenatha Anavatti, Matthew Garratt, Hussein A. Abbass (2022) Modified Continuous Ant Colony Optimisation for Multiple Unmanned Ground Vehicle Path Planning

[2]霍志会. 基于强化学习的UGV在复杂环境下的路径探索关键技术研究[D].浙江科技学院,2022.DOI:10.27840/d.cnki.gzjkj.2022.000299.

🌈4 Matlab代码实现

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
1. 改进蚁群算法的启发式函数,使其更加适应三维环境下的路径规划。例如,可以考虑引入高度信息,以确保路径不会穿过障碍物上方或下方。 2. 优化蚁群算法的参数设置,包括蚁群数量、信息素挥发率、信息素更新速率等,以提高算法的收敛速度和解的质量。 3. 引入局部搜索策略,使算法能够更好地适应局部最优解。例如,可以在蚂蚁到达某个节点后,对其周围的局部区域进行搜索,以发现更好的路径。 4. 将蚁群算法与其他优化算法进行结合,以进一步提高路径规划的效果。例如,可以将蚁群算法与遗传算法或模拟退火算法进行结合,以实现更好的全局搜索能力。 以下是使用MATLAB实现三维路径规划代码示例: ```matlab % 初始化参数 nAnts = 50; % 蚂蚁数量 nNodes = 100; % 节点数量 nIter = 100; % 迭代次数 alpha = 1; % 信息素重要程度因子 beta = 2; % 启发函数重要程度因子 rho = 0.5; % 信息素挥发率 Q = 100; % 信息素增量常数 xMin = 0; % x坐标最小值 xMax = 100; % x坐标最大值 yMin = 0; % y坐标最小值 yMax = 100; % y坐标最大值 zMin = 0; % z坐标最小值 zMax = 100; % z坐标最大值 % 生成随机节点 nodes = [xMin + (xMax-xMin)*rand(nNodes,1), yMin + (yMax-yMin)*rand(nNodes,1), zMin + (zMax-zMin)*rand(nNodes,1)]; % 初始化信息素矩阵 pheromones = ones(nNodes, nNodes); % 初始化最优路径和距离 bestPath = []; bestDist = Inf; % 开始迭代 for iter = 1:nIter % 初始化蚂蚁位置和已经访问的节点 antPos = ones(nAnts,1); visitedNodes = zeros(nAnts, nNodes); visitedNodes(:,1) = 1; % 计算启发函数 eta = 1./pdist2(nodes,nodes).^beta; eta(eta==Inf) = 0; % 模拟蚂蚁行走过程 for i = 2:nNodes % 计算每只蚂蚁从当前节点到下一个节点的概率 prob = pheromones(antPos,:).^alpha .* eta(antPos,:) .^ beta; prob(:,visitedNodes) = 0; prob = prob ./ sum(prob,2); % 选择下一个节点 nextNode = arrayfun(@(x) randsample(1:nNodes,1,true,prob(x,:)), 1:nAnts)'; % 更新已经访问过的节点和蚂蚁的位置 visitedNodes(:,nextNode) = 1; antPos = nextNode; end % 计算每只蚂蚁的路径长度 dist = arrayfun(@(x) sum(pdist(nodes([1; visitedNodes(x,:)>0],:))), 1:nAnts)'; % 更新最优路径和距离 [minDist, idx] = min(dist); if minDist < bestDist bestDist = minDist; bestPath = [1; visitedNodes(idx,:)'* (1:nNodes)']; end % 更新信息素矩阵 deltaPheromones = zeros(nNodes, nNodes); for i = 1:nAnts for j = 1:nNodes-1 deltaPheromones(visitedNodes(i,j), visitedNodes(i,j+1)) = deltaPheromones(visitedNodes(i,j), visitedNodes(i,j+1)) + Q/dist(i); end end pheromones = (1-rho) * pheromones + deltaPheromones; end % 可视化最优路径 figure; plot3(nodes(:,1),nodes(:,2),nodes(:,3),'o'); hold on; plot3(nodes(bestPath,1),nodes(bestPath,2),nodes(bestPath,3),'r-','LineWidth',2); xlabel('X'); ylabel('Y'); zlabel('Z'); grid on; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值