Files
PetriNet-Path-Planning-Base…/蚁群算法代码.txt

259 lines
7.4 KiB
Plaintext
Raw Permalink Normal View History

2021-10-17 22:52:24 +08:00
附录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