【路径规划】基于粒子群优化蚁群算法求解二维最短路径

1 简介

路径规划技术是目前众多应用技术领域的研究热点,具有重要的科研价值和广阔的应用前景。路径规划技术的核心内容就是规划算法。目前求解路径规划问题的方法主要有A*算法、粒子群算法、遗传算法、蚁群算法等智能算法。粒子群和蚁群算法分别是模拟鸟群和蚁群觅食行为的仿生算法。将两种算法用于路径规划领域,是近年来国内外学者研究的热点并取得了显著的成果。证明了其良好的应用性能。粒子群优化算法是一种新的随机搜索算法,具有很强的全局搜索能力,快速简洁但是易陷入局部最优;而蚁群算法具有并行性、正反馈性、求解精度高、收敛速度慢等特点。针对上述问题,具体改进策略如下:(1)针对复杂环境下移动机器人全局路径规划问题,提出了一种的增强蚁群优化算法。该算法通过改进信息素初始化和状态转移概率,避免了路径死锁;采用确定性与随机性相结合的路径点搜索策略改善了迂回曲折现象;利用路径平滑操作,增强了路径的连续性;引入局部信息素扩散机制,提高了算法的全局优化能力。仿真结果表明:当环境中障碍物分布密集或存在大量的凹形区域时,新算法能有效地规划出较为理想的安全路径,规划时间可满足实际应用要求。(2)根据粒子群算法快速、简洁的优点得到蚁群算法初始信息素分布,然后利用蚁群算法所具有的优点,如正反馈性、并行性、求解精度高等,规划出全局最优路径。利用matlab实验仿真平台,利用该仿真平台对粒子群蚁群融合算法进行仿真测试,并对其进行性能分析。仿真实验分析表明,粒子群蚁群融合算法在时间性能方面优于增强蚁群算法,在解的质量上优于粒子群算法,表明了改进策略的有效性和实用性。

1.1 粒子群算法

粒子群优化算法(Particle Swarm Optimization,PSO)是一种模拟自然界中生物群觅 食行为相互合作机制从而找到问题最优解的群体智算法。该算法具有原理简单、易实现、 控制参数较少等优点,从而在不同领域都得到了广泛应用。PSO 算法通过群体中各粒 子间的相互合作及竞争,实现对区域内最优解的寻找,其基本思想是在解空间中随机选 择一群粒子并将它们随机分布至解空间,每个粒子的运动速度和方向决定粒子的下一位 置,粒子本身目前找到的历史最优解和整个群体找到的历史最优解影响着每个粒子下一 次的运动速度和方向,每个粒子都看作是目标函数的一个可行解,将粒子的位置值带入 适应度函数计算并评价解的好坏,最终得到全局最优解。

1.2 蚁群算法

蚁群算法(Ant Colony Optimization, ACO)是一种模拟蚂蚁种群搜索食物的行为而提 出的智能群体算法[37]。蚂蚁在缺失视觉功能的情况下,可以从蚁穴出发并找到与食物源 之间的最短路径,即使在路程中突然遇到障碍物,也能重新规划并找到最优路径。仿生 学家经过大量细致的观察研究发现,信息素(Pheromone)是蚂蚁个体之间进行信息交 换的媒介,蚂蚁通过信息素与群体中的其他个体进行信息交流,最终形成一种群体智能 行为。并非所有蚂蚁都依据信息素选取路径搜索食物,也有部分蚂蚁会选择其他道路,于此同时分泌信息素。信息素浓度表明了路径的远近,浓度越大,说明距离越近。随着 时间的推移,信息素浓度慢慢降低并逐渐挥发消失。蚂蚁会选择信息素浓度更高,也就 是更短的路径。经过一段时间,大多数蚂蚁都会选择最短的路径进行食物源搜索。

2 部分代码

clc
clear
close all
E=0.000001;
maxnum=30;%最大迭代次数
narvs=3;%目标函数的自变量个数
particlesize=20;%粒子群规模
c1=1.2;%每个粒子的个体学习因子,加速度常数
c2=1.6;%每个粒子的社会学习因子,加速度常数
w=0.8;%惯性因子
vmax1=0.5;%粒子的最大飞翔速度
vamx2=-0.5;
v=rand(particlesize,narvs);%粒子飞翔速度
x=zeros(particlesize,3);
x(:,1)=1+rand(1);
x(:,2)=7+rand(1);%粒子所在位置
x(:,3)=0.2+0.1*rand(1);
%定义适应度函数
% ROUT=zeros(particlesize,100);
for i=1:particlesize
  [TT(i),ROUT{i},f(i)]=ACO(x(i,1),x(i,2),x(i,3));
