Files
PetriNet-Path-Planning-Base…/蚁群算法代码.txt
2021-10-17 22:52:24 +08:00

259 lines
7.4 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

附录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