請問膜拜技術大牛除了獻上膝蓋還有什么更好的方式?答:可以把大家的膝蓋一起獻上,又或者好好學習天天向上,利用碎片化時間多為自己充電,一起參與技術的交流與探討。——四月,我們迎來了藍芯科技的開學季,我們將在此分享機器人相關技術知識。今天是開學第壹課《車輛路徑問題與算法》,歡迎大家留言一起探討。

一 、車輛路徑問題
在介紹 (Vehicle Routing Problem,VRP)問題前,先介紹它的一個特例,旅行商問題(Traveling Salesman Problem, TSP):有一個旅行商人,要拜訪n個城市,每個城市只能訪問一次,后返回到原來出發的城市。該商人要選擇一條路徑,路徑的選擇目標是旅程短。

圖1 TSP問題
車(che)(che)輛路徑(jing)問題(Vehicle Routing Problem,VRP)早是(shi)由(you)Dantzig和Ramser于1959年*提出,它是(shi)指一定(ding)數量有一定(ding)數量(n個)的客(ke)戶,各自有不同數量的貨物需(xu)求(qi),配送中心或(huo)車(che)(che)場(depot)向客(ke)戶提供(gong)貨物,由(you)一個車(che)(che)隊(m輛車(che)(che))負責分送貨物,組織適當(dang)的行(xing)車(che)(che)路線(xian),目標是(shi)使得客(ke)戶的需(xu)求得到滿足,并能在一定(ding)的約束下(例如車(che)(che)輛存在載荷上限(xian)Q、里程長度(du)上限(xian)L),達到總旅行(xing)成本小、耗費時(shi)間(jian)少等目的[1, 2]。

圖 2 VRP問題
在(zai)理解了車輛(liang)路徑問題后,接下來介紹幾個常用的路徑搜(sou)索算法。
二、路徑搜索算法
在路徑搜(sou)索算(suan)(suan)(suan)(suan)法(fa)(fa)中(zhong),常用的算(suan)(suan)(suan)(suan)法(fa)(fa)用Dijkstra算(suan)(suan)(suan)(suan)法(fa)(fa)和(he) A*算(suan)(suan)(suan)(suan)法(fa)(fa)。這里不對(dui)算(suan)(suan)(suan)(suan)法(fa)(fa)原理進行(xing)詳細(xi)介(jie)紹,僅簡(jian)單(dan)給(gei)出相應的使用示(shi)例。給(gei)出一個網格圖(tu)(tu),如圖(tu)(tu)3所(suo)示(shi)。在該網格圖(tu)(tu)中(zhong),僅橫、縱(zong)向相鄰網格可以(yi)通(tong)過,其(qi)中(zhong)黑色背(bei)景網格不可通(tong)過。在網各圖(tu)(tu)中(zhong),每移動一格會增加一個單(dan)位成(cheng)本。現給(gei)定一個起點(dian)(46)和(he)終點(dian)(49),通(tong)過Dijkstra算(suan)(suan)(suan)(suan)法(fa)(fa)和(he)A*算(suan)(suan)(suan)(suan)法(fa)(fa)分別求(qiu)解短路徑。

圖 3網格圖示例
2.1 Dijkstra算法
該算法的思想是從起點開始,每次新擴展一個距離短的點,并更新從起點到該點的距離與路線。直到拓展到終點,并且往其他方向拓展點的距離不比該點的距離更近時停止。對圖 3 的求解過程如圖4所示。終的路線是
。

圖 4 Dijkstra算法拓展過程
2.2 A*算法在Dijkstra中,當前拓展到的點的距離為從起點到當前點的實際短距離。而A* 算法與 Dijkstra相比增加了一個啟發項,即在計算當前點的路線距離時,使用從起點到當前點的實際短距離加上從當前拓展的點到終點的估計距離。因此,在實際距離相同時,估計距離近的點優先繼續拓展。使用A*算法對圖3 的求解結果如圖5 所示。終的路線是

