找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1420|回复: 0
打印 上一主题 下一主题
收起左侧

如何理解基于改进蚁群算法的机器人路径规划的matlab编程

[复制链接]
跳转到指定楼层
楼主
ID:452999 发表于 2020-3-27 13:56 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
600黑币
请问吧友能不能帮我讲解一下这个程序的步骤,有些地方看不懂,或者有相关程序的话,我想对比着参考理解

源程序如下:

  1. G= [0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0
  2. 0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0
  3. 0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0
  4. 0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0
  5. 0        1        0        0        1        0        1        0        0        1        0        1        1        0        1        1        0        0        0        0
  6. 0        0        0        0        1        0        1        0        0        1        0        0        0        0        0        0        0        0        0        0
  7. 0        0        0        0        0        0        0        0        0        0        0        0        0        0        1        0        0        0        0        0
  8. 0        1        0        0        1        0        1        0        0   1        0        0        0        0        1        0        0        0        0        0
  9. 0        0        1        0        1        0        1        0        0        0        0        0        1        0        0        0        0        0        0        0
  10. 0        0        0        0        0        0        0        0        0        1        0        0        0        0        0        0   0        0        0        0
  11. 0        1        0        0        1        0        1        0        0        1   0        0        1        0        0   0        0        0        0        0
  12. 0        0        0        0        0        0        0        0        0        0        0        1        0        0        0        0        0   0        0        0
  13. 0        0        0        0        1        0        1        0        0        1        0        1        0        0        1        1        0        0        0        0
  14. 0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0
  15. 0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0
  16. 0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0
  17. 0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0
  18. 0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0
  19. 0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0
  20. 0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0];

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

复制代码


ACO.rar

2.12 KB, 下载次数: 21

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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