導航規划之CH算法介紹


1 CH算法的基本原理

CH(Contraction Hierarchies)算法是 Robert Geisberger、Peter Sanders、Dominik Schultes及Daniel Delling於2008年發布的,它是一種用於查找圖形中最短路徑的加速技術。最直觀的應用是汽車導航系統:用戶希望使用最快的路線從A行駛到B。此處優化的指標是行駛時間。交叉路口由頂點表示,街道路段由邊連接。邊的權重代表沿着這條街道行駛所需的時間。從A到B的路徑是一系列邊(街道);最短的路徑是所有可能路徑中邊的權重總和最小的路徑。

graph中的最短路徑可以使用Dijkstra算法來計算,但考慮到道路網絡包含數千萬個頂點,這是不切實際的。CH算法是一種優化的加速方法,可以利用代表道路網絡的圖的特性。通過在預處理階段創建“shortcuts”來實現提速,然后在最短路徑查詢中使用這些“shortcuts”來跳過“不重要的”頂點。這是基於對道路網絡高度分層的觀察。與一些通向小區內部路的路口相比,某些路口(例如高速公路路口)在層次結構中“更重要”並且在層次上更高。“shortcuts”可用於保存兩個重要路口之間預先計算的距離,從而算法無需在查詢時考慮這些路口之間的完整路徑。CH不知道人類認為哪條道路“很重要”,但是它能夠使用啟發式方法計算出頂點的重要性。

CH方法不僅應用於汽車導航系統,而且還應用於Web和移動設備的路線規划、交通模擬和物流優化。有很多開源軟件實現了該算法,例如GraphHopper、OSRM及OpenTripPlanner。

CH算法包括路網預處理和查詢兩個階段。由於道路網絡很少更改,因此可以預先進行一些計算(幾秒鍾到幾小時),然后再進行查詢,查詢時間可以達到毫秒級。CH算法依靠“shortcuts”來實現這種加速。“shortcuts”線段連接兩個不相鄰的頂點 u和v,它的邊權重是最短u-v路徑上邊權重的總和。

考慮通過高速公路連接的兩個大城市。我們可以預先計算出兩個城市之間高速公路的連接路線,將它保存起來。之后每次查詢從一個城市到另一城市的路線時,只需要查詢到本城市高速出入口的路線即可。這種預先計算的優勢稱為“shortcuts”,在現實世界中沒有實際的路線。CH算法不了解道路類型,但是能夠根據輸入的圖形來確定創建哪些“shortcuts”。

2 關鍵技術

Shortcuts

CH算法依賴在預處理階段創建的“shortcuts”來減少搜索空間,即CH查詢時必須查看的頂點數,從而提高搜索效率。為達到這個目標,需要執行迭代式的頂點收縮。我們通過一次“收縮”一個節點來預處理圖形。為了執行收縮,我們計算出節點之間的每條最短路徑,並為其插入“shortcuts”,然后將節點標記為已處理。

這里用一個簡單的圖形來說明節點收縮前后的狀態,如圖1所示。為了收縮C,我們插入從A到E以及從A到B的“shortcuts”,因為A-> C-> E和A-> C-> B是最短的路線。 我們不需要插入從B到E的“shortcuts”,因為B-> C-> E不是從B到E的最短路徑,B-> D-> E較短。

圖1 node收縮示意圖

收縮並不是完全刪除節點,但是在其余的收縮過程中可以忽略該節點,因為當我們看到一條通向C的邊時,我們知道存在一條捷徑,或者它不是一條最短的路徑。無論哪種方式,我們都不需要訪問C。如果我們進行以C開頭或結尾的搜索,我們仍然可以找到它。

節點收縮順序

無論收縮順序如何,CH算法都會產生正確的結果,但是搜索效率如何取決於收縮順序。

主要有兩種啟發式方法來確定節點的收縮順序:

1)“自下而上”式。計算上更節省的自下而上的啟發式方法決定了以“貪吃”的方式收縮頂點的順序,這意味着順序是未知的,而是在前一個收縮完成后選擇下一個節點進行收縮。在自下而上的啟發式方法中,結合使用多種因素來選擇下一個頂點進行收縮。 由於“shortcuts”的數量是決定預處理和查詢運行時間的主要因素,因此我們希望使其盡可能小。因此,選擇下一個要收縮的節點時最重要的因素是收縮節點時添加的邊的凈數。

2)“自上而下”式。自上而下的啟發式算法會在第一個節點收縮之前預先計算整個節點的順序,這樣可獲得更好的結果,但需要更多的預處理時間。該方法認為在許多最短路徑中包含的頂點比僅在一些最短路徑中包含的頂點更重要。這可以使用嵌套解剖來近似。要計算嵌套的解剖,可以將圖遞歸地分為兩部分,然后將它們本身分為兩部分,依此類推。

節點收縮排序的基本方法是使用優先級隊列,該隊列的最小元素包含看起來最有收縮吸引力的節點。這里的優先級是幾個指標的線性組合,不同指標的線性系數很重要。通常情況下,我們更喜歡減少邊數量的收縮,做一個去除五條邊的收縮比僅去除四條邊的收縮更好!

node收縮的順序可以用以下一些指標來確定:

1)邊的差分(Edge Difference)

可以說ED是最重要的node收縮條件,它的計算如下:ED = node_degree-number_of_shortcuts

node_degree是連接到節點的邊的數量

number_of_shortcuts是在刪除節點后必須創建的shortcuts數量

ED值越大越先收縮

2)均勻度(Uniformity)

僅使用ED,會獲得相當慢的路徑規划。應當以均勻的方式收縮圖中所有位置的節點,而不是將收縮節點保持在較小的區域中。

3)收縮成本(Cost of contraction)

收縮的一個耗時部分是前向最短路徑搜索,以確定“shortcuts”的必要性。 因此,我們可以將搜索空間大小的總和用作優先項。

3 尋路過程

在查詢階段,從原始圖上的起始節點s和目標節點t開始進行雙向搜索,並通過預處理階段創建的“shortcuts”進行擴展。為了找到兩個節點之間的最短路徑,我們執行兩次搜索。一次從起始節點進行搜索,一次從結束節點進行搜索,然后我們看它們在哪里相遇。搜索過程與Djikstra的算法相似,但有一條額外的規則:我們僅搜索收縮順序比當前節點高的節點。在可視化中,這意味着我們僅搜索向上傾斜的邊。


免責聲明!

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



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