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