end
personalbest_x=x;
personalbest_faval=f;
% personalbest_faval=TT;
[globalbest_faval(1),i]=min(personalbest_faval);
globalbest_x=personalbest_x(i,:);
globalbest_route=ROUT{i};
ff(1)=globalbest_faval(1);
k=2;
while (k<=maxnum)
   tic
   for i=1:particlesize
      [TT(i),ROUT{i},f(i)]=ACO(x(i,1),x(i,2),x(i,3));
       
       if f(i)<personalbest_faval(i)
           personalbest_faval(i)=f(i);
%             personalbest_faval(i)=TT(i);
           personalbest_x(i,:)=x(i,:);
       end
   end
   if min(personalbest_faval) < globalbest_faval(k-1)
      [globalbest_faval(k),i]=min(personalbest_faval);
       globalbest_x(k,:)=personalbest_x(i,:);
       globalbest_route=ROUT{i};
   else
       globalbest_faval(k)=globalbest_faval(k-1);
       globalbest_x(k,:)=personalbest_x(i,:);
%         globalbest_route=ROUT{i};
   end
   
   for i=1:particlesize
       v(i,:)=w*v(i,:)+c1*rand*(personalbest_x(i,:)-x(i,:))...
           +c2*rand*(globalbest_x(k,:)-x(i,:));
       for j=1:narvs
           if v(i,j)>vmax1
               v(i,j)=vmax1;
           elseif v(i,j)<-vmax1
               v(i,j)=-vmax1;
           end
           
       end
       x(i,:)=x(i,:)+v(i,:);
   end
   ff(k)=globalbest_faval(k);
   if globalbest_faval(k)<E
       break
   end
   
   k=k+1
end

route=globalbest_route;
[minkl,p]=min(globalbest_faval);
xbest=globalbest_x(p,:);
LENROUT=length(route);
disp(['Alpha 表征信息素重要程度的参数=',num2str(xbest(1))]);
disp(['Beta 表征启发式因子重要程度的参数=',num2str(xbest(2))]);
disp(['Rho 信息素蒸发系数=',num2str(xbest(3))]);
disp(sprintf('Shortroad is: %s',num2str(route)));
disp(sprintf('Mininum is: %d',minkl));

figure(2)
% set(gcf,'color','white');
plot(1:length(ff),ff)
title('粒子群蚁群算法收敛曲线变化趋势')
xlabel('迭代次数');
ylabel('适应度值');

first_address = [
   100,10
   150,10
   170,30
   180,20
   200,10
   200,100
   200,150
   190,180
   180,200
   160,200
   170,180
   140,180
   135,200
   130,180
   100,200
   125,100
   200,300
   10,300
   10,200
   10,180
   10,100
   10,10
   50,30
   100,10
  ];%first_address表示测试数据中的节点坐标
SumOfCity = size(first_address,1);%节点个数,实际返回行数,即为节点个数
length_address =0.*ones(SumOfCity,SumOfCity);%length_address表示两两节点间的距离,初始设定10000,可以设定无穷大,表示不相连
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
length_address(1,2)=194.0;%表示节点1和节点2的COST值
length_address(2,3)=64.9;%
length_address(3,4)=20.0;%
length_address(4,5)=18.6;
length_address(2,5)=72.4;
length_address(5,6)=123.4;
length_address(6,7)=35.5;
length_address(7,8)=32.4;
length_address(8,9)=45.0;
length_address(9,10)=51.4;
length_address(10,13)=271.2;
length_address(13,15)=100.0;
length_address(15,19)=189.5;
length_address(8,11)=293.9;
length_address(11,12)=100.0;
length_address(12,14)=4.1;
length_address(14,20)=192.9;
length_address(14,15)=86.8;
length_address(10,12)=87.0;
length_address(6,16)=600.0;
length_address(16,21)=279.3;
length_address(7,17)=92.0;
length_address(17,18)=464.9;
length_address(18,19)=46.0;
length_address(19,20)=44.6;
length_address(20,21)=67.5;
length_address(21,22)=230.3;
length_address(22,23)=102.9;
length_address(23,24)=126.9;
length_address(22,24)=262.5;

