外賣配送是運籌優化算法重要應用領域,它的主要特色是併發高、延時低,爲了解決這樣的問題須要對業務進行深刻理解,設計定製化優化手段。原計劃時機成熟的時候進行解讀,因爲屬於以前團隊的商業核心機密,計劃暫時擱置。去年前同事發了一篇paper(A Two-Stage Fast Heuristic for Food Delivery Route Planning Problem),十分清晰明瞭。鑑於此本文再也不狗尾續貂,僅作翻譯,一是方便後來者閱讀,二也對以前的工做作一次回顧。算法
在外賣場景,用戶在外賣平臺點單以後,訂單信息會推送至商家確認接單,以後進入履約環節。調度系統對訂單進行指派和路徑規劃,外賣配送員根據訂單指派完成取餐和送餐任務。編程
而在配送問題中,路徑規劃是基本且重要的一個環節,它直接決定騎手服務路線的長度和時間,從而對訂單的準時率、客戶滿意度都產生影響。下圖是配送中騎手服務的路徑規劃示意圖,該騎手身上有5個訂單,其路徑規劃結果爲:取(4個)⟶
送(2個)⟶
取(1個)⟶
送(3個)。windows
目前,路徑規劃主要存在以下困難:併發
2.38×1015
種,想要在有限時間內求解是極困難的。學界與配送場景下的路徑規劃問題相關的研究主要集中於PDPTW問題(pickup and delivery problem with time-windows),它考慮多個騎手和多個客戶,每一個客戶的訂單包含一個取點與一個送點,騎手按規定順序訪問各個節點完成訂單的服務,從而達到某些目標函數(例如總行駛距離)的最優。求解PDPTW問題的算法包括:列生成算法(column generation)、分支切割(branch-and-cut)、分支切割訂價(branch-and-cut-and-price)等精確計算算法,禁忌搜索(tabu search)、模擬退火(simulated annealing algorithm)、基於插入搜索的算法(insertion-based heuristic)、自適應大鄰域搜索(adaptive large neighborhood search)、變深度搜索(variable-depth search algorithm)。因爲在配送場景下,對算法時效性有極高的要求,上述算法均沒法適用於配送場景的問題。在後文中,咱們將介紹路徑規劃的問題模型,以及提出的啓發式算法(Two-Stage Fast Heuristic),同時給出了一些仿真結果。編程語言
背景中提到的配送場景下的路徑規劃問題能夠被簡化建模成單車輛PDPTW問題(single vehicle pickup and delivery problem with time-windows),即原PDPTW問題的單車輛簡化(僅有一個騎手)。下圖表示單車輛PDPTW問題研究中的一條典型路徑。其中t_i
爲每一個送點的預計送達時間(ETA,Estimated Time of Arrival),當訂單產生時,t_i
即被告知給商家和客戶。T_i
表示預估送達時間(ETR,Estimated Time of Route),由路徑規劃算法計算得出。d_i
爲點i−1
到點i
的距離。函數
本文中咱們考慮最小化訂單超時時間與路徑長度,即目標函數爲,該問題有兩個約束:優化
TSFH(Two-Stage Fast Heuristic)主要包括兩個階段spa
⟶
採用貪婪插入策略與基於地理信息的加速策略⟶
兩種鄰域分別對「最超時」和「最不超時」訂單進行調整貪婪插入初始化主要包括如下步驟:.net
下圖爲初始化中貪婪插入的一個例子,在插入第二個訂單時,咱們有6種插入方案,根據目標函數最小原則,(A)爲最優插入方案。翻譯
當全部點都完成插入後,便獲得一個可行解。
觀察商家和客戶的地理信息能夠發現,商家之間可能距離很近(例如中心商業區域所含的商家可能服務半徑5km之內的60%的客戶),客戶也是如此(多個客戶可能位於同一個小區或樓宇)。所以咱們能夠經過分層聚類的方法將取送點聚類爲不一樣的集羣,經過對這些集羣進行分析,咱們能夠減小無效插入,提升貪婪插入初始化的速度。根據引理1,2能夠獲得加速策略以下:若節點j被分到組i,則最好的插入策略是將其插入組i,或是組i以後的組之間。
下面分別介紹聚類算法以及相關引理。
【聚類算法】 令D爲聚類範圍(例如D=100m),按照如下邏輯對各個節點進行聚類:
i
未被分類,則節點i
產生一個新組,並變成該組的中心點j
,若是節點j
沒有被分類,且d_ij<D
,則j
被分到組i
j
被分到組k
,且j
不是中心點,若是d_ij<d_kj
,則將j
從新分至組i
【Lemma 1】將節點插入所在組以前的組: 若是節點j
被分至組i
,則將節點j
插入到組i
以前的任何組必定劣於將節點j
插入組i
Proof: 節點j
屬於組i
,則將節點j
插入到組i
以前的任何組k
必定不如將節點j
直接插入組i
,由於路徑長度變長了,但no delivery point benefits from shorter delays.
下圖給出了一個例子,取點和送點被分紅了三個組,假設藍色組與橙色組的點已經完成插入,咱們考慮綠色組的節點的插入。從圖中能夠看到,將節點插入所在組以前的組(B)老是比插入本身所在的組(A)更差,由於騎手路徑長度變長,客戶處可能會出現更高的超時。
【Lemma 2】將節點插入所在組以後的組: 若是節點j
被分至組i
,則咱們總能夠找到一個插入方案優於將節點j
插入到組i
以後的組k
Proof: 節點j
屬於組i
,則將節點j
插入到組i
以後的組k
必定不如將節點j
插入組k
和組k+1
之間(若是k
是最後一個組,則插入到最後位置),由於路徑長度變長了,但no delivery point benefits from shorter delays.
下圖給出了一個例子,取點和送點被分紅了三個組,假設橙色組與綠色組的點已經完成插入,咱們考慮藍色組的節點的插入。從圖中能夠看到,將節點插入所在組以後的組之間(B)必定比插入到最後位置(A)更差,由於騎手路徑長度變長,客戶處可能會出現更高的超時。
在初始化結束後,局部搜索經過在初始解的鄰域範圍內進行搜索來提升解的質量。咱們的算法考慮兩種類型的鄰域:
注:每次局部搜索找到一個更好的解時,當前最優解即被替換。
本節給出一些仿真結果。首先咱們比較了帶有加速策略初始化與不帶加速策略初始化的結果,以驗證初始化中加速策略的有效性。以後,咱們將TSFH產生的解與暴力算法獲得的最優解進行比較,從而驗證TSFH產生近似最優解的能力。最後,咱們將TSFH與目前最好的一些算法進行比較,驗證TSFH求解該問題的有效性。
算例從實際路徑規劃問題中均勻採樣獲得,根據取送點的數量分爲三類:「<10」, "10-20", ">20"。
算法的評價指標採用總分(Total Score)和平均時間(Average Time)。總分爲超時時間與路徑長度的和,平均時間爲一個算例的平均運行時間。
運行環境爲MacBook Pro with 2.2 GHz processors / 16 GB RAM in Mac-OS,編程語言爲Java,IDE爲Eclipse。
表一爲帶有加速策略初始化與不帶加速策略初始化的比較結果。能夠看出,加速策略有着明顯的效果。例如"10-20"算例的平均運行時間從0.37降至0.21,減小了43.2%。同時,從總分能夠看出,加速策略初始化的效果幾乎沒有受到影響,這證實加速策略不會以犧牲解的質量爲代價,能夠在短期內產生優良解。
問題規模較小時,該問題的最優解能夠經過暴力搜索算法來獲得。考慮n個取點和n個送點,不考慮容量約束的條件下,暴力搜索算法的複雜度爲。這裏咱們只提供「<10」算例的比較結果如表二。
能夠看出,對於「<10」的算例,TSFH僅需暴力算法運行時間的0.21%,便可達到幾乎同樣的效果。另外,「10-20」與「>20」算例的運行時間也均在毫秒級。在現實中,大部分狀況均可被「<10」和「10-20」的算例覆蓋,所以這代表TSFH足以在毫秒數量級內解決配送中的路徑規劃問題。
TSFH與variable-depth search (VDS)、simulated annealing (SA)的比較結果如表三。能夠看出TSFH在總分和平均時間兩方面都優於VDS和SA。在「<10」算例中,TSFH達到了近似最優解,僅比最優解高0.7%,而VDS和SA分別高了29.4%和35.7%。另外,TSFH求解「<10」算例的平均時間爲0.41ms,而VDS和SA分別爲3.51ms和25.64ms。配送環境中的路徑規劃對於算法的運行速度有着極高的要求,TSFH能夠在1ms內完成「<10」算例的求解,而VDS和SA的運行時間均沒法接受。所以,TSFH是比VDS和SA更好更有效的算法,也更適用於配送環境下的路徑規劃問題求解。
本篇文章將外賣配送環境下的路徑規劃問題建模爲單車輛PDPTW問題。與傳統求解單車輛PDPTW問題的算法不一樣,本篇提出了一種兩階段快速啓發式算法(TSFH)。在第一階段,經過貪婪初始化獲得一個可行的優良解。根據顧客和商戶的地理位置信息,設計了一種加速策略,在節點調整時避免了無效插入。在第二階段,經過在當前解的兩種鄰域內進行搜索,解的質量獲得了進一步提高。
仿真結果代表,TSFH與暴力搜索算法、VDS、SA相比,在解的質量和運行時間方面均有着極大的優點。同時,TSFH具有在毫秒數量級內產生近似最優解的能力,適用於配送場景下路徑規劃問題的求解。