✅作者简介:热爱科研的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_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电子书和数学建模资料 ❤️部分理论引用网络文献,若有侵权联系博主删除 ⛄ 运行结果
⛄ 参考文献