本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(1)

【路径规划】基于蚁群算法求解最短路径matlab

发布于2021-06-07 20:34     阅读(1368)     评论(0)     点赞(12)     收藏(2)


   

一、蚁群算法的基本原理

1、蚂蚁在路径上释放信息素。

2、碰到还没走过的路口,就随机挑选一条路走。同时,释放与路径长度有关的信息素。

3、信息素浓度与路径长度成反比。后来的蚂蚁再次碰到该路口时,就选择信息素浓度较高路径。

4、最优路径上的信息素浓度越来越大。

5、最终蚁群找到最优寻食路径。

 

 

 蚁群走过较短的那一侧的蚂蚁数数量会多于较长那一侧的,所以留下的信息素就会多,渐渐的蚂蚁就只走较短的那一侧了。

 

蚁群算法对TSP的求解主要有两大步骤:(TSP问题就是要找到最短哈密尔顿回路)

1、路径构建

AS中的随机比例规则;对于每只蚂蚁k,路径记忆向量R^k.按照访问顺序记录了所有k已经经过的城市序号。设蚂蚁k当前所在城市为i,则其选择城市j作为下一个访问对象的概率为:

 

 

2、信息素更新

 

这里m是蚂蚁个数, ρ是信息素的蒸发率,规定0≤ ρ≤1,在AS中通常设置为 ρ =0.5,Δτij是第k只蚂蚁在它经过的边上释放的信息素量,它等于蚂蚁k本轮构建路径长度的倒数。C^k表示路径长度,它是R^k中所有边的长度和。

构建图:构建图与问题描述图是一致的,成份的集合C对应着点的集合(即:C=N),连接对应着边的集合(即L=A),且每一条边都带有一个权值,代表点i和j之间的距离。

约束条件:所有城市都要被访问且每个城市最多只能被访问一次。

信息素和启发式信息:TSP 问题中的信息素表示在访问城市i后直接访问城市j的期望度。启发式信息值一般与城市i和城市j的距离成反比。

解的构建:每只蚂蚁最初都从随机选择出来的城市出发,每经过一次迭代蚂蚁就向解中添加一个还没有访问过的城市。当所有城市都被蚂蚁访问过之后,解的构建就终止。

 

 

 

蚁群算法存在缺陷

蚁群算法在解决小规模TSP问题是勉强能用,稍加时间就能发现最优解,但是若问题规模很大,蚁群算法的性能会极低,甚至卡死。所以可以进行改进,例如精英蚂蚁系统。

精英蚂蚁系统是对基础蚁群算法的一次改进,它在原AS信息素更新原则的基础上增加了一个对至今最优路径的强化手段。在每轮信息素更新完毕后,搜索到至今最优路径的那只蚂蚁将会为这条路径添加额外的信息素。精英蚂蚁系统引入 这种额外的信息素强化手段有助于更好的引导蚂蚁搜索的偏向,使算法更快收敛

