干貨 | 蟻群算法求解帶時間窗的車輛路徑規划問題詳解(附Java代碼)


本文來源於公眾號【程序猿聲】,作者舟寒丶

前言

一眨眼春節又過去了,相信很多同學也和小編一樣,度過了一段時間相對輕松的時光。

當然,玩耍過后也不能忘記學習。本着造福人類的心態,小編又開始干活,為大家帶來 有 · 趣 的干貨算法內容了!

本期為大家帶來的內容是蟻群算法,解決大家熟悉的帶時間窗的車輛路徑規划問題。關於蟻群算法,公眾號內已經有相關內容介紹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):

image

50點(迭代次數1000,算例最優解362.4):

100點(迭代次數1000,算例最優解827.3):

從測試數據來看,結果似乎不是很好。。。不過,VRPTW僅是一個載體,目的是為了深入了解蟻群算法的運行機制。
小編在測試時發現,參數設置地不同對結果還是有一定影響的。算法偶爾會跑出單個點構成的路徑,小編認為應該加大時間窗對應參數w_2,效果有一些提升。推薦的參數已經默認設置在代碼中。

同時,蟻群算法也有其他仿生類算法的特點,比較容易早熟。這點在測試100點數據是尤為明顯,全局最優解可能與前100次迭代的最優解相同。

筆記總結

大致了解了蟻群算法對VRPTW的求解過程后,我的第一感覺是,和禁忌搜索的思路其實很像:兩者都是利用過去搜索的“記憶”指導下一步走向。禁忌禁止一些方向,信息素引導一些方向。但兩者又有很大區別:禁忌搜索作為鄰域搜索類算法,每次都在舊解里變換出新解;蟻群算法卻需要重新派出螞蟻走完全程。對比之下,每次迭代時蟻群算法可能需要跟更多花費時間。從測試結果來看,蟻群算法確實沒有禁忌搜索高效。當然,這可能和小編個人編寫代碼的能力有關。

但不可否認的是,大自然的智慧確實不同尋常,在每一個領域都閃耀着光輝,如此美妙絕倫。

(小小的螞蟻,也蘊藏着讓人意想不到的智慧呢!)

那么本期的內容差不多就到此為止了。如果感覺還不夠明白,可以登錄公眾號【程序猿聲】,輸入【ACSVRP】不帶【】,即可獲取相關Java代碼,再作研究。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM