多因素蚁群算法的移动机器人路径规划研究附Matlab代码

简介: 多因素蚁群算法的移动机器人路径规划研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法  神经网络预测雷达通信 无线传感器

信号处理图像处理路径规划元胞自动机无人机

⛄ 内容介绍

针对蚁群算法的特点,把蚁群算法应用到移动机器人的路径规划中,在Matlab中建立移动机器人仿真系统,运用格栅法创建移动机器人的工作环境,设置蚁群算法中的参数,运行程序得出了移动机器人的运动轨迹,得到了蚁群从起始点运动目标点的最优路径.仿真结果表明,蚁群算法能够准确得到移动机器人的最优路径,在移动机器人的路径规划中具有很好的实用性.

⛄ 部分代码

function [routes,min_PL,min_NC,min_ant]=ACO(NC_max,m,n,D_move,s,position_e1,Tau,Alpha,Eta,Beta,Q,Rho)

position_e=position_e1(1);%选择一个终点

min_PL_NC_ant=inf;%%蚂蚁最短的行进距离

min_ant=0;%%最短行进距离的蚂蚁坐标

min_NC=0;%%最短行进距离的迭代次数

% 计算邻接矩阵及启发因子%%邻接矩阵作用是计算启发因子

z=1;

%开始迭代

routes=cell(NC_max,m);%%%%存储每次迭代每个蚂蚁的路径

PL=zeros(NC_max,m); %%%%%存储每次迭代每个蚂蚁的路径长度

NC=1;               %迭代计数器,记录迭代次数


while NC<=NC_max

   NC

   for ant=1:m

       current_position=s;%%%当前位置为起始点

       path=s;%%路径初始化

       PL_NC_ant=0;%%长度初始化

       Tabu=ones(1,n*n);   %%%%禁忌表,排除已经走过的位置

       Tabu(s)=0;%%排除已经走过的初始点

       D_D=D_move;%%%%D_D是D_move的中间矩阵,作用是为了不让D_move参与计算,也可不用D_D矩阵,直接用D_move

       D_work=D_D(current_position,:);%%%把当前点可以前往的写一个节点的信息传送给D_work

       nonzeros_D_work=find(D_work);%%%找到不为0的元素的位置

       for i1=1:length(nonzeros_D_work)

           if Tabu(D_work(i1))==0

               D_work(nonzeros_D_work(i1))=[];%%将禁忌表中已走过的元素删除,防止走已经走过的位置

               D_work=[D_work,zeros(1,8-length(D_work))];%%%保证D_work向量长度为8(每个点最多能往周围的8个点走),为后面for循环做准备

           end

       end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%排除走过的第一点(排除起点)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

       len_D_work=length(find(D_work));

       while current_position~=position_e&&len_D_work>=1%%当前点是否为终点或者走进死胡同

           p=zeros(1,len_D_work);

           for j1=1:len_D_work

               [r1,c1]=position2rc(D_work(j1));%%利用自己编的函数把可以前进的点计算为行列表示

               p(j1)=(Tau(r1,c1)^Alpha)*(Eta(r1,c1)^Beta);%%%%计算每个可以前往的节点的概率

           end

           p=p/sum(p);%%%归一化

           pcum=cumsum(p);%%%概率累加

           select=find(pcum>=rand);%%%%轮盘赌法选择下个节点

           to_visit=D_work(select(1));%%%前往下一个节点

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%到达下一个节点%%%%%%%%%%%%%%%%%%%%%%%%

           path=[path,to_visit];%%%路径累加

           dis=distance(current_position,to_visit);%%%计算到下个节点的距离

           PL_NC_ant=PL_NC_ant+dis;%%距离累加

           current_position=to_visit;%%%当前点设为前往点

           D_work=D_D(current_position,:);%%%%把当前节点可以前往的下一个节点的信息传给D_work

           Tabu(current_position)=0;%%%禁忌表中排除已经到的点

           for kk=1:400

               if Tabu(kk)==0

                   for i3=1:8

                       if D_work(i3)==kk

                          D_work(i3)=[];%%%%排除禁忌表中已经走过的节点

                          D_work=[D_work,zeros(1,8-length(D_work))];%%保证长度为8

                       end

                   end

               end

           end

           len_D_work=length(find(D_work));%%%计算当前点可以前往的下一个节点的数量

       end

       %%%%%%%%%%%%%%%%%%%%%%%%迭代一次所有蚂蚁走完%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

       routes{NC,ant}=path;%%%把蚂蚁走过的路径记录下来

       if path(end)==position_e

           z=z+1;

           PL(NC,ant)=PL_NC_ant;%%记录到达终点的蚂蚁的行进距离

           if PL_NC_ant<min_PL_NC_ant

               min_NC=NC;min_ant=ant;min_PL_NC_ant=PL_NC_ant;%%记录路径最短的蚂蚁的迭代次数和属于那一只

           end

       else

           PL(NC,ant)=0;

       end

   end

   delta_Tau=zeros(n,n);%%%信息素变量初始化

   for j3=1:m

       if PL(NC,ant)

           rout=routes{NC,ant};

           tiaoshu=length(rout)-1;%%%找出到达终点蚂蚁前进的次数

           value_PL=PL(NC,ant);%%%%%%到达终点蚂蚁的行进距离

           for u=1:tiaoshu

               [r3,c3]=position2rc(rout(u+1));

               delta_Tau(r3,c3)=delta_Tau(r3,c3)+Q/value_PL;%%%%计算信息素变量的值

           end

       end

   end

   Tau=(1-Rho).*Tau+delta_Tau;%%%%信息素更新

   NC=NC+1;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%绘制收敛曲线%%%%%%%%%%%%%%%%%%%%%%%%%%%