二、代码

  1. % Ant main program
  2. clear all;
  3. close all;
  4. clc;
  5. tic;
  6. Ant=25;%蚂蚁数量
  7. Ger=120;%迭代次数
  8. first_address = [
  9. 100,10
  10. 150,10
  11. 180,30
  12. 200,10
  13. 200,200
  14. 200,220
  15. 180,240
  16. 180,270
  17. 150,270
  18. 100,240
  19. 80,240
  20. 50,270
  21. 200,300
  22. 10,300
  23. 10,270
  24. 10,240
  25. 10,200
  26. 10,10
  27. 50,30
  28. 100,10
  29. ];%first_address表示测试数据中的节点坐标
  30. SumOfCity = size(first_address,1);%节点个数
  31. length_address =10000.*ones(SumOfCity,SumOfCity);%length_address表示两两节点间的距离,初始设定10000,可以设定无穷大,表示不相连
  32. length_address(1,2)=377;%表示节点1和节点2的距离
  33. length_address(2,4)=190;
  34. length_address(2,3)=100;
  35. length_address(3,4)=101;
  36. length_address(4,5)=240;
  37. length_address(5,17)=1932;
  38. length_address(5,6)=70;
  39. length_address(6,13)=200;
  40. length_address(6,7)=63.1;
  41. length_address(7,10)=377;
  42. length_address(7,8)=87.5;
  43. length_address(8,9)=100;
  44. length_address(10,11)=8;
  45. length_address(9,10)=170.8;
  46. length_address(9,12)=332.9;
  47. length_address(11,12)=168.8;
  48. length_address(11,16)=375.2;
  49. length_address(12,15)=135.1;
  50. length_address(13,14)=458;
  51. length_address(14,15)=100;
  52. length_address(15,16)=86.7;
  53. length_address(16,17)=187.5;
  54. length_address(17,18)=639.8;
  55. length_address(18,20)=510.5;
  56. length_address(18,19)=200.1;
  57. length_address(19,20)=246.8;
  58. for n=1:size(first_address)
  59. for m=1:size(first_address)
  60. if length_address(n,m)~=10000
  61. length_address(m,n)=length_address(n,m); %对称矩阵
  62. end
  63. end
  64. end
  65. power=length_address;%距离
  66. [PM PN]=size(power);%距离矩阵大小,行列个数
  67. % %% 画出节点分布图形
  68. % figure(1);
  69. % grid on;
  70. % hold on;
  71. % scatter(first_address(:,1),first_address(:,2));
  72. % for i=1:PN
  73. % for j=1:PN
  74. % if(length_address(i,j)~=10000)
  75. % line([first_address(i,1),first_address(j,1)],[first_address(i,2),first_address(j,2)],'Color','g');%划线
  76. % text((first_address(i,1)+first_address(j,1))/2,(first_address(i,2)+first_address(j,2))/2,num2str(length_address(i,j)));%标注线段距离
  77. % end
  78. % end
  79. % end
  80. % 初始化蚂蚁位置
  81. v=init_population(Ant,PN);
  82. v(:,1)=1;%起点
  83. v(:,PN)=1;%终点
  84. fit=short_road_fun(v,power);%求每条路径的距离
  85. T0 = max(fit)-fit;
  86. % 初始化
  87. vmfit=[];
  88. vx=[];
  89. P0=0.2; % P0----全局转移选择因子
  90. P=0.8; % P ----信息素蒸发系数
  91. %C=[];
  92. % 开始寻优
  93. for i_ger=1:Ger
  94. lamda=1/i_ger; % 转移步长参数
  95. [T_Best(i_ger),BestIndex]=max(T0);
  96. for j_g=1:Ant % 求取全局转移概率
  97. r=T0(BestIndex)-T0(j_g);
  98. Prob(i_ger,j_g)=r/T0(BestIndex);
  99. end
  100. %对100只蚂蚁进行路径的转变
  101. for j_g_tr=1:Ant
  102. %路径进行改变,该路径存放到temp变量,1表示经过该列所在的节点数
  103. if Prob(i_ger,j_g_tr)<P0
  104. M=rand(1,PN)<lamda;
  105. temp=v(j_g_tr,:)-2.*(v(j_g_tr,:).*M)+M;
  106. else
  107. M=rand(1,PN)<P0;
  108. temp=v(j_g_tr,:)-2.*(v(j_g_tr,:).*M)+M;
  109. end
  110. temp(:,1)=1;%起点和终点必须有蚂蚁存在
  111. temp(:,end)=1;
  112. %判转变后的临时路径距离是否小于原来的路径,是的话就将该蚂蚁的路径进行转换成temp中存放的路径
  113. if short_road_fun(temp,power)<short_road_fun(v(j_g_tr,:),power)
  114. v(j_g_tr,:)=temp;
  115. end
  116. end
  117. %信息素更新
  118. [sol,indb]=min(fit);
  119. v(1,:)=v(indb,:);%第一只蚂蚁的路径保存最小路径
  120. media=mean(fit);
  121. vx=[vx sol];%存放每一代最小的距离
  122. % vmfit=[vmfit media];
  123. end
  124. % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
  125. %%%% 最后结果
  126. % 显示最优解及最优值
  127. % v(indb,:)
  128. disp(sprintf('Code of shortroad is: %s',num2str(v(indb,:))));
  129. disp(sprintf('\n')); %空一行
  130. disp(sprintf('Shortroad is: %s',num2str(find(v(indb,:)))));
  131. disp(sprintf('Mininum is: %d',sol));
  132. route=find(v(indb,:));
  133. % 画出节点分布图形
  134. figure(2);
  135. grid on;
  136. hold on;
  137. for i=1:PN-1
  138. plot(first_address(i,1),first_address(i,2),'bo','MarkerSize',10);
  139. str=num2str(i);
  140. text(first_address(i,1)-10,first_address(i,2)+10,str,'Color','red','FontSize',15);
  141. end
  142. m=length(route);
  143. for i=1:m
  144. plot(first_address(route(i),1),first_address(route(i),2),'MarkerSize',10,'MarkerEdgeColor','k','MarkerFaceColor',[0.5,0.5,0.5]) ;
  145. hold on;
  146. end
  147. for i=1:PN
  148. for j=1:PN
  149. if(length_address(i,j)~=10000)
  150. line([first_address(i,1),first_address(j,1)],[first_address(i,2),first_address(j,2)],'Color','g','LineWidth',5);%划线
  151. text((first_address(i,1)+first_address(j,1))/2,(first_address(i,2)+first_address(j,2))/2,num2str(length_address(i,j)));%标注线段距离
  152. end
  153. end
  154. end
  155. %% 最短路径
  156. for p=1:m-1
  157. if(route(p+1)~=20)
  158. 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',5);%划线
  159. 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))));%标注线段距离
  160. else
  161. line([first_address(route(p),1),first_address(1,1)],[first_address(route(p),2),first_address(1,2)],'Color','r','LineWidth',5);%划线
  162. 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))));%标注线段距离
  163. end
  164. end
  165. axis([0 250 0 400])
  166. % 图形显示最优及平均函数值变化趋势
  167. % figure(3);
  168. % plot(vx);
  169. % title('最优,平均函数值变化趋势');
  170. % xlabel('Generations');
  171. % ylabel('f(x)');
  172. % hold on;
  173. % plot(vmfit,'r');
  174. % hold off;
  175. runtime=toc

完整代码添加QQ1575304183

 

原文链接:https://blog.csdn.net/weixin_50197058/article/details/117633642



所属网站分类: 技术文章 > 博客

作者:jjjjjjjj

链接:http://www.phpheidong.com/blog/article/89421/e91e06b5d83f5aabdb4a/

来源:php黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

12 0
收藏该文
已收藏

评论内容:(最多支持255个字符)