function [ROUTES,PL,Tau]=ACASP(G,Tau,K,M,S,E,Alpha,Beta,Rho,Q)
% ACASP.m
% 输入参数列表
% G 用“像素”形式存储的地图,为一个01矩阵,元素为1的代表障碍物
% Tau 初始信息素矩阵
% K 迭代次数(指蚂蚁出动多少波)
% M 蚂蚁个数(每一波蚂蚁有多少个)
% S 起始点(最短路径的起始点)
% E 终止点(最短路径的目的点)
% Alpha 表征信息素重要程度的参数
% Beta 表征启发式因子重要程度的参数
% Rho 信息素蒸发系数
% Q 信息素增加强度系数
%
% 输出参数列表
% ROUTES 每一代的每一只蚂蚁的爬行路线
% PL 每一代的每一只蚂蚁的爬行路线长度
% Tau 输出动态修正过的信息素
%% 参数初始化
D=G2D(G);
N=size(D,1); % N表示问题的规模(象素个数)
MM=size(G,1);
a=1; % 小方格象素的边长
Ex=a*(mod(E,MM)-0.5); % 终止点横坐标
if Ex==-0.5
Ex=MM-0.5;
end
Ey=a*(MM+0.5-ceil(E/MM));% 终止点纵坐标
Eta=zeros(1,N);
% 下面构造启发式信息矩阵
for i=1:N
ix=a*(mod(i,MM)-0.5);
if ix==-0.5
ix=MM-0.5;
end
iy=a*(MM+0.5-ceil(i/MM));
if i~=E
Eta(1,i)=1/((ix-Ex)^2+(iy-Ey)^2)^0.5;
else
Eta(1,i)=100;
end
end
ROUTES=cell(K,M); % 用细胞结构存储每一代的每一只蚂蚁的爬行路线
PL=zeros(K,M); % 用矩阵存储每一代的每一只蚂蚁的爬行路线长度
%% 启动K轮蚂蚁觅食活动,每轮派出M只蚂蚁
for k=1:K
fprintf('当前迭代步数:%.0f\n',k);
for m=1:M
%%第一步:状态初始化
W=S; % 令当前节点初始化为起始点
Path=S; % 爬行路线初始化
PLkm=0; % 爬行路线长度初始化
TABUkm=ones(1,N); % 初始化禁忌表
TABUkm(S)=0; % 禁忌初始点
DD=D; % 邻接矩阵初始化
%%第二步:下一步可以前往的节点
DW=DD(W,:);
DW1=find(DW<inf);
for j=1:length(DW1)
if TABUkm(DW1(j))==0
DW(j)=inf;
end
end
LJD=find(DW<inf); % 可选节点
Len_LJD=length(LJD); % 可选节点的个数
%%觅食停止条件:蚂蚁未遇到食物或者陷入死胡同
while W~=E&&Len_LJD>=1
%%第三步:转轮赌法选择下一步怎么走
PP=zeros(1,Len_LJD);
for i=1:Len_LJD
PP(i)=(Tau(W,LJD(i))^Alpha)*(Eta(LJD(i))^Beta);
end
PP=PP/(sum(PP)); % 建立概率分布
Pcum=cumsum(PP); % 轮盘赌概率累加
Select=find(Pcum>=rand);
to_visit=LJD(Select(1));%the next step node
%%状态更新和记录
Path=[Path,to_visit]; % 增长路径
PLkm=PLkm+DD(W,to_visit);% 增加路径长度
W=to_visit; % 蚂蚁移至下一个节点
for kk=1:N
if TABUkm(kk)==0
DD(W,kk)=inf;
DD(kk,W)=inf;
end
end
TABUkm(W)=0; % 从禁忌表中删除已访问过的节点
DW=DD(W,:);
DW1=find(DW<inf);
for j=1:length(DW1)
if TABUkm(DW1(j))==0
DW(j)=inf;
end
end
LJD=find(DW<inf); % 可选节点
Len_LJD=length(LJD); % 可选节点的个数
end
%%第五步:记下每一代每一只蚂蚁的觅食路线和路线长度
ROUTES{k,m}=Path;
if Path(end)==E
PL(k,m)=PLkm;
else
PL(k,m)=inf;
end
end
%%第六步:更新信息素
Delta_Tau=zeros(N,N); % 更新量初始化
for m=1:M
if PL(k,m)<inf
ROUT=ROUTES{k,m};
TS=length(ROUT)-1;
PL_km=PL(k,m);
for s=1:TS
x=ROUT(s);
y=ROUT(s+1);
Delta_Tau(x,y)=Delta_Tau(x,y)+Q/PL_km;
Delta_Tau(y,x)=Delta_Tau(y,x)+Q/PL_km;
end
end
end
Tau=(1-Rho).*Tau+Delta_Tau; % 信息素挥发一部分,增加一部分
end
disp('--------------------------------------------------------------------')
disp('迭代计算结束!')
%% 绘图
plotif=1; % 是否绘图控制参数
if plotif==1
% 绘制收敛曲线
meanPL=zeros(1,K);
minPL=zeros(1,K);
for i=1:K
PLK=PL(i,:);
Nonzero=find(PLK<inf);
PLKPLK=PLK(Nonzero);
meanPL(i)=mean(PLKPLK);
minPL(i)=min(PLKPLK);
end
figure(1)
plot(minPL,'b-','LineWidth',2);
hold on
plot(meanPL,'r-','LineWidth',2);
grid on
title('收敛曲线(平均路径长度和最小路径长度)');
xlabel('迭代次数');
ylabel('路径长度');
legend('最小路径长度','平均路径长度')
% 绘制爬行路线
figure(2)
axis([0,MM,0,MM])
for i=1:MM
for j=1:MM
if G(i,j)==1
x1=j-1; y1=MM-i;
x2=j; y2=MM-i;
x3=j; y3=MM-i+1;
x4=j-1; y4=MM-i+1;
fill([x1,x2,x3,x4],[y1,y2,y3,y4],[0.2,0.2,0.2]);
hold on
else
x1=j-1; y1=MM-i;
x2=j; y2=MM-i;
x3=j; y3=MM-i+1;
x4=j-1; y4=MM-i+1;
fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,1,1]);
hold on
end
end
end
hold on
ROUT=ROUTES{K,M};
LENROUT=length(ROUT);
Rx=ROUT;
Ry=ROUT;
for ii=1:LENROUT
Rx(ii)=a*(mod(ROUT(ii),MM)-0.5);
if Rx(ii)==-0.5
Rx(ii)=MM-0.5;
end
Ry(ii)=a*(MM+0.5-ceil(ROUT(ii)/MM));
end
plot(Rx,Ry,'b-','LineWidth',2)
Ex=mod(E,MM)-0.5; Ey=(MM-ceil(E/MM))+0.5;
if Ex==-0.5
Ex=MM-0.5;
end
Sx=mod(S,MM)-0.5; Sy=(MM-ceil(S/MM))+0.5;
if Sx==-0.5
Sx=MM-0.5;
end
plot(Ex,Ey,'rs','MarkerSize',5,'LineWidth',5); % 终点
plot(Sx,Sy,'go','MarkerSize',5,'LineWidth',5); % 起点
title('最短路径');
axis([0,MM,0,MM]);
end
plotif2=1; % 绘制各代蚂蚁爬行路线图
if plotif2==1
figure(3)
axis([0,MM,0,MM])
for i=1:MM
for j=1:MM
if G(i,j)==1
x1=j-1; y1=MM-i;
x2=j; y2=MM-i;
x3=j; y3=MM-i+1;
x4=j-1; y4=MM-i+1;
fill([x1,x2,x3,x4],[y1,y2,y3,y4],[0.2,0.2,0.2]);
hold on
else
x1=j-1; y1=MM-i;
x2=j; y2=MM-i;
x3=j; y3=MM-i+1;
x4=j-1; y4=MM-i+1;
fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,1,1]);
hold on
end
end
end
for k=1:K
PLK=PL(k,:);
minPLK=min(PLK);
pos=find(PLK==minPLK);
m=pos(1);
ROUT=ROUTES{k,m};
LENROUT=length(ROUT);
Rx=ROUT;
Ry=ROUT;
for ii=1:LENROUT
Rx(ii)=a*(mod(ROUT(ii),MM)-0.5);
if Rx(ii)==-0.5
Rx(ii)=MM-0.5;
end
Ry(ii)=a*(MM+0.5-ceil(ROUT(ii)/MM));
end
plot(Rx,Ry)
hold on
end
end
axis([0,MM,0,MM])
title('所有蚂蚁的爬行路径');
fprintf('最短路径长度:%f\n',minPLK)
没有合适的资源?快使用搜索试试~ 我知道了~
【路径规划】基于matlab蚁群算法机器人栅格地图最短路径规划【含Matlab源码 1618期】.zip
共8个文件
jpg:4个
m:3个
md:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 158 浏览量
2024-10-01
23:20:02
上传
评论
收藏 111KB ZIP 举报
温馨提示
CSDN海神之光上传的全部代码均可运行,亲测可用,直接替换数据即可,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,可私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博主博客文章底部QQ名片; 4.1 CSDN博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作 智能优化算法栅格地图路径规划系列程序定制或科研合作方向: 4.4.1 遗传算法GA/蚁群算法ACO栅格地图路径规划 4.4.2 粒子群算法PSO栅格地图路径规划 4.4.3 灰狼算法GWO/狼群算法WPA栅格地图路径规划 4.4.4 鲸鱼算法WOA/麻雀算法SSA栅格地图路径规划 4.4.5 萤火虫算法FA/差分算法DE栅格地图路径规划
资源推荐
资源详情
资源评论
收起资源包目录
【路径规划】基于matlab蚁群算法机器人栅格地图最短路径规划【含Matlab源码 1618期】.zip (8个子文件)
【路径规划】基于matlab蚁群算法机器人栅格地图最短路径规划【含Matlab源码 1618期】
运行结果1.jpg 38KB
G2D.m 1KB
运行结果2.jpg 43KB
运行结果4.JPG 23KB
Main.m 2KB
【路径规划】蚁群算法求解机器人栅格地图最短路径规划问题含matlab源码 .md 6KB
ACASP.m 7KB
运行结果3.jpg 47KB
共 8 条
- 1
资源评论
海神之光
- 粉丝: 5w+
- 资源: 6110
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- dpt-beit-base-384.pt
- 【net毕业设计】超市管理系统源码(完整前后端+sqlserver+说明文档+LW).zip
- STM32神舟III号例程源码RS485总线实验(神舟III号-库函数版)
- 【net毕业设计】花卉市场批发管理系统源码(完整前后端+sqlserver+说明文档+LW).zip
- 【net毕业设计】大学生兼职管理系统源码(完整前后端+sqlserver+说明文档).zip
- STM32神舟III号例程源码NAND FLASH访问程序(神舟III号-库函数版)
- C#汽车货运管理系统源码 货运公司车辆管理系统源码数据库 SQL2008源码类型 WinForm
- STM32神舟III号例程源码MP3播放器实验(神舟III号-库函数版)
- STM32开发相关软件MDK4.70A软件包
- STM32开发相关软件ISP程序下载
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功