天天看點

Evolutionary Algorithm(EA)進化算法初探

問題

因工作需要,開始向算法的深水區邁進,其中就涉及到一種混合整數優化問題:CVRPTW 問題

Evolutionary Algorithm(EA)進化算法初探

cvrptw問題示例

顧名思義,CVRPTW 就是指帶限制條件和時間視窗限制的車輛路徑規劃問題,而加入了時間視窗的限制條件後,優化目标已不再是簡單的凹凸函數,這就意味着不能使用梯度下降、牛頓法等确定函數方法求解該問題(決策樹、神經網絡統統用不上了)

如果可以将CVRPTW的問題空間可視化的話,想象一下整個場景就是一個“喀斯特地貌”

Evolutionary Algorithm(EA)進化算法初探

之前習慣了确定方法求解凹凸問題,突然發現沒有“套路”可循後,頓時思維陷入了混亂

而一般的動态規劃問題求解器,或者混合整數求解器(google ortools、cplex等),隻能處理小規模(<100)的限制優化問題

而市面上能快速處理1000個節點的求解器已經算是優秀了,但往往都是收費且價格不菲

随着節點數的增長,需要探索的路徑,也會呈幾何級數增長,是以傳統的運籌學求解器,已在性能上無法滿足需求

進化算法

EA進化算法 是一類算法的統稱(包含遺傳算法、粒子群算法、蟻群算法、魚群算法、蝙蝠算法等等)

通過人工産生上千個種群個體、每一個體探索不同的路徑,通過上百次疊代,進而找到帕累托最優解(有限組合方案最優)

Evolutionary Algorithm(EA)進化算法初探

進化算法示例

這種設計模式,充分的利用了分析主機多核并行的能力,加快了求解的速度,在性能上能滿足大規模全局優化的需求

在解空間較小時,求解速度也很可觀,兼顧了求解的準确性

關于進化算法,網上已經有了很詳盡的資料,但資訊太多反而容易造成資訊過載,說多了等于沒說

是以進化算法推薦看如下兩篇文章就夠了:

http://geatpy.com/index.php/2019/07/28/%e7%ac%ac%e4%b8%80%e7%ab%a0%ef%bc%9a%e6%a6%82%e8%bf%b0/ https://www.jianshu.com/p/8fa044ed9267

其他的文章不是擺公式就是擺代碼,沒什麼意思

如果你覺得看這些文章也太麻煩,那我們就來個極簡版的白話進化算法入門:

這個世界上總有一類很難搞的問題,乍一看沒什麼規律,但各種限制,數學家稱之為NP hard問題

  求解NP hard問題,就隻能像探索迷宮一樣,在指定的範圍内不斷探索,速度和方向可能是不斷變化的

  指定的範圍就是搜尋空間

  而探索可以是多線程的

  探索的過程也可以是在之前經驗的基礎上不斷累加的           

這就是進化算法最直覺的了解

不管它套上什麼“遺傳”、“粒子群”、“蟻群”等等的現實類比的外衣,都改變不了上述工作原理的本質

這樣看來,進化算法的原理其實是很簡單的

搜尋設計

是以整個進化算法應用的關鍵,就是如何設計搜尋空間和搜尋行為

搜尋空間設計的大小,直接決定了計算量的大小

搜尋行為政策設計的好壞,直接決定了系統的搜尋效率

Evolutionary Algorithm(EA)進化算法初探

搜尋設計示例

回到我們最初的話題,CVRPTW 問題該如何設計呢?

談到具體的問題,網上就很少有相關介紹資料了,設計思想大多隐藏在比較學術論文裡,也讓我苦惱了一陣子

CVRPTW 搜尋設計

有幾種主流設計方法:

1.将VRP問題轉換為TSP問題,然後所有目标點逐一排列,形成一個龐大的排序空間,例如:[1,2,3,4,5,……],然後不斷随機搜尋

顯然,這樣導緻的結果就是會有n!種組合方案,n越大越糟糕,而且沒有考慮到TW時間視窗的限制

2.将VRP問題轉換為QAP問題,通過就近原則等一系列貪婪規則,形成初始可行解,然後不斷随機交換

這樣導緻的問題也是顯而易見的,貪婪規則的主觀性很強,很有可能漏掉部分解

Evolutionary Algorithm(EA)進化算法初探

一般設計思路示例

我的設計思路:

1.結合上述兩種思想,将CVRPTW問題轉換為限制優化問題;

2.最大限度的利用限制條件,形成盡可能小的搜尋空間;

3.最大限度的減小系統随機性,搜尋的每一步都盡可能的命中可行解;

4.在代價和目标之間做一個相對平衡的取舍;           

總結

說了以上一堆,你也許覺得我啥都沒說 :-)

是的,遇到NP hard問題,是沒有萬金油的,隻能自己coding去嘗試

關鍵把握住進化的四個階段,一切就都清洗了:

1.搜尋空間設計;2.搜尋政策設計;3.評價方法;4.新搜尋空間生成;

對應到術語層面就是:

1.種群初始化;2.基因編碼、種群選擇;3.評價函數設計;4.交換、變異;

最後推薦兩款架構,大家可以自行搜尋:deap, geat

https://github.com/DEAP/deap https://github.com/geatpy-dev/geatpy

這兩款架構都能很友善的實作你想要的進化算法

個人推薦deap,各個子產品的設計相對寬松和靈活

遺留問題

1.進化算法的搜尋速度:

疊代次數越多,找到的帕累托最優解更好,但很多生産場景其實是沒有足夠的時間留給模型慢慢摸索的

我也在不斷嘗試加速的可能

之前研究了AlphaGo及AlphaZero等技術,發現也是不能應用的,畢竟下棋或遊戲是确定性政策的動作,而車輛路徑中的上車點卻是不确定的

2.進化算法的計算規模:

不管進化算法怎麼疊代,總會受到計算規模的限制,縮小計算規模是是重中之重的工作

我也在不斷尋找有沒有可靠的降維政策理論和依據

以上,大家如有更好的解法,也請不吝賜教!

最後,祝大家在NP hard難搞的世界裡好運!;->

繼續閱讀