天天看點

路徑規劃技術演進之路

摘要:2019杭州雲栖大會大師零距離大咖有約,由高德資深地圖技術專家楊帆主講。本文主要圍繞技術是什麼展開講解,同時介紹了路徑規劃技術的演進曆程,及技術人的成長主要會遇到深度、廣度和系統性等三個問題。

精彩直播回放

以下為精彩視訊内容整理:

所謂路徑規劃就是在使用者選擇完起點和終點之後,所提供的一條路徑。出行的方式包括自駕、步行、公共交通等。路徑規劃的主要工作就是針對億萬使用者的情況下,在極短的時間内提供給使用者一條最優的路線。

一、技術是什麼

1.技術的定義

在《技術的本質》這本書中,作者給出了對技術的定義,其中包括三個定義。第一,技術是某種組合。第二,技術的每個元件也是縮微技術。第三,所有技術的本質都是效應與現象。

2.技術的特點

路徑規劃技術演進之路

如上圖所示為一張樹狀圖,但其實可以了解成為網狀圖,因為不是一個現象隻出來一個技術,也可能出現很多技術,并且上層的技術不一定是完全互相隔離的,也有可能是互相依賴的。從圖中可以看出,技術有以下三個特點:

  • 技術是有層次結構的,分為高層和底層,這并不代表技術的好壞,而是指技術之間的互相利用。例如制造汽車作為一種技術,其中高層技術是指汽車的三大件,包括底盤、發動機和變速箱,更低層的技術可以了解為是材料學方面的或者是動力學方面的。
  • 技術是子產品化的。比如汽車的三大件屬于汽車的子產品。此外,在程式員寫程式設計的時候,子產品化是非常實用的。
  • 技術是可以被重構的。重構的含義分為三層,第一層含義是指每一項技術的自身是可以通過自然界或者自身的方式被完善,目前所有的技術都不是完美的。第二層含義是指上層的技術可以通過下層的兩個技術的推動得以完善。第三層含義是指可以引用其他技術。

二、為什麼有技術

路徑規劃技術演進之路

技術是為了解決某些問題而存在的。例如,針對架構的重構技術,問題可以分為以下5類:

1.業務訴求。比如雙十一大促銷活動。

2.協作。比如如何讓成百上千的程式員在一起做一項工作。

3.伸縮性。

4.效率。

5.成本。比如用電的費用。

三、路徑規劃技術演進

路徑規劃技術演進之路

如上圖所示,豎條為路徑規劃技術的演進曆程。Dijkstra為路徑規劃最經典的算法,也作為後續所有算法的基石。在求最短距離時它是最經典的算法,但是在中國的路徑規劃或者全球的路徑規劃中并不适用,因為中國有四千多萬條路,假如計算從西藏到黑龍江的路程,在計算機尋址中可能需要周遊幾千萬次,根據計算機的性能不可能在很短的時間内得出結果,可能需要等待三分鐘的時間。這時,需要對其進行優化,并且找到技術的突破點。前人也提供了一些例子,例如Bi-Dijkstra,與Dijkstra相比,Bi-Dijkstra的搜尋空間是一個橢圓,而Dijkstra的搜尋空間是一個圓。

Dijkstra可以了解為是在不停的尋找最短的路線,有可能最短的路在邊上就會走出範圍。而A Star是設定了一個方向,必須沿着向終點的方向走,同時增加一個參數使得提高性能。

Multi-Layers是指将道路進行分層,分為底層路網和高層路網。方式是從底層路網到高層路網的更新,比如從村道上升到縣道,再從縣道上升到國道,直到上升到高速公路。使用一種減枝的方法使得路徑規劃查找的數目更少,性能更快。直到2010年還一直使用這種方法。此方法解決了性能問題,實作了在幾秒鐘之内能夠提供給使用者一條路線。同時也帶來了最優路線的選取問題。

CH算法可以了解為全國的路網是由很多條路、邊和節點組成的,利用計算機緩存的原理,将兩個點之間的距離緩存下來。算法主要是将全國任意兩個點之間的距離預先的計算出來,需要時可以通過查找得到,這樣做可以減少周遊的邊數,使得性能得到極大的提升。大概幾毫秒就可以得到任何兩點的路線。但是也存在新的問題,實時的關注路況的動态變化是必要的,比如道路擁堵問題。

CBR算法是指道路進行區域化。将全國化分為很多個區域,比如區域可以分為M個入口和N個出口,将M個入口和N個出口的最短距離和最短時間計算出來并且進行緩存。這樣就可以找到一條從M1到N3的最短距離。其主要思路是分層,一個省作為一個區域或者一個市作為一個區域視為一層,另一層進行聚合變成幾個省或幾個市為一個區域,每一層的結果都是遞歸的。CH算法是一個線性算法,無法實作并行,而CBR則不同,是可以并行運算的,進而可以節約時間。

Cpu-Cahce 是為了設計精巧的資料結構、達到性能的最優化而設計的。随着使用者的不斷需求,中國的限行問題對時間推衍有着很大的限制,時間推衍問題也是必需要解決的。

高德實作了TDR算法,在業界内處于領先位置。針對對于貨車的路徑規劃是比較複雜的,因為貨車的車型需要避讓很多的限高杆和限重路段。目前,如何用一套算法解決上述問題,高德提出了RCH算法。

四、技術人的成長

路徑規劃技術演進之路

技術人的成長主要會遇到深度、廣度和系統性三個問題。

首先研究下技術的深度問題。例如,制造汽車的行業必須要會制造發動機和引擎,直到會制造更深層的零件,可以了解為制造的東西越多,深度越深,離原理越近,離原理越近,離其他技術複用的可能性就越大。此時,在遇到新的事物的情況下會比其他人更有優勢、更有創新感。

其次針對技術的廣度問題,除了自身的技術線還希望了解周邊的技術線或者更上層的技術。技術的廣度第一個層面可以幫助人們了解日常工作中的上下遊,包括了解上遊部門、下遊部門及兄弟部門的工作程序,使得更好的配合工作,達到最好的優化。周邊的部門在技術上做了一個很小的改動,就有可能達到目标。另一層面是指技術的互相使用,因為技術之間是互通的,并且技術的組合産生新的技術會達到意想不到的效果。例如,對于路線規劃的技術方面,需要懂得路線規劃的算法,并且需要了解路徑規劃的服務,包括C++服務及Java服務,還需要了解阿裡怎樣做容災,因為遇到的問題有可能是相通的,可能還需要了解搜尋的技術,這些了解到的技術會在工作中提供非常大的幫助。

最後是關于系統性的概念,是指将了解的技術組織成一個有機的整體,也指技術與技術之間的連接配接。

繼續閱讀