1. 程式人生 > >蟻群優化演算法的JAVA實現

蟻群優化演算法的JAVA實現

蟻群演算法簡介

蟻群演算法是群智慧演算法的一種,所謂的群智慧是一種由無智慧或簡單智慧的個體通過任何形式的聚集協同而表現出智慧行為,它為在沒有集中控制且不提供全域性模型的前提下尋找複雜的分散式問題求解方案提供了基礎,比如常見的螞蟻覓食,大雁南飛等行為。蟻群演算法是模擬自然界中螞蟻覓食的一種隨機搜尋演算法,由Dorigo等人於1991年在第一屆歐洲人工生命會議上提出[1]

蟻群演算法的生物原理

通過觀察發現,蟻群在覓食的時候,總能找到一條從蟻巢到食物之間的一條最短的路徑。這個現象引起了生物學家的注意,根據研究,原來是螞蟻在行進的過程中,會分泌一種化學物質——資訊素,而螞蟻在行進時,總是傾向於選擇資訊素濃度比較高的路線。這樣,在蟻巢和食物之間假如有多條路徑,初始的時候,每條路徑上都會有螞蟻爬過,但是隨著時間的推遲,單位時間內最短的那條路上爬過的螞蟻數量會比較多,釋放的資訊素就相對來說比較多,那麼以後螞蟻選擇的時候會大部分都選擇資訊素比較多的路徑,從而會把最短路徑找出來。

蟻群演算法正是模擬這種蟻群覓食的原理,構造人工螞蟻,用來求解許多組合優化問題。

有關蟻群演算法的詳細資訊,可參考[2]——[5]。

蟻群演算法的JAVA實現

我個人認為利用JAVA編寫一些計算密集型的演算法不是一個好的選擇。本身一些演算法是要要求高效率的,但是我感覺JAVA語言的效能不夠,所以編寫演算法最好用c,其次也可以用c++。當然,這僅是一家之言,歡迎拍磚。

此處使用JAVA的原因是為了演示演算法的框架,給出一種思路,如果需要c++的參考,可以參考 http://fashionxu.blogchina.com,如果需要c的程式碼,可以上 http://iridia.ulb.ac.be/~mdorigo/ACO/ACO.html, 這個可以看作是ACO的官方網站了,裡面的內容比較多。

演算法說明

演算法以求解TSP問題為例,用來演示ACO的框架。

演算法設定了兩個類,一個是ACO,用來處理檔案資訊的讀入,資訊素的更新,路徑的計算等;另一個是ant,即螞蟻的資訊。

演算法中用到的資料,可以從TSPLib 上面下載,使用的是對稱TSP資料,為了簡化演算法的程式碼,下載下來的資料需要做一個簡單處理,即把TSP檔案中除去城市節點資訊部分之外的內容都刪除掉,然後在檔案首插入一行,寫入此檔案包含的城市的數目,以att48.tsp為例,下載下來的檔案內容如下:

NAME : att48
COMMENT : 48 capitals of the US (Padberg/Rinaldi)
TYPE : TSP
DIMENSION : 48
EDGE_WEIGHT_TYPE : ATT
NODE_COORD_SECTION
1 6734 1453
2 2233 10
3 5530 1424
4 401 841
5 3082 1644
6 7608 4458
7 7573 3716
8 7265 1268
9 6898 1885
10 1112 2049
11 5468 2606
12 5989 2873
13 4706 2674
14 4612 2035
15 6347 2683
16 6107 669
17 7611 5184
18 7462 3590
19 7732 4723
20 5900 3561
21 4483 3369
22 6101 1110
23 5199 2182
24 1633 2809
25 4307 2322
26 675 1006
27 7555 4819
28 7541 3981
29 3177 756
30 7352 4506
31 7545 2801
32 3245 3305
33 6426 3173
34 4608 1198
35 23 2216
36 7248 3779
37 7762 4595
38 7392 2244
39 3484 2829
40 6271 2135
41 4985 140
42 1916 1569
43 7280 4899
44 7509 3239
45 10 2676
46 6807 2993
47 5185 3258
48 3023 1942
EOF

修改之後,內容變為如下:

48
1 6734 1453
2 2233 10
3 5530 1424
4 401 841
5 3082 1644
6 7608 4458
7 7573 3716
8 7265 1268
9 6898 1885
10 1112 2049
11 5468 2606
12 5989 2873
13 4706 2674
14 4612 2035
15 6347 2683
16 6107 669
17 7611 5184
18 7462 3590
19 7732 4723
20 5900 3561
21 4483 3369
22 6101 1110
23 5199 2182
24 1633 2809
25 4307 2322
26 675 1006
27 7555 4819
28 7541 3981
29 3177 756
30 7352 4506
31 7545 2801
32 3245 3305
33 6426 3173
34 4608 1198
35 23 2216
36 7248 3779
37 7762 4595
38 7392 2244
39 3484 2829
40 6271 2135
41 4985 140
42 1916 1569
43 7280 4899
44 7509 3239
45 10 2676
46 6807 2993
47 5185 3258
48 3023 1942

這麼做僅是為了方便處理,也可以根據TSPLib給出的檔案格式而自己寫程式碼讀取。

演算法流程圖

此處實現的演算法應該是AS(Ant System),其演算法流程如下:

演算法程式碼

一些額外說明

演算法只是提供了一個框架,沒有對演算法做優化處理,也沒有做一些錯誤檢查之類的,因此在實際執行時難免可能會有出錯的時候,請使用者注意。

參考文獻

[1]M. Dorigo, V. Maniezzo and A. Colorni, Positive Feedback as a Search Strategy. Technical Report No. 91-016, Politecnico di Milano, Italy, 1991. Later published as Optimization by a colony of cooperating agents, IEEE Transactions on Systems, Man, and Cybernetics-Part B, 26(1):29-41,1996. TR.01-ANTS-91-016.ps.gz , IJ.10-SMC96.pdf

[2]M. Dorigo, V. Maniezzo & A. Colorni, Ant System: Optimization by a colony of cooperating agents. IEEE Transactions on Systems, Man, and Cybernetics-Part B, 26(1):29-41,1996. IJ.10-SMC96.pdf

o [3]Dorigo, Stutzle M. T.,張軍譯.蟻群優化.北京:清華大學出版社,2007
[4]http://www.aco-metaheuristic.org/
[5]http://iridia.ulb.ac.be/~mdorigo/HomePageDorigo/