本文來源於公眾號【程序猿聲】,作者舟寒丶
前言
一眨眼春節又過去了,相信很多同學也和小編一樣,度過了一段時間相對輕松的時光。
當然,玩耍過后也不能忘記學習。本着造福人類的心態,小編又開始干活,為大家帶來 有 · 趣 的干貨算法內容了!
本期為大家帶來的內容是蟻群算法,解決大家熟悉的帶時間窗的車輛路徑規划問題。關於蟻群算法,公眾號內已經有相關內容介紹TSP:
干貨 | 十分鍾快速搞懂什么是蟻群算法(Ant Colony Algorithm, ACA)(附代碼)
本文主要分為以下部分:
蟻群算法簡介
蟻群算法與VRPTW
代碼測試
筆記總結
蟻群算法簡介
蟻群系統(Ant System或Ant Colony System)一種群體仿生類算法,靈感來源於在螞蟻覓食的過程。學者們發現,單個螞蟻的行為比較簡單,但是蟻群整體卻可以體現一些智能的行為,例如可以在不同的環境下找到到達食物源的最短路徑。
經進一步研究發現,螞蟻會在其經過的路徑上釋放一種可以稱之為“信息素”(phenomenon)的物質,蟻群內的螞蟻對信息素具有感知能力,它們會沿着信息素濃度較高路徑行走,而每只路過的螞蟻都會在路上留下信息素。這樣經過一段時間后,整個蟻群就會沿着最短路徑到達食物源了。
蟻群算法通過模仿螞蟻“每次在經過的較短路徑上留下信息素”的行為,通過信息素記錄下較優結果,不斷逼近最優解。
蟻群算法與VRPTW
VRPTW在之前的推文里已經提到過多次了,這里不再詳細介紹。感興趣的朋友可以看過去的推文:
禁忌搜索算法求解帶時間窗的車輛路徑規划問題詳解(附Java代碼)
通過上面的介紹,大家不難想到,蟻群算法的關鍵在於信息素的利用。在蟻群尋找食物時,每次都由一只螞蟻從頭開始尋找(不同於禁忌搜索或遺傳算法的鄰域動作);每次尋找的不同點在於信息素的改變:不斷靠近信息素較濃的路徑。
用蟻群算法解決VRPTW的過程主要分為以下幾步:
1.初始化螞蟻信息(以下用agents表示);
2.為每位agents構造完整路徑;
3.更新信息素;
4.迭代,保存最優解。
算法的關鍵在第二步:構造解時該如何查找下一個服務的客戶。
我們用以下公式計算客戶j被服務的概率:
代碼測試
這次代碼是由小編親自編寫的,由於是第一次編寫ACS的VRPTW代碼,有不周之處還請多包涵。
因為小編太懶了,具體代碼就不在此展示了,有興趣的朋友可以在公眾號內輸入【ACSVRP】不帶【】即可下載對應Java代碼。
這里展示一下代碼的運行情況。對Solomon Benchmark C101算例的測試效果如下:
25點(迭代次數1000,算例最優解191.3):
50點(迭代次數1000,算例最優解362.4):
100點(迭代次數1000,算例最優解827.3):
從測試數據來看,結果似乎不是很好。。。不過,VRPTW僅是一個載體,目的是為了深入了解蟻群算法的運行機制。
小編在測試時發現,參數設置地不同對結果還是有一定影響的。算法偶爾會跑出單個點構成的路徑,小編認為應該加大時間窗對應參數w_2,效果有一些提升。推薦的參數已經默認設置在代碼中。
同時,蟻群算法也有其他仿生類算法的特點,比較容易早熟。這點在測試100點數據是尤為明顯,全局最優解可能與前100次迭代的最優解相同。
筆記總結
大致了解了蟻群算法對VRPTW的求解過程后,我的第一感覺是,和禁忌搜索的思路其實很像:兩者都是利用過去搜索的“記憶”指導下一步走向。禁忌禁止一些方向,信息素引導一些方向。但兩者又有很大區別:禁忌搜索作為鄰域搜索類算法,每次都在舊解里變換出新解;蟻群算法卻需要重新派出螞蟻走完全程。對比之下,每次迭代時蟻群算法可能需要跟更多花費時間。從測試結果來看,蟻群算法確實沒有禁忌搜索高效。當然,這可能和小編個人編寫代碼的能力有關。
但不可否認的是,大自然的智慧確實不同尋常,在每一個領域都閃耀着光輝,如此美妙絕倫。
(小小的螞蟻,也蘊藏着讓人意想不到的智慧呢!)
那么本期的內容差不多就到此為止了。如果感覺還不夠明白,可以登錄公眾號【程序猿聲】,輸入【ACSVRP】不帶【】,即可獲取相關Java代碼,再作研究。