找回密码
 注册
Simdroid-非首页
查看: 1483|回复: 19

【原创】蚁群算法最短路径通用Matlab程序(附图)

[复制链接]
发表于 2007-3-17 20:07:50 | 显示全部楼层 |阅读模式 来自 河南郑州
GreenSim团队的博客开通了,更多原创程序请访问我们的博客
http://blog.sina.com.cn/greensim

    下面的程序是蚁群算法在最短路中的应用,稍加扩展即可应用于机器人路径规划
  1. function [ROUTES,PL,Tau]=ACASP(G,Tau,K,M,S,E,Alpha,Beta,Rho,Q)
  2. %% ---------------------------------------------------------------
  3. % ACASP.m
  4. % 蚁群算法动态寻路算法
  5. % ChengAihua,PLA Information Engineering University,ZhengZhou,China
  6. % Email:aihuacheng@gmail.com
  7. % All rights reserved
  8. %% ---------------------------------------------------------------
  9. % 输入参数列表
  10. % G 地形图为01矩阵,如果为1表示障碍物
  11. % Tau 初始信息素矩阵(认为前面的觅食活动中有残留的信息素)
  12. % K 迭代次数(指蚂蚁出动多少波)
  13. % M 蚂蚁个数(每一波蚂蚁有多少个)
  14. % S 起始点(最短路径的起始点)
  15. % E 终止点(最短路径的目的点)
  16. % Alpha 表征信息素重要程度的参数
  17. % Beta 表征启发式因子重要程度的参数
  18. % Rho 信息素蒸发系数
  19. % Q 信息素增加强度系数
  20. %
  21. % 输出参数列表
  22. % ROUTES 每一代的每一只蚂蚁的爬行路线
  23. % PL 每一代的每一只蚂蚁的爬行路线长度
  24. % Tau 输出动态修正过的信息素

  25. %% --------------------变量初始化----------------------------------
  26. %load
  27. D=G2D(G);
  28. N=size(D,1);%N表示问题的规模(象素个数)
  29. MM=size(G,1);
  30. a=1;%小方格象素的边长
  31. Ex=a*(mod(E,MM)-0.5);%终止点横坐标
  32. if Ex==-0.5
  33. Ex=MM-0.5;
  34. end
  35. Ey=a*(MM+0.5-ceil(E/MM));%终止点纵坐标
  36. Eta=zeros(1,N);%启发式信息,取为至目标点的直线距离的倒数
  37. %下面构造启发式信息矩阵
  38. for i=1:N
  39. if ix==-0.5
  40. ix=MM-0.5;
  41. end
  42. iy=a*(MM+0.5-ceil(i/MM));
  43. if i~=E
  44. Eta(1,i)=1/((ix-Ex)^2+(iy-Ey)^2)^0.5;
  45. else
  46. Eta(1,i)=100;
  47. end
  48. end
  49. ROUTES=cell(K,M);%用细胞结构存储每一代的每一只蚂蚁的爬行路线
  50. PL=zeros(K,M);%用矩阵存储每一代的每一只蚂蚁的爬行路线长度
  51. %% -----------启动K轮蚂蚁觅食活动,每轮派出M只蚂蚁--------------------
  52. for k=1:K
  53. disp(k);
  54. for m=1:M
  55. %% 第一步:状态初始化
  56. W=S;%当前节点初始化为起始点
  57. Path=S;%爬行路线初始化
  58. PLkm=0;%爬行路线长度初始化
  59. TABUkm=ones(1,N);%禁忌表初始化
  60. TABUkm(S)=0;%已经在初始点了,因此要排除
  61. DD=D;%邻接矩阵初始化
  62. %% 第二步:下一步可以前往的节点
  63. DW=DD(W,:);
  64. DW1=find(DW
  65. for j=1:length(DW1)
  66. if TABUkm(DW1(j))==0
  67. DW(j)=inf;
  68. end
  69. end
  70. LJD=find(DW
  71. Len_LJD=length(LJD);%可选节点的个数
  72. %% 觅食停止条件:蚂蚁未遇到食物或者陷入死胡同
  73. while W~=E&&Len_LJD>=1
  74. %% 第三步:转轮赌法选择下一步怎么走
  75. PP=zeros(1,Len_LJD);
  76. for i=1:Len_LJD
  77. PP(i)=(Tau(W,LJD(i))^Alpha)*(Eta(LJD(i))^Beta);
  78. end
  79. PP=PP/(sum(PP));%建立概率分布
  80. Pcum=cumsum(PP);
  81. Select=find(Pcum>=rand);
  82. %% 第四步:状态更新和记录
  83. Path=[Path,to_visit];%路径增加
  84. PLkm=PLkm+DD(W,to_visit);%路径长度增加
  85. W=to_visit;%蚂蚁移到下一个节点
  86. for kk=1:N
  87. if TABUkm(kk)==0
  88. DD(W,kk)=inf;
  89. DD(kk,W)=inf;
  90. end
  91. end
  92. TABUkm(W)=0;%已访问过的节点从禁忌表中删除
  93. for j=1:length(DW1)
  94. if TABUkm(DW1(j))==0
  95. DW(j)=inf;
  96. end
  97. end
  98. LJD=find(DW
  99. Len_LJD=length(LJD);%可选节点的个数
  100. end
  101. %% 第五步:记下每一代每一只蚂蚁的觅食路线和路线长度
  102. ROUTES{k,m}=Path;
  103. if Path(end)==E
  104. PL(k,m)=PLkm;
  105. else
  106. PL(k,m)=inf;
  107. end
  108. end
  109. %% 第六步:更新信息素
  110. Delta_Tau=zeros(N,N);%更新量初始化
  111. for m=1:M
  112. if PL(k,m) ROUT=ROUTES{k,m};
  113. TS=length(ROUT)-1;%跳数
  114. PL_km=PL(k,m);
  115. for s=1:TS
  116. x=ROUT(s);
  117. Delta_Tau(y,x)=Delta_Tau(y,x)+Q/PL_km;
  118. end
  119. end
  120. end
  121. Tau=(1-Rho).*Tau+Delta_Tau;%信息素挥发一部分,新增加一部分
  122. end
  123. %% ---------------------------绘图--------------------------------
  124. plotif=1;%是否绘图的控制参数
  125. if plotif==1
  126. %绘收敛曲线
  127. meanPL=zeros(1,K);
  128. minPL=zeros(1,K);
  129. for i=1:K
  130. PLK=PL(i,:);
  131. Nonzero=find(PLK
  132. PLKPLK=PLK(Nonzero);
  133. meanPL(i)=mean(PLKPLK);
  134. minPL(i)=min(PLKPLK);
  135. end
  136. figure(1)
  137. plot(minPL);
  138. hold on
  139. plot(meanPL);
  140. grid on
  141. title('收敛曲线(平均路径长度和最小路径长度)');
  142. xlabel('迭代次数');
  143. ylabel('路径长度');
  144. %绘爬行图
  145. figure(2)
  146. axis([0,MM,0,MM])
  147. for i=1:MM
  148. for j=1:MM
  149. if G(i,j)==1
  150. x1=j-1;y1=MM-i;
  151. x2=j;y2=MM-i;
  152. x4=j-1;y4=MM-i+1;
  153. fill([x1,x2,x3,x4],[y1,y2,y3,y4],[0.2,0.2,0.2]);
  154. hold on
  155. else
  156. x1=j-1;y1=MM-i;
  157. x2=j;y2=MM-i;
  158. x3=j;y3=MM-i+1;
  159. x4=j-1;y4=MM-i+1;
  160. fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,1,1]);
  161. hold on
  162. end
  163. end
  164. end
  165. hold on
  166. LENROUT=length(ROUT);
  167. Rx=ROUT;
  168. Ry=ROUT;
  169. for ii=1:LENROUT
  170. Rx(ii)=a*(mod(ROUT(ii),MM)-0.5);
  171. if Rx(ii)==-0.5
  172. Rx(ii)=MM-0.5;
  173. end
  174. Ry(ii)=a*(MM+0.5-ceil(ROUT(ii)/MM));
  175. end
  176. plot(Rx,Ry)
  177. end
  178. plotif2=1;%绘各代蚂蚁爬行图
  179. if plotif2==1
  180. figure(3)
  181. axis([0,MM,0,MM])
  182. for i=1:MM
  183. for j=1:MM
  184. if G(i,j)==1
  185. x1=j-1;y1=MM-i;
  186. x2=j;y2=MM-i;
  187. x4=j-1;y4=MM-i+1;
  188. fill([x1,x2,x3,x4],[y1,y2,y3,y4],[0.2,0.2,0.2]);
  189. hold on
  190. else
  191. x1=j-1;y1=MM-i;
  192. x2=j;y2=MM-i;
  193. x3=j;y3=MM-i+1;
  194. x4=j-1;y4=MM-i+1;
  195. fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,1,1]);
  196. hold on
  197. end
  198. end
  199. end
  200. for k=1:K
  201. PLK=PL(k,:);
  202. minPLK=min(PLK);
  203. pos=find(PLK==minPLK);
  204. m=pos(1);
  205. ROUT=ROUTES{k,m};
  206. LENROUT=length(ROUT);
  207. Rx=ROUT;
  208. Ry=ROUT;
  209. for ii=1:LENROUT
  210. Rx(ii)=a*(mod(ROUT(ii),MM)-0.5);
  211. if Rx(ii)==-0.5
  212. Rx(ii)=MM-0.5;
  213. end
  214. Ry(ii)=a*(MM+0.5-ceil(ROUT(ii)/MM));
  215. end
  216. plot(Rx,Ry)
  217. hold on
  218. end
  219. end