for   n=1:size(first_address)
   for m=1:size(first_address)
       if length_address(n,m)~=0
           length_address(m,n)=length_address(n,m);   %对称矩阵
       end
   end
end
MM=size(length_address,1);
% 画出节点分布图形
figure;
grid on;
hold on;
% title (strcat('井下机车最短运输路径',date))
%title( sprintf('井下机车最短运输路径 Event occured at %s',datestr (date ,15)));
for i=1:MM-1
   plot(first_address(i,1),first_address(i,2),'co','MarkerSize',20);
   str=num2str(i);
   text(first_address(i,1)-5,first_address(i,2)+5,str,'Color','red','FontSize',12);
end
% m=length(route);
for i=1:LENROUT
   plot(first_address(route(i),1),first_address(route(i),2),'MarkerSize',20,'MarkerEdgeColor','g','MarkerFaceColor',[0.2,0.5,0.5]) ;
   hold on;
end
for i=1:MM
   for j=1:MM
       if(length_address(i,j)~=0)
           line([first_address(i,1),first_address(j,1)],[first_address(i,2),first_address(j,2)],'Color','b','LineWidth',3);%划线
           text((first_address(i,1)+first_address(j,1))/2,(first_address(i,2)+first_address(j,2))/2,num2str(length_address(i,j)));%标注线段距离
       end
   end
end
%% 最短路径
for p=1:LENROUT-1
   if(route(p+1)~=24)
       line([first_address(route(p),1),first_address(route(p+1),1)],[first_address(route(p),2),first_address(route(p+1),2)],'Color','r','LineWidth',3);%划线
       text((first_address(route(p),1)+first_address(route(p+1),1))/2,(first_address(route(p),2)+first_address(route(p+1),2))/2,num2str(length_address(route(p),route(p+1))));%标注线段距离
   else
       line([first_address(route(p),1),first_address(1,1)],[first_address(route(p),2),first_address(1,2)],'Color','r','LineWidth',3);%划线
       text((first_address(route(p),1)+first_address(1,1))/2,(first_address(route(p),2)+first_address(1,2))/2,num2str(length_address(route(p),route(p+1))));%标注线段距离
   end
end
axis([0 250 0 400])
% 图形显示最优及平均函数值变化趋势
% figure(2);
% plot( minPL);
% title('迭代优化过程');
% xlabel('迭代次数');
% ylabel('Cost');
% hold on;

3 仿真结果

4 参考文献

[1]高敏. 基于粒子群蚁群算法的路径规划研究. Diss. 南昌航空大学.

 

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
粒子群算法(Particle Swarm Optimization,PSO)和蚁群算法(Ant Colony Optimization,ACO)都是优化算法常用的群体智能算法。它们分别基于鸟群觅食和蚂蚁寻食物的行为模式,通过模拟群体个体之间的信息交流和协作来搜索最优解。 粒子群算法的基本思想是通过模拟鸟群个体的行为,每个个体(粒子)在解空间搜索最优解。每个粒子根据自身的历史最优位置和群体最优位置进行位置更新,并通过适应度函数评估当前位置的优劣。通过不断迭代更新,最终到全局最优解。 蚁群算法则是通过模拟蚂蚁在寻食物过程的行为,每只蚂蚁根据信息素和启发式信息来选择路径。蚂蚁在路径上释放信息素,路径上的信息素浓度会影响其他蚂蚁的选择。通过不断迭代更新信息素浓度和路径选择,最终到最优解。 将粒子群算法蚁群算法结合起来可以提高搜索效率和精度。一种常见的方法是将蚁群算法的信息素更新机制引入粒子群算法,即在粒子的位置更新过程考虑信息素的影响。这样可以使得粒子更加倾向于选择具有较高信息素浓度的位置,从而加速搜索过程。 另一种方法是将粒子群算法蚁群算法分别应用于不同的阶段。例如,可以先使用粒子群算法进行全局搜索,然后再使用蚁群算法进行局部搜索。这样可以充分利用两种算法的优势,提高搜索效率和精度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Matlab科研辅导帮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值