圖 5 A*算法拓展過程示例
2.3 多訪問點的路徑搜索算法
前面提到的Dijkstra和 A*算法主要是針對兩個點(起點、終點)尋找一條短路徑,但是對于多訪問點找短路的問題,比如在文初提到的TSP問題,就不適用了。我們開發了一個快速求解的算法。
我們首先使用 Dijkstra算法找出所有兩點之間的短路并存儲相應的路線信息。然后針對多訪問點尋短路問題,分兩個階段進行搜索。
第壹階段:基于動態規劃(DP)求解 TSP的框架,控制初始搜索步長快速得出初始解。
第二階段:對第壹階段得到的初始解使用變鄰域搜索(VND)進行優化。
假設我們有1個出發點(編號為
)和6個訪問點(編號為
),車輛從
出發(fa),需要完(wan)成對所有(you)訪(fang)問點的(de)(de)訪(fang)問。如果終讓車輛停留在后一個訪(fang)問點的(de)(de)訪(fang)問點,這(zhe)就是一個開環的(de)(de)路徑,如果要求車輛必須返回出發(fa)地,則是閉(bi)環的(de)(de)路徑。這(zhe)里(li)假設為開環路徑,即認為路徑結(jie)束的(de)(de)標志是完(wan)成所有(you)任務中所有(you)訪(fang)問點的(de)(de)配貨(huo)。
因為(wei)一共有7個點(dian)(1個出發點(dian)加6個訪問點(dian)),所以(yi)搜(sou)索劃分為(wei)6個step,方向為(wei)從右至(zhi)(zhi)左(zuo)(從終點(dian)至(zhi)(zhi)起點(dian)),如圖6所示。

圖(tu) 6基于 DP框架(jia)的step示例
計算過程(cheng)為(wei)(wei),以后一(yi)列(lie)的點為(wei)(wei)終點,搜索第(di)壹個弧(arc),即step(1)的(de)(de)路(lu)徑,然后再(zai)增加一個 arc,即在(zai)step(1)的(de)(de)基礎上搜索(suo)step(2)的(de)(de)路(lu)徑,以(yi)此類推。假設以(yi)為終點(dian)進行(xing)搜索(suo),搜索(suo)中的(de)(de)部(bu)分過程如(ru)圖7所(suo)示。終搜索(suo)完(wan)step(6) 時會搜索(suo)出(chu)完(wan)整的(de)(de)路(lu)線(xian)。需要注(zhu)意的(de)(de)一點(dian)是(shi),一旦(dan)發現某條(tiao)路(lu)線(xian)不(bu)是(shi)可(ke)行(xing)解時(比如(ru)一個訪(fang)問點(dian)在(zai)路(lu)線(xian)中多(duo)次出(chu)現),后面可(ke)以(yi)不(bu)再(zai)基于此結果進行(xing)搜索(suo)。

圖7基于 DP框架的部分(fen)搜索過程(cheng)示例
我們這里控制了初始搜索步長len,意為從step(1) 到step(len) 搜索出的路徑是按照 DP的方式搜索到的當前精確合適的路線,而從step(len+1)開始,只記錄該step下的n條路徑中合適的結果。因此,當len的值越大,終搜索的結果越接近精確合適解,但是相應的求解時間也會越長。假設通過該階段終搜索出的合適結果為
,接下來將(jiang)基于(yu)此(ci)結(jie)果執(zhi)行變鄰域搜(sou)索操作。由(you)于(yu)是(shi)規定(ding)的(de)出發(fa)點需要保(bao)持在輸出路徑的(de)首先(xian)位置,因(yin)此(ci)我們對序列(lie)進行鄰域搜(sou)索。VND的(de)框架如圖8 所示。

圖 8 VND算法(fa)框架
在鄰域搜索中(zhong),常用的(de)變換(huan)策略有Reinsert、Exchange和(he)Reverse,如(ru)圖9所示。

圖(tu) 9 三種常(chang)見的鄰域變換策略
使用VND不斷地對序列變換得到新的序列,并求新序列的路徑成本。需要注意的是,求路徑成本時要將出發點考慮在內,即將出發點
添加到序列前,求該完整路徑的旅行成本。經過VND過程的處理,輸出的路線即作為終規劃的路線,例如一個可能的終輸出路徑果是
,需要注意的(de)(de)(de)是(shi),這里的(de)(de)(de)節(jie)(jie)點相當于是(shi)“關鍵節(jie)(jie)點”,即只包含的(de)(de)(de)出發點和(he)需要進行配貨操作(zuo)的(de)(de)(de)訪問點。而相鄰(lin)“關鍵節(jie)(jie)點”之間(jian)(jian)的(de)(de)(de)路(lu)(lu)線,則是(shi)根據前述的(de)(de)(de) Dijkstra計算的(de)(de)(de)兩點之間(jian)(jian)的(de)(de)(de)路(lu)(lu)線進行行駛。今(jin)天(tian)的(de)(de)(de)介紹(shao)就到這里,希(xi)望小(xiao)伙伴們能對路(lu)(lu)徑(jing)規劃問題和(he)算法有所了解和(he)收獲!
本文(wen)為杭州(zhou)藍芯科技有(you)限公司(si)原創文(wen)章,轉(zhuan)載(zai)請注(zhu)明出處
電話
微信掃一掃