路徑規劃演算法高階

2021-10-04 12:54:14 字數 2956 閱讀 8917

最早是在大學期間學習路徑規劃演算法,嚴蔚敏_吳偉民的《資料結構》講的最短路徑。當時感到有些晦澀難懂,並沒有理解演算法思想。回頭看,主要是因為應付考試,沒有和實際應用場景建立連線,所以體會不深。畢業後,因為從事地圖有關工作,又想到這些內容,然後複習、研究,總算明白其中道理。這些演算法能解決我們生活中遇到的實際問題,所以感到其價值很大。

原本早就想把路徑規劃演算法做個總結,想把用到的典型路徑規劃演算法從頭到尾梳理一遍,後來發現越寫越大,結構因此變得臃腫而混亂。而且,這些演算法的原理、實現步驟、使用場景等等都可以在網上找到,故茅塞頓開,何必再去重複做這些東西呢,既然很多資料已經很豐富,我再洋洋灑灑羅列一大堆,實在沒啥意義。因此,我改變思路,想結合這幾年工作經驗,把一些對演算法的理解、體會寫出來,興許能給需要的人一些些幫助。

這次,我主要分享三個典型算路演算法。從演算法原理到簡單應用,再到系統應用,體現的是不同使用階段,所以這篇文章題為「高階」。有關公式推導和示例**請自行查閱其他資料。

迪傑斯特拉演算法是典型的最短路徑演算法,用來計算乙個節點到其他各節點的最短路徑,解決有權圖的最短路徑問題。「權」可以指代距離、費用、時間、擁堵等。

對於圖g,也即路網,建立集合s和u,並使起點為v0。s中存放的是g中已求出最短路徑的節點,即,該集合從v0到其他節點的最短路徑均已確定,也可以理解成被訪問過節點的邊界範圍;u中存放的是g中還沒有求出最短路徑的節點。將s中節點按路徑長度由短到長進行排序。接下來就要通過遍歷方式找到下乙個從起點v0到u集合中存在最短路徑的乙個節點,判斷的規則是從s中路徑短的節點開始,找到其與u中所有直接相連的節點,計算v0到這些節點的路徑長度,選定長度最短的節點v。這裡要注意,找到v並不一定表示這就是v0到v的最短路徑,還要計算s中是否還有其他節點連線到v,如果有,則計算路徑長度,並與前面找到的路徑長度對比,如果長度比之長,則直接把v從u移到s,否則,選定該路徑為v0到v的最短路徑,並把v從u移到s。通過不斷遍歷前進,知道把u中所有節點轉移到s中,演算法結束,至此,從v0到g中其餘各節點的最短路徑均已產生。

上述過程描述可能不直觀,同學可以網上查閱其他材料,借助**解釋更容易理解。演算法的核心思想是從指定點開始,逐個擴散到與其相連節點,並判斷所有遍歷過的節點中是否有到達該點的更短距離,並以此為起點繼續擴散。因此,迪傑斯特拉演算法採用廣度優先策略,是一種典型的貪心演算法。

很多同學在求最短路徑時都是從學習迪傑斯特拉演算法開始的,如同路徑規劃界的啟蒙教育,所以它是乙個非常經典的演算法。但是,由於演算法計算過程中需要遍歷各節點,導致效率低,所以比較適合在資料量小的靜態場景中使用,而難以在工程上實用。

迪傑斯特拉算路採用廣度優先策略,是一種無序搜尋,這樣做了很多無用功。如何變得聰明些呢?

先說說bfs(最佳優先搜尋)。bfs用了啟發式函式,可以評估出當前點到終點的代價,它關注的是終點的位置。比如,終點在當前點東北方向,bfs會沿著這個方向前進。如果這條路上沒有障礙,bfs會很快到達終點,但如果路上有嚴重障礙,bfs依然會朝這個方向走,直到遇到障礙才做出避讓。因此,bfs可能找不到最短路徑,但是計算很快,迪傑斯特拉可以找到最短路徑,但是計算慢。