min_PL=ones(NC_max,1);

for i=1:NC_max

   PL_1=PL(i,:);

   nonzero_PL_1=find(PL_1);%%%找到非零行进距离位置

   if isempty(nonzero_PL_1)

       min_PL(i)=min_PL(i-1);

   else

       min_PL(i)=min(PL_1(nonzero_PL_1));%%%找到第i次迭代中到达终点蚂蚁行进最短距离

   end

end

⛄ 运行结果

⛄ 参考文献

[1]林伟民, 邓三鹏, 祁宇明,等. 基于蚁群算法的移动机器人路径规划研究[J]. 机械研究与应用, 2018(4):144-145.

❤️ 关注我领取海量matlab电子书和数学建模资料
❤️部分理论引用网络文献,若有侵权联系博主删除


相关文章
|
26天前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
101 2
|
26天前
|
机器学习/深度学习 存储 算法
【微电网调度】考虑需求响应的基于改进多目标灰狼算法的微电网优化调度研究(Matlab代码实现)
【微电网调度】考虑需求响应的基于改进多目标灰狼算法的微电网优化调度研究(Matlab代码实现)
|
1月前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
|
1月前
|
机器学习/深度学习 传感器 算法
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
151 14
|
26天前
|
机器学习/深度学习 算法 安全
【图像处理】使用四树分割和直方图移动的可逆图像数据隐藏(Matlab代码实现)
【图像处理】使用四树分割和直方图移动的可逆图像数据隐藏(Matlab代码实现)
109 2
|
26天前
|
canal 算法 vr&ar
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
|
1月前
|
机器学习/深度学习 算法
【概率Copula分类器】实现d维阿基米德Copula相关的函数、HACs相关的函数研究(Matlab代码实现)
【概率Copula分类器】实现d维阿基米德Copula相关的函数、HACs相关的函数研究(Matlab代码实现)
|
1月前
|
机器学习/深度学习 传感器 算法
【裂纹检测】检测和标记图片中的裂缝(Matlab代码实现)
【裂纹检测】检测和标记图片中的裂缝(Matlab代码实现)
146 5
|
1月前
|
存储 算法 安全
【多目标工程应用】基于MOGWO的地铁隧道上方基坑工程优化设计研究(Matlab代码实现)
【多目标工程应用】基于MOGWO的地铁隧道上方基坑工程优化设计研究(Matlab代码实现)
|
1月前
|
传感器 机器学习/深度学习 编解码
【电缆】中压电缆局部放电的传输模型研究(Matlab代码实现)
【电缆】中压电缆局部放电的传输模型研究(Matlab代码实现)

热门文章

最新文章