复制代码
将上述算法应用于机器人路径规划,优化效果如下图所示


GreenSim团队简介

——更多原创程序,请访问GreenSim团队的主页→http://blog.sina.com.cn/greensim

    GreenSim团队长期从事建模仿真、算法设计、代写程序等业务,为您提供实验、课题、论文、项目等方面的仿真服务。
    GreenSim团队擅长的学科领域主要有
智能算法】遗传算法、模拟退火、神经网络、蚁群算法、免疫优化、支持向量机、拟物拟人
运筹优化】数学建模、数值优化算法、大规模/非线性问题、组合优化、NP完全问题
信息与通信】无线通信、信号处理、计算机网络
其它学科】任何问题,只要能归结为数学问题或者算法仿真,我们都有实力和信心解决
    GreenSim团队的联系方式:
QQ: 330264704,535115369  Email:
greensim@163.com(来 信 必 复)

[ 本帖最后由 aiwa 于 2007-3-18 13:37 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

03041138 该用户已被删除
发表于 2007-4-11 19:19:31 | 显示全部楼层 来自 陕西西安
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2007-4-16 09:41:58 | 显示全部楼层 来自 陕西西安
非常谢谢楼主啊
发表于 2007-7-29 22:30:20 | 显示全部楼层 来自 重庆
我正结合蚁群算法准备创新一下,看看能否突破
回复 不支持

使用道具 举报

发表于 2007-8-2 14:47:50 | 显示全部楼层 来自 上海
:) 好东西 收下了

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2007-8-4 21:41:35 | 显示全部楼层 来自 重庆九龙坡区
非常谢谢楼主啊

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2007-8-18 11:12:28 | 显示全部楼层 来自 湖南长沙
中间有些子函数怎么没带啊?能不能给个说明阿
回复 不支持

使用道具 举报

 楼主| 发表于 2007-8-19 10:57:57 | 显示全部楼层 来自 河南郑州
原帖由 chuzhongkuangke 于 2007-8-18 06:12 发表
中间有些子函数怎么没带啊?能不能给个说明阿

就一个子函数没带而已,D=G2D(G); 它是把01形式存储的地图转化为图的赋权邻接矩阵的一个函数,你如果已经有了图的邻接矩阵,可不必用此函数。
回复 不支持

使用道具 举报

clq52025 该用户已被删除
发表于 2007-8-19 15:59:38 | 显示全部楼层 来自 天津
提示: 作者被禁止或删除 内容自动屏蔽
回复 不支持

使用道具 举报

发表于 2007-8-20 11:13:47 | 显示全部楼层 来自 北京
非常感谢!

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2007-8-27 17:11:10 | 显示全部楼层 来自 江苏无锡
什么叫土的邻接矩阵啊?:L :L
回复 不支持

使用道具 举报

 楼主| 发表于 2007-8-27 19:44:04 | 显示全部楼层 来自 河南郑州
原帖由 jiangda06 于 2007-8-27 12:11 发表
什么叫土的邻接矩阵啊?:L :L


请参看任何一本图论或者数据结构的书!
回复 不支持

使用道具 举报

发表于 2008-3-12 21:26:40 | 显示全部楼层 来自 湖北宜昌
非常感谢,谢谢楼主

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2008-4-18 18:32:30 | 显示全部楼层 来自 湖南长沙
不知道迭代学习算法的仿真怎么做,关于matlab编程的问题,楼主怎么没提到阿?
回复 不支持

使用道具 举报

发表于 2008-7-2 12:31:05 | 显示全部楼层 来自 湖北宜昌
xiexie !!!!!:lol
回复 不支持

使用道具 举报

发表于 2008-8-31 21:38:07 | 显示全部楼层 来自 湖北武汉
Thank you!

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-8-21 11:06:24 | 显示全部楼层 来自 江苏南京
支持楼主!!!

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-10-8 15:18:24 | 显示全部楼层 来自 湖北宜昌
非常谢谢楼主啊,分享了这么好的资料

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-10-9 23:57:47 | 显示全部楼层 来自 重庆
太高深了, 我这种低智商的人还用不着啊
回复 不支持

使用道具 举报

发表于 2017-7-18 23:03:38 | 显示全部楼层 来自 广东深圳
中间有些子函数怎么没带啊?能不能给个说明阿
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-25 15:19 , Processed in 0.065499 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表