a-star吸收了迪傑斯特拉和bfs演算法各自有點,即能算出最短路徑,又可以加快計算速度。這其中的關鍵是引入了代價函式:f(n) = g(n) + h(n),g(n)表示節點n到起點的代價,h(n)表示n到終點的代價。g可以精確算出,h可以理解為啟發函式。a-star算路時,根據f評判n節點是否為最短路徑節點。判斷的邏輯和迪傑斯特拉演算法相同,只是把最短路徑的評判依據改為f。引入代價函式,演算法可以動態衡量已經花費的代價和預計代價,然後根據總代價最小原則找到最短路徑。可以看出,當g值更大時,a-star更像迪傑斯特拉演算法,當h更大時,a-star更像bfs,所以設計準確的代價表達是能否又快又準計算出最短路徑的關鍵。

工程應用時,常常採用雙向a星算路,同時從起點和終點出發,進行對向算路,當雙方相遇時,即表示得到一條合適結果。舉個形象的比喻:算路的查詢過程就像散開的樹,距離越長,樹越大(如果f函式定義準確,搜尋範圍偏差並不大);採用雙向算路就像散開的兩顆小樹,兩顆小樹的範圍加起來不會大於一顆大樹,原因就是在可能擴大搜尋範圍時兩者就相遇了,因此雙向算路比單向算路更快,達到1+1>2的效果。

詳情參考:

star演算法已經比較聰明了,但是在大規模工程應用中就顯得單薄了,比如用於導航算路的全國地圖資料,道路里程在百萬公里量級,其拓撲資訊是千萬級,規模極其龐大,如果還要a-star算路,一旦距離很長,比如從北京到廣州,算路過程會消耗很長時間,這是災難性的體驗。然而,我們在用各種網際網路地圖服務時,並沒有明顯感覺到因距離長短導致算路時長的變化。這其中關鍵是做了演算法加速!

以ch為例,將所有節點按重要程度預先生成乙個多層結構,按優先順序由低到高排序,形成金字塔形。比如,從北京某地開始到天津某地結束,進行路徑規劃時,可以先從起點算到北京高速入口,採用雙向搜尋方式,從終點算到天津高速入口,而北京到天津的這段高速路是提前算好的,所以這個過程就變成了計算起點到北京高速入口及終點到天津高速入口,然後再直接讀取這段高速歷程,這樣就加快了算路速度。這裡的核心是通過預處理計算出北京到天津存在的這條關鍵路徑(不一定最短,比如考慮實時路況),兩地算路時可直接調取。這兩個高速出入口就是收縮後的高等級節點。也可以得出,低等級節點首先向高等級節點拓撲,再通過高等級節點進行拓撲計算。高等級節點數明顯減少,其拓撲關係並不複雜,所以可以實現長距離算路。

如何判斷該收縮哪些節點呢?乙個直觀的理解是:去掉這個節點後,會不會影響兩點間最短路徑,如果不影響,這個點就可以被收縮掉。實際計算中會判斷邊的差分等等。

以上就是演算法加速的思想,非常符合我們日常認知,試想,我們長距離出行首先會選擇走高速,而不是先拿各種鄉縣省道進行距離量算比較一番,然後再決定走哪條路。一定程度上,它是拿空間換取時間策略。當然,這僅僅是演算法加速,為了提高響應速度,實際應用中,各家圖商還會對資料做編譯,手機流量約束,集群環境等等。

提取碼:4dyc

路徑規劃演算法 A

a 演算法是啟發式搜尋,是一種盡可能基於現有資訊的搜尋策略,也就是說搜尋過程中盡量利用目前已知的諸如迭代步數,以及從初始狀態和當前狀態到目標狀態估計所需的費用等資訊。a 演算法可以選擇下乙個被檢查的節點時引入了已知的全域性資訊,對當前結點距離終點的距離作出估計,作為評價該節點處於最優路線上的可能性的...

路徑規劃演算法 A 演算法

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

路徑規劃演算法 路徑規劃演算法學習Day3

2.函式解讀 演算法原理 參考路徑規劃演算法學習day1 路徑規劃演算法學習day1 此方法會結合網路占用法 柵格法來進行實現 總所周知 柵格法生成地圖常規是的自己乙個乙個打,這樣既麻煩還浪費時間 這裡介紹幾種方法 way1 在命令框中碼 map rand k 0.7 k代表多少維地圖 way2 在...