一種遠距離路徑規劃解決方案

 

     在嵌入式設備上做路徑規劃必須考慮到內存和效率的問題,當數據量(注:這裏的數據量指的是所需處理的道路的總數)非常龐大,起點和終點距離非常遠的時候,這點尤爲重要。主要原因有兩個:1、純粹的最短路徑算法對內存的消耗非常大,因爲不管是Dijkstra還是A*,計算過程會有很多最終有效路徑(注:有效路徑是指從起點到終點所有的節點序列或是弧段序列的集合)以外的節點和弧段被訪問到,而記錄這些非有效節點和弧段需要大量的內存,內存不足會最終導致路徑搜索失敗。2、最短路徑算法是從一個起點開始,大撒網式的向四周擴散,每次迭代產生當前最短的路徑,至於那次迭代剛好是終點卻無法預測,這樣漫無目的的搜索必然會導致效率不高,搜索一條路徑可能會花上分鐘級別的時間(根據用戶反饋,手機導航搜索一條路徑的時機消耗在30秒以內是可以接受的,超過1分鐘就會有投訴)。

 

     如果路徑規劃只是在城市數據量規模內,則不必過於考慮以上兩點,比如新加坡總共有5W條道路,馬來西亞30W條左右道路,對於這樣規模的數據量,只需要對最短路徑算法做一定優化基本就可以滿足用戶需求。但是當處理泰國(220W條道路),中國(500W以上)這樣大的數據量中做遠距離路徑規劃的時候,除了對算法本身優化還需要對數據做適當的預處理,通過控制算法的搜索空間來限制內存的使用和提高搜索的效率。這裏我介紹一種可行的方案。

 

 

理論的最短路徑和期望的最短路徑

用最短路徑算法求出來的兩點之間的最短路徑是理論上的最短路徑,這條路徑是絕對意義上的最短,可能是從起點出發中間走小路,轉彎,等等最終抵達終點。然而實際情況中用戶駕車的路徑選擇更趨於走“大路”,即便有一條小路捷徑,但是這條路級別較低,路上需要做很多轉彎,等待等等因素導致司機實際不願走這條路。此時就需要找一條期望的“最短”路徑,這條路徑是一條在國家道路規劃中級別比較高的路,不會像小路那樣彎曲和不便。我要講的最短路徑也是這種“最短”路徑。

 

道路等級的劃分

一個地區的道路會有很多等級,高速公路,大路,小路,像國內有國道,省道的劃分,具體到程序實現可以用級別代碼來代替,Level_1,Level_2,...Level_N,等。

 

 

遠距離路徑規劃

內存和效率的重要主要體現在遠距離路徑規劃中,起點到終點的距離如果大於100KM(直徑100KM的區域相當於省會級別城市),比如在省與省之間做路徑規劃的時侯,如果用純粹的Dijkstra or A*算法,內存的消耗將會在300M以上,這對於普通的嵌入式設備是不可以承受的,即便是iphone3GS。但是對於這種遠距離路徑規劃,考慮到通常會有高速公路的實際情況,在做路徑搜索的時候可以過濾掉級別較低的道路,這樣可以有效的縮小搜索空間,降低內存的消耗。比如做一條從泰國的清邁到曼谷的路徑,中間必定會有高速公路通過,而且駕駛者多數情況下也不會選擇高速以外的路徑(呵呵,這裏有些牛角尖尖可以鑽,如果你說司機就是不一定非得要走高速,怎麼辦?對不起,本文講的只是一種應對大多數實際情況的解決方案。)。這樣我們算法的搜索空間就會大大降低,泰國的高速公路(包括一級高速,二級高速,三級高速等)總共只有10W多條,搜索空間便可以從原來的220W降低到10W,效率自然就得到提高。方案具體分爲四個部分:

 

一、起始階段。從起點開始找到一條高速公路入口A,這個階段不需要過濾任何低級別的道路。

二、終點階段。從終點開始找到一條高速公路出口B,這個階段也不需要過濾任何低級別的道路。

三、搜索從高速入口A到高速出口B的最短路徑。這個階段需要過濾低級別的道路,即算法只運行在級別爲高速公路的數據空間裏。

四、合併以上三個階段的路徑序列,此即爲所求的“最短路徑”;

 

數據的預處理

正如你所想的,任意兩點之間就一定可以找到一條連通的高速公路嗎?沒錯,不一定,對於一些不發達的國家來說,更是很多情況下都沒有。那麼我們就需要對數據做一些預處理,使數據的特徵滿足上文提到的方案。具體的處理方法是將那些級別低的路“提升”爲高速公路(就是把這些道路的級別碼標記爲高速公路的級別碼)這樣就虛擬出來了一些本不存在的高速公路。當然不可以把過多的低級別道路提升到高速公路的級別,否則就不會達到降低搜索空間的目的了。數據預處理具體實施起來不是件容易的工作。

 

方案缺點

1、對於高速公路網絡不完善的國家,容易找不到最短路徑。這可以通過對數據預處理來得到一定的改善。

2、會有一些路徑的起點階段和終點階段看起來不夠“美”,即找到的最短路徑不是非常合乎邏輯,這是由於算法中的起點階段(終點階段類似)的目的是找到一條最近的高速公路入口,這個高速路口對於起點階段本身來說是最優的選擇,但是對整個路徑來說卻不一定是最優的(即局部最優不能保證全局最優)。但是由於方案主要針對的是遠距離的路徑規劃,對於起始階段和結束階段高速路口的選擇是不是最優就顯得不是那麼重要了,只要可以進入到第三步,在高速網絡裏進行路徑規劃就可以了。

 

 

 

總結

本文講述了一種大數據量中做遠距離路徑規劃的解決方案,首先對所有道路進行級別劃分(數據的預處理),在做遠距離路徑規劃的時候,通過過濾低級別道路來明顯降低算法搜索空間,從而降低內存消耗和提高搜索效率。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章