路徑規劃 CH演算法

2021-10-12 12:33:04 字數 2924 閱讀 9418

1 ch演算法的基本原理

ch(contraction hierarchies)演算法是 robert geisberger、peter sanders、dominik schultes及daniel delling於2023年發布的,它是一種用於查詢圖形中最短路徑的加速技術。最直觀的應用是汽車導航系統:使用者希望使用最快的路線從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)「自上而下」式。自上而下的啟發式演算法會在第乙個節點收縮之前預先計算整個節點的順序,這樣可獲得更好的結果,但需要更多的預處理時間。該方法認為在許多最短路徑中包含的頂點比僅在一些最短路徑中包含的頂點更重要。這可以使用巢狀解剖來近似。要計算巢狀的解剖,可以將圖遞迴地分為兩部分,然後將它們本身分為兩部分,依此類推。

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

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的演算法相似,但有一條額外的規則:我們僅搜尋收縮順序比當前節點高的節點。在視覺化中,這意味著我們僅搜尋向上傾斜的邊。

最短路徑演算法CH

ch的思路 contraction hierarchies 預處理生成乙個多層的結構,每個點都處在單獨的一層。事先對點進行優先順序排序 怎麼排都行,但是排序的好壞直接影響到預處理的效率以及搜尋的效率。舉個例子,鄰接點個數 點的優先順序 高低 是人為指定的,根據優先順序從低到高依次選點進行contra...

路徑規劃演算法 A 演算法

a a star 演算法是一種靜態路網中求解最短路徑最有效的直接搜尋方法,也是解決許多搜尋問題的有效演算法。演算法中的距離估算值與實際值越接近,最終搜尋速度越快 astar演算法是從起點開始一步步的往終點探索。他有兩個鍊錶open鍊錶和close鍊錶。每探索 本文稱之為 擴充套件 乙個點n時,就獲取...

路徑規劃(二) A 演算法

2.這是一篇關於a演算法的詳細講解,是一片譯文,但是翻譯的很棒。寫的非常詳細,對a演算法的原理 流程和實現為程式的時候需要額外考慮的東西。a 譯文隨筆筆記 4.這是一篇a 的外文介紹,非常之詳細。有可控制的動畫演示過程 優秀外文a介紹 4 機械人的前進方向 在機械人在位姿空間中的行走路線的規劃中,我...