專利名稱:城際導(dǎo)航路徑的計算方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種由中心通過無線傳輸對車臺進行導(dǎo)航的中心導(dǎo)航系統(tǒng),特別涉及了一種起點、終點位于不同城市內(nèi)的城際導(dǎo)航路徑的計算方法。
背景技術(shù):
現(xiàn)有的中心導(dǎo)航系統(tǒng)(非公知的系統(tǒng))已可處理起點、終點位于同一城市內(nèi)的導(dǎo)航路徑的計算。它能夠?qū)崿F(xiàn)的一個前提條件是路徑計算只涉及一個城市的拓撲地圖,也可稱之為單拓撲導(dǎo)航。
理論上,將全國范圍內(nèi)所有省外、省內(nèi)、城市外、城市內(nèi)的道路都抽象記錄到一個大型的拓撲地圖中,可以繼續(xù)使用單拓撲導(dǎo)航的方式進行城際導(dǎo)航的計算。但是,一系列數(shù)據(jù)表明這種做法僅具有理論意義,沒有實際應(yīng)用的價值。
根據(jù)中心導(dǎo)航目前為止最好的實驗結(jié)果,目前在廈門市地圖拓撲內(nèi)使用原始的DijkStra算法,計算一條路徑大約需要5秒左右,使用優(yōu)化的DijkStra算法計算一條路徑可以控制在10毫秒左右。而全國31個省、直轄市可能對應(yīng)幾百個城市,有些城市的交通路線可能比廈門市復(fù)雜100倍(如北京市),可以想象容納了全國所有層次(全國、省、市)的交通道路拓撲數(shù)據(jù)的地圖包含的頂點數(shù)和弧數(shù)可能是目前廈門圖的上千倍、甚至上萬倍。而各種DijkStra算法最佳的運行效率是與弧總量和頂點總量的乘積成線性關(guān)系,可以粗略地估計使用這種超大型的地圖拓撲計算一條路徑的時間可能在10000秒以上,這是系統(tǒng)不可能接受的在闡述什么是城際導(dǎo)航前,首先必須了解單拓撲導(dǎo)航的一般原理,因為本發(fā)明采取當(dāng)前的實施方式和單拓撲導(dǎo)航所需要的計算環(huán)境有較強的聯(lián)系。
1、概述單拓撲導(dǎo)航指起點、終點位于同一拓撲圖(包含國家級、省級、市級拓撲地圖,本文僅用市級拓撲示例)內(nèi)的導(dǎo)航路徑計算過程,使用較成熟的DijkStra算法(1959年迪克斯特拉提出的單源問題算法是最適合拓撲網(wǎng)絡(luò)中兩結(jié)點間最短路徑搜索的算法之一)來計算最短路徑。
2、DijkStra算法的基本數(shù)據(jù)結(jié)構(gòu)DijkStra算法運行所需要的計算環(huán)境是一個“弧加權(quán)有向部分連通圖”,主要包含一個頂點集和一個有向弧集,而有向弧上攜帶的權(quán)值就是對應(yīng)道路的長度。下面給出一個具體的數(shù)據(jù)結(jié)構(gòu)表示頂點數(shù)據(jù)結(jié)構(gòu) 其中數(shù)據(jù)結(jié)構(gòu)的描述如下(1)頂點數(shù)據(jù)結(jié)構(gòu)說明(Point Record)Longitude———頂點經(jīng)度Latitude———頂點緯度ArcIndex以此頂點為起點的第一條鄰接弧在弧記錄數(shù)組中的下標(biāo)(2)弧數(shù)據(jù)結(jié)構(gòu)說明(Arc Record)FirstPoint———弧的起點編號EndPoint——弧的終點編號Length———弧的長度NodeCount———構(gòu)成弧的節(jié)點數(shù)量
NodeArray———構(gòu)成弧的節(jié)點數(shù)組(3)弧上節(jié)點數(shù)據(jù)結(jié)構(gòu)說明(ArcNode Record)(包括弧結(jié)點在內(nèi)的整個弧的描述點)Lonitude——節(jié)點經(jīng)度Latitude——節(jié)點緯度(4)最短路徑點數(shù)據(jù)結(jié)構(gòu)說明(DijkStra Point Record)Point ID———拓撲頂點的編號PrePoint——最短路徑中此頂點的前點Shortest Len——源點到此頂點的最短路徑長度3、DijkStra算法的算法思想DijkStra的的基本思路是從起點開始向外發(fā)散,每次選取必定是最短路徑的通路到達某個頂點(不要求是指定的終點),依次求遍起點到其他各個頂點的最短路徑,直到指定終點的最短路徑被選出。
由于計算過程中起點唯一,終點不定,所以計算時,在頂點中應(yīng)存放其前點的標(biāo)識,而不能存放其后點的標(biāo)識。因為在起點唯一的條件下,某頂點無論處于多少條最短路徑上,其路徑前點都是唯一的,反之則不確定。
反證如下設(shè)起點為S,終點為T1,T2S到T1,T2的最短路徑都經(jīng)過點O,則在S到T1,S到T2的最短路徑上點O的前點,應(yīng)該都是S到點O的最短路徑上點O的前點,否則將S到T1,S到T2的最短路徑上S到點O的部分替換成S到點O的最短路徑,則S到T1,S到T2的最短路徑將變得更短,違背了最短路徑的定義。
4、DijkStra算法的實施過程與證明假設(shè)某地圖拓撲A中有n個拓撲頂點C,A={Ci|1<=i<=n}再假設(shè)已知最短路徑的頂點集合為X,未知最短路徑的頂點集合為Y,起點為S,終點為T。
具體算法過程如下X={S}Y=A-X比較集合X中與S直接相鄰的頂點的當(dāng)前路徑長度(起始時為無窮大)和S到這些點的有向弧長度,取其小者為新的當(dāng)前長度,當(dāng)前長度發(fā)生變化者同時還需修改其前點為S
while(true){取出集合Y中當(dāng)前長度最小的頂點,若無,則失敗退出循環(huán);否則假設(shè)該點為C,則頂點C的最短路徑已求出(證明見循環(huán)后)if(T==C)breakY=Y(jié)-{C}X=X+{C}比較集合X中與C直接相鄰的頂點的當(dāng)前路徑長度(起始時為無窮大)和C的最短路徑長度+C到這些點的有向弧長度,取其小者為新的當(dāng)前長度,當(dāng)前長度發(fā)生變化者同時修改其前點為C}假設(shè)C的當(dāng)前路徑長為dCurPathLen(C);若C的當(dāng)前路徑不是最短路徑,則C的最短路徑上必定含有集合Y中的其他點(由C的當(dāng)前路徑構(gòu)造過程容易看出,此路徑已是只經(jīng)過集合X中的點到達C點的所有路徑中的最短者,因此若此路徑還不是C點的最短路徑,則C點的最短路徑必定含有集合Y中的其他點),假設(shè)為D,C的最短路徑長dMinPathLen(C)=dMinPathLen(D)+d(D,C)其中d(D,C)是C的最短路徑上點D到點C的路徑長。
考慮到dCurPathLen(C)的選取方法,有dCurPathLen(C)<=dMinPath(D)<dMinPath(D)+d(D,C)=dMinPathLen(C)這顯然與dMinPath(C)的定義相矛盾,所以dCurPathLen(C)即C的最短路徑長,換句話說,C的最短路徑已經(jīng)求出。
由于求出最短路徑時,保存了前點,所以只要從終點向起點回溯即可得到最短路徑的具體組成。
5、拓撲覆蓋與拓撲合成(1)臨時拓撲從DijkStra算法過程看,參與計算的起點和終點必須是地圖拓撲中的頂點,而導(dǎo)航請求僅僅給出了起終點的經(jīng)緯度,不一定恰好是拓撲中的頂點,無法參與計算。基于此問題,需要計算實際起終點在地圖拓撲中對應(yīng)的頂點。
由于不能直接在原始地圖拓撲中直接獲取與實際起終點最近的頂點作為新的起終點(實際起終點可能位于某條有向道路弧的中段,離頂點較遠),因此可能要求創(chuàng)建新的拓撲頂點,以及可能在原始地圖拓撲的某些頂點上增減有向弧。
上述這些工作顯然針對的是一次具體的導(dǎo)航計算,不像原始地圖拓撲一樣具有永久性,只能作為臨時拓撲信息存在,下次計算時,必須刪去。
(2)拓撲替換單從DijkStra算法求解的角度,直接在原始地圖拓撲上增加新的頂點、增減有向弧有利于計算,可稱為拓撲替換。
拓撲替換可以滿足當(dāng)前計算的要求,但對于下次導(dǎo)航計算沒有貢獻,原則上需要在計算完成后對原始地圖拓撲進行恢復(fù),整個恢復(fù)工作并不復(fù)雜,只要事先保存了被替換數(shù)據(jù)即可。
但是拓撲替換完全不適合單拓撲下多任務(wù)或多拓撲計算。
僅以單拓撲下多任務(wù)計算為例,在多線程同時計算的情況下,原始地圖拓撲是作為多線程共享數(shù)據(jù)結(jié)構(gòu)存在的,每個線程對它的讀訪問遠遠多于寫訪問,但任一線程的寫訪問會影響其他所有線程的讀訪問,維護數(shù)據(jù)的線程安全非常困難。這決定了直接修改原始地圖拓撲是不可行的,因此提出以下拓撲覆蓋的概念。
(3)拓撲覆蓋拓撲覆蓋借用類似虛函數(shù)的概念,使用對象指針動態(tài)決定計算時調(diào)用永久對象和臨時對象。
把原先用于拓撲替換的臨時拓撲頂點和新建頂點對象分離出來,在單個計算任務(wù)中內(nèi)建一個小型的地圖拓撲(最多僅僅包含3-4個拓撲頂點和數(shù)條有向道路弧)。對于新建的頂點在原始地圖拓撲的基礎(chǔ)上進行編號,對于用于替換的拓撲頂點則沿用其在原始地圖拓撲中的編號。
這個內(nèi)建的小型拓撲即是原始地圖拓撲的一個部分覆蓋,簡稱拓撲覆蓋。
(4)拓撲覆蓋的DijkStra算法實際中,使用DijkStra算法時,需要根據(jù)原始地圖拓撲和拓撲覆蓋中所有的頂點數(shù),建立一個臨時信息數(shù)組,主要用于存放頂點在拓撲中的編號、頂點對象指針、最短路徑上頂點的前點編號以及最短路徑長度Class CNavCalcTempInfo{//……intm_iTPPtNoCTPPoint* m_pTPPt;//拓撲頂點指針,直接訪問BOOLm_bArrival;//是否已到達
Int m_iTPPtNoPrev;//前點在數(shù)組中的編號Double m_dPathLen;//當(dāng)前最短路徑長度//……}然后依次遍歷原始地圖拓撲的頂點和拓撲覆蓋的頂點,將其中的拓撲頂點編號取作臨時信息數(shù)組的下標(biāo),將當(dāng)前頂點對象指針填入。臨時拓撲中,新建的頂點的編號從原始地圖拓撲中頂點編號最大值+1依次遞增,用于覆蓋的頂點的編號仍然沿用原編號,遍歷完后,新建的頂點對象指針自動加載到臨時信息數(shù)組末尾,而用于覆蓋的頂點對象指針自動替換掉臨時信息數(shù)組中原有頂點對象指針。
在計算過程中,當(dāng)遍歷某個頂點的所有有向弧時,獲取弧所指向的頂點編號后,取作訪問臨時信息數(shù)組的下標(biāo),使用該下標(biāo)訪問到的臨時信息中,沒有被修改的頂點對象指針沒有發(fā)生改變,仍然索引到原始地圖拓撲中的某個頂點對象,被修改的頂點對象指針則被改為拓撲覆蓋中對應(yīng)頂點的對象指針,如此便可以自動訪問到頂點對象的正確版本。
6、計算切割點的算法假設(shè)起點為S,切割點為C,地圖拓撲為T,Ai為拓撲T中的第i條有向弧,Lij是弧Ai上的第j條有向直線段(這些直線段均由弧上相鄰節(jié)點遵照弧的方向連接而成)。
一般情況下,切割點均定義為地圖拓撲中所有弧上與指定點距離最短的點d(S,C)=min d(S,Ai),Ai∈Td(S,Ai)=min d(S,Lij),Lij∈Aid(S,Lij)的求法如下從起點S作Lij的垂線段,求出垂足,若垂足位于直線段上,則起點S到垂足的距離即為所求,否則求出起點S到直線段Lij的兩端點的距離,取其中的較小值即為所求。
7、計算臨時拓撲的算法計算完起點和終點的切割點后,可以作為新的起終點,同時它們都是拓撲頂點,符合DijkStra算法計算的要求。
一般地,如果切割點不與原始地圖拓撲中的任一拓撲頂點重合的話,即需要將其創(chuàng)建成一個新的拓撲頂點,否則直接引用原拓撲中的頂點編號進行計算。
將切割點創(chuàng)建成臨時的拓撲頂點的過程中,對于起點的切割點,需要創(chuàng)建指向切割點所在弧上其他頂點的有向弧,同時要保證新建的有向弧的方向與原有向弧一致(需要區(qū)分原有向弧是單線弧還是雙線弧,如果是單線弧,要繼續(xù)區(qū)分是否是單行道)。
(1)為起點的切割點建立相關(guān)的臨時拓撲若起點的切割點即是原地圖拓撲中的拓撲頂點,則無需為該切割點建立任何臨時的拓撲信息。
當(dāng)需要為起點的切割點建立相關(guān)的臨時拓撲時,需要注意以下三點第一,只能建立以切割點為起點,以原始拓撲中切割點所在的有向弧的頂點為終點的有向??;如圖1所示,點B是點A在弧上直線段CD上的切割點(不是任何已有的拓撲點),則需要將點B創(chuàng)建為臨時拓撲頂點。同時建立B點到C點D點的有向弧。
第二,新建的有向弧不能違背原始拓撲中的交通關(guān)系,即需要考察原始拓撲中切割點所在弧是雙線弧還是單線弧,如果是單線弧,需要繼續(xù)考察是否為單行道。
同樣如圖1,若弧是雙線弧,或是擁有單行道標(biāo)志的單線弧,則只能建立從B點到D的有向弧。
第三,若起點和終點落入原地圖拓撲中的同一條弧上,并在交通關(guān)系限制下是在弧上是可直達的,需要多建立一條起點到終點的直達弧。
如圖2所示,假設(shè)A點是起點,E點是終點,則需要建立切割點B到F的有向弧。
如果有向弧BF的方向被實際交通關(guān)系禁止時(指雙線弧方向與BF的方向相反,或是單行道單線弧的方向和BF相反),則不能在臨時拓撲中建立有向弧BF(2)為終點的切割點建立相關(guān)的臨時拓撲與為起點的切割點建立相關(guān)的臨時拓撲過程類似。
只能建立以切割點為終點,以原始拓撲中切割點所在的有向弧的頂點為起點的有向弧。
同樣,建立的臨時有向弧方向必須是原始地圖拓撲中的交通關(guān)系所允許的。首先,必須承認單拓撲導(dǎo)航處理城際導(dǎo)航問題,也并非不可能做到,將少數(shù)幾個省、市的拓撲數(shù)據(jù)結(jié)合在同一個拓撲地圖中,即可使用單拓撲導(dǎo)航方法處理這些地區(qū)的城際導(dǎo)航問題,但必將失去靈活性和通用性,因為它僅僅適用于這幾個省市。如果要處理各種省市之間的組合城際導(dǎo)航問題,將存在許多種不同的地圖組合,而這些地圖中必然存在重復(fù)的地圖拓撲數(shù)據(jù),造成大量的空間浪費,同時同步維護工作極為困難。
因此,如果需要繼續(xù)沿用單拓撲導(dǎo)航的方法,為了達到通用的目的,同時避免空間浪費,只能將所有的全國范圍內(nèi)的所有省市的拓撲數(shù)據(jù)存放在一張超大型的拓撲地圖中,但是顯然帶來了如下兩個問題第一,編輯地圖困難,不但無法分工編輯,同時由于數(shù)據(jù)量過大,地圖拓撲對象的定位查找和整個拓撲的導(dǎo)出都將變得非常遲緩;第二,使用該地圖計算時耗費大量的機器時間。原因是地圖包含了大量的數(shù)據(jù),關(guān)于這一點在上文中已有涉及。
發(fā)明內(nèi)容
本發(fā)明的主要目的是提供一種城際導(dǎo)航的靈活、通用和高效計算方法,不需要進行大量的數(shù)據(jù)運算,使之滿足實用的要求,以此為前提,甚至可以允許計算得到的城際導(dǎo)航路徑是次優(yōu)的最短路徑。
本發(fā)明所述的一種城際導(dǎo)航路徑的計算方法是,先判斷并選出所有同時包含起終點的地圖拓撲,從中選出級別最低的地圖拓撲計算最短路徑P,找出該路徑P上起點城市的出邊界點和終點城市的入邊界點,然后對路徑P進行裁剪,僅保留不屬于起點城市和終點城市內(nèi)的部分,將計算得到的起點城市的出邊界點傳給起點城市拓撲作為新的終點,對起點城市拓撲使用單拓撲導(dǎo)航算法計算市級的最短路徑,然后加入到路徑P的頭部,同時將計算得到的終點城市的入邊界點傳給終點城市拓撲作為新的起點,對終點城市拓撲使用單拓撲導(dǎo)航算法計算市級的最短路徑,然后加入到路徑P的尾部,至此即可形成完整的城際導(dǎo)航最短路徑。
本發(fā)明具體包括以下步驟步驟1創(chuàng)建一個最高層的路徑計算任務(wù)指定起終點指定起點A和終點B,主要指在最高層計算任務(wù)中記錄起終點的經(jīng)緯度。
設(shè)置起終拓撲設(shè)置其起始拓撲TA為包含起點A的級別最低的地圖拓撲,終止拓撲TB為包含終點B的級別最低的地圖拓撲。
步驟2判斷最高層計算任務(wù)的起終拓撲關(guān)系若起終點所在起始拓撲和終止拓撲不是同一地圖拓撲,則進入下一步計算;若相同則直接轉(zhuǎn)入步驟4。
步驟3計算最高層計算任務(wù)起終點的公共拓撲優(yōu)先轉(zhuǎn)化其中級別較低者,假設(shè)起點拓撲TA的級別較低,為TA創(chuàng)建一個起點計算子任務(wù),起點仍為A,計算拓撲為TA,但終點暫不確定。同時將最高層計算任務(wù)中的起始拓撲轉(zhuǎn)化為所屬的高級拓撲后,轉(zhuǎn)步驟2。
步驟4計算最高層計算任務(wù)的最短路徑當(dāng)最高層計算任務(wù)的起始拓撲和終止拓撲相同時,此時它的計算拓撲即可確定下來,此時可對最高層計算對象采用單拓撲導(dǎo)航DijkStra算法,計算起點A和終點計算最短路徑P。
步驟5判斷最高層對象是否存在起點計算子任務(wù)判斷最高層對象是否存在起點計算子任務(wù),如存在則從計算得到的路徑P上搜索第一個出邊界點作為起點計算子任務(wù)的新終點,并將路徑P中第一個出邊界點前的點全部刪除。
步驟6判斷最高層對象是否存在終點計算子任務(wù)如存在則從計算得到的路徑P上搜索最后一個入邊界點作為終點點計算子任務(wù)的新起點,并將路徑P中最后一個入邊界點后的點全部刪除。
步驟7合并路徑將起點計算子任務(wù)得到的路徑加入的路徑P被裁剪后部分的頭部,即將路徑中的點對象從尾部開始到頭部逆序的方式逐個移動到路徑P的頭部;將終點計算子任務(wù)得到的路徑加入到路徑P被裁剪后部分的尾部,即將路徑中的點對象從頭部開始到尾部順序逐個移動到路徑P的尾部。
步驟8最終即可形成起點A到終點B的最短路徑為避免地圖拓撲中數(shù)據(jù)交叉重復(fù)、一副拓撲容納過多的數(shù)據(jù)以及計算涉及海量的拓撲數(shù)據(jù),拓撲地圖必須要分級制作,如每一城市都應(yīng)有自己獨立的拓撲地圖,各省也應(yīng)有獨立的拓撲地圖,甚至全國范圍內(nèi)也必須有一副獨立的地圖拓撲,路徑必須在包含較少拓撲數(shù)據(jù)的拓撲中計算。
考慮以下的情形,若要計算起終點位于不同城市內(nèi)的最短路徑,由于使用任何單個城市拓撲均不能解決問題,同時兩個城市間無連通關(guān)系,因此若要計算從一城市到另一城市的最短路徑,必須定義更高一級(可以理解為行政級別更高,并無差別)的地圖拓撲來補充描述兩個獨立的城市拓撲之間的道路連通關(guān)系。
假設(shè)這兩個城市位于同一省內(nèi),此時定義一省拓撲用于連通兩個城市,則不管使用何方法,總能計算出一條最短路徑;若兩城市位于不同的省份,則分別需要各自所在省的地圖拓撲和全國范圍內(nèi)的拓撲地圖,全國拓撲地圖用于連通兩個省份的交通道路,而省級拓撲用于連通城市。
如此,計算起終點位于不同城市內(nèi)的最短路徑計算問題,僅僅需要加載相關(guān)的城市和省級拓撲,甚至是全國范圍的地圖拓撲,而無需加載與當(dāng)前路徑計算不相關(guān)的地圖拓撲數(shù)據(jù),可以減少DijkStra算法將要訪問的數(shù)據(jù)總量和計算時間。
本發(fā)明規(guī)定的拓撲地圖中總是主要包含當(dāng)前行政級別的圖上道路,而不過多包含其低級拓撲(省級拓撲是全國級拓撲的低級拓撲,市級拓撲是省級拓撲的低級拓撲)中的道路細節(jié),舉例說明假設(shè)城市C位于省份P內(nèi),則P省對應(yīng)的拓撲地圖中不應(yīng)包含C市中所有的道路細節(jié),而是必須包含P省內(nèi)通過C市的主要干道(包括在這些干道上可能的轉(zhuǎn)向)和C市本身的主要干道的拓撲數(shù)據(jù)。
其次,高一級拓撲地圖中必須記錄其干道通過其低級拓撲時產(chǎn)生的出入邊界點,且必須與低級拓撲中對應(yīng)與這些邊界點的頂點在經(jīng)緯度上有著高精確度的重合關(guān)系,同時這些點應(yīng)選取在距離有轉(zhuǎn)向的路口較遠的地點。
最后,我們?nèi)缦露x跨越多個不同拓撲地圖的導(dǎo)航最短路徑假設(shè)起點為A,所在最低級別的拓撲為TA,TA的出邊界點為C,終點為B,所在最低級別的拓撲為TB,TB的入邊界點為D,最短路徑P(A,B)=P(A,C)+P(C,D)+P(D,B)即,城際導(dǎo)航的最短路徑不是理論方式上的最短路徑,而是多段最短路徑的和,但一般地,城際導(dǎo)航過程中,位于城市外的道路長度總是遠大于城市內(nèi)的部分,這是實際中存在的規(guī)律(因為城市的范圍尺度相對于省,全國而言是足夠小的),求出C和D兩個邊界點之間的最短路徑,應(yīng)與理論上的最短路徑基本吻合,然后結(jié)合城市內(nèi)的最短路徑得到的實際路徑應(yīng)該就是理論上的最短路徑,這里我們使用了一個實踐性的規(guī)律來避免了大量數(shù)據(jù)的同級計算,而是轉(zhuǎn)化為了一個分級計算。
仔細分析上述思想,可以發(fā)現(xiàn)存在一個問題,即某一拓撲地圖的出入邊界點并不是唯一存在的,因此無法先行計算位于低級地圖拓撲中的最短路徑部分。
圖1為現(xiàn)有的建立臨時拓撲的示意圖;圖2為現(xiàn)有的建立臨時拓撲的另一種示意圖;圖3為本發(fā)明的具體示意圖。
具體實施例方式
為描述上的一致性起見,本發(fā)明僅針對位于同省內(nèi)的不同城市之間的城際導(dǎo)航問題進行說明,對于不同省內(nèi)的不同城市間的城際導(dǎo)航,可以使用本發(fā)明闡述的原理,同理推廣到全國范圍后即可解決。
首先判斷同時包含起終點的地圖拓撲,從中選出級別最低的地圖拓撲(全國級、省級或市級)計算最短路徑,如圖3,由于起點A和終點B分處于兩個不同城市拓撲中,但同屬于省級拓撲T,此時無需在全國級拓撲中進行計算,直接在省級拓撲T中對起點A和終點B使用單拓撲導(dǎo)航計算過程,計算出一條路徑P。由于在省圖上路徑P的起點在城市A中,終點在城市B中,起點A所在最低級別的拓撲為TA,TA的出邊界點為C,終點為B,所在最低級別的拓撲為TB,TB的入邊界點為D,最短路徑P(A,B)=P(A,C)+P(C,D)+P(D,B),容易得知路徑P上必定存在起點城市TA的出邊界點和終點城市TB的入邊界點,進一步明確地說,路徑P的第一個出邊界點必定是城市TA的出邊界點C,最后一個入邊界點是城市TB的入邊界點D,至于路徑P上介于第一個出邊界點和最后一個入邊界點之間的邊界點則可能是路徑P穿過其他城市時的邊界點。
由于省級拓撲不記錄其所包含城市內(nèi)的詳細道路拓撲數(shù)據(jù),只用于描述省內(nèi)各城市之間的連通關(guān)系和市內(nèi)干道,因此路徑P位于起點城市TA和終點城市TB內(nèi)的部分路徑可能并不符合實際道路行駛情況,以此必須舍棄,即對路徑P進行裁剪,僅保留不屬于起點城市TA和終點城市TB內(nèi)的部分。此處需要指出的是,不得裁剪路徑P行經(jīng)其他城市中的部分,因為系統(tǒng)默認車輛自某一城市TA到達另一城市TB時,中途穿過其他城市時,只選擇中途城市中的干道行駛,而省級拓撲已記錄城市的干道。
由于市級拓撲較詳盡地記錄了市內(nèi)道路拓撲數(shù)據(jù),因此將省級計算得到的起點城市TA的出邊界點C傳給起點城市拓撲TA作為新的終點,對TA使用單拓撲導(dǎo)航算法計算市級的最短路徑,然后加入到路徑P的頭部,同時將省級計算得到的終點城市TB的入邊界點D傳給終點城市拓撲TB作為新的起點,對TB使用單拓撲導(dǎo)航算法計算市級的最短路徑,然后加入到路徑P的尾部,至此即可形成完整的城際導(dǎo)航最短路徑。
本發(fā)明具體的計算步驟如下步驟1創(chuàng)建一個最高層的路徑計算任務(wù)1、指定起終點指定起點A和終點B,主要指在最高層計算任務(wù)中記錄起終點的經(jīng)緯度。
2、設(shè)置起終拓撲設(shè)置其起始拓撲TA為包含起點A的級別最低的地圖拓撲,終止拓撲TB為包含終點B的級別最低的地圖拓撲。
這里需要特別指出的是包含某點的級別最低的地圖拓撲應(yīng)如下理解首先是與地圖拓撲本身一同被記錄的地圖拓撲的區(qū)域(一組首尾相連的閉合折線圍成的部分),測試點在拓撲內(nèi)即測試點在拓撲的區(qū)域內(nèi),此算法是計算機圖形學(xué)中的公知算法,具體編程時,可使用微軟MFC類庫中提供的CRgn類,也可以自行編程實現(xiàn);其次級別指的是地圖拓撲的行政級別,一般地將國家級地圖拓撲的級別定義成最高,省級地圖拓撲的級別次高,而城市級地圖拓撲的級別最低,根據(jù)點在區(qū)域內(nèi)的測試,可能國家級地圖拓撲、某省級地圖拓撲和某市級地圖拓撲都包含此點,但此處必須取其中級別最低者,因為級別越低描述的道路細節(jié)越清晰(級別需作為一個屬性存放在地圖拓撲對象中)。
步驟2判斷最高層計算任務(wù)的起終拓撲關(guān)系由于起終點所在起始拓撲和終止拓撲并不一定是同一地圖拓撲,如果不相同,則無法直接進行DijkStra單源最短路徑的計算,需要進入下一步計算;若相同則直接轉(zhuǎn)入步驟4。
此處同樣要補充說明的是,如何判斷地圖拓撲是否相同,從非編程的角度看,創(chuàng)建地圖拓撲磁盤文件數(shù)據(jù)時,必須為每個拓撲規(guī)定一個唯一性的標(biāo)識(我們采取是國家定義的行政區(qū)劃編號,這是公知數(shù)據(jù)),拓撲之間直接根據(jù)此標(biāo)識來判斷是否相同;從編程的角度看,地圖拓撲對象加載到內(nèi)存中時,必定占用不同的內(nèi)存空間,亦可使用地圖拓撲對象的首地址來直接判斷地圖拓撲對象是否相同。
步驟3計算最高層計算任務(wù)起終點的公共拓撲1、由于最高層計算任務(wù)的起終拓撲不相同,無法直接在某個拓撲中計算起終點之間的最短路徑,需要查找同時包含起終點的地圖拓撲,方可進行計算。
2、優(yōu)先轉(zhuǎn)化其中級別較低者假設(shè)起點拓撲TA的級別較低,為TA創(chuàng)建一個起點計算子任務(wù),起點仍為A,計算拓撲為TA,但終點暫不確定。同時將最高層計算任務(wù)中的起始拓撲轉(zhuǎn)化為所屬的高級拓撲后,轉(zhuǎn)步驟2。
計算子任務(wù)的結(jié)構(gòu)與最高級計算任務(wù)相同,除去上述需要修改的數(shù)據(jù)外,其他數(shù)據(jù)直接從最高級地圖拓撲中復(fù)制繼承。
計算子任務(wù)創(chuàng)建完成后,需要正確的掛接在最高級計算任務(wù)的某個分支上,假設(shè)是起點計算子任務(wù),做法如下首先將最高級地圖拓撲原有的起點計算子任務(wù)(如果該子任務(wù)存在)掛接在新創(chuàng)建的起點計算子任務(wù)的起始分支上,然后將自身掛接在最高計算任務(wù)的起始分支上。
對于終點計算分支可以同理進行。另外,從編程的角度而言,計算任務(wù)的掛接可以通過將計算子任務(wù)的指針交由上層計算任務(wù)保存來完成。
步驟4計算最高層計算任務(wù)的最短路徑1、當(dāng)最高層計算任務(wù)的起始拓撲和終止拓撲相同時,此時它的計算拓撲即可確定下來,此時可對最高層計算對象采用單拓撲導(dǎo)航DijkStra算法,計算起點A和終點計算最短路徑P。
2、單拓撲導(dǎo)航DijkStra算法的理論如前所述由于此時的起終點僅僅只有經(jīng)緯度數(shù)據(jù),只有地理意義,與計算拓撲尚未有任何拓撲關(guān)系,不能直接進行DijkStra計算。
因此首先需要使用前述理論中“計算切割點的算法”來確定起終點在計算拓撲中對應(yīng)的拓撲位置。計算完成后此拓撲位置應(yīng)包含切割點的經(jīng)緯度、所在的弧編號、及具體位于構(gòu)成弧的折線段的哪條直線段上。
切割點計算完成后使用前述理論中“計算臨時拓撲的算法”來建立真正可用于DijkStra計算的臨時計算拓撲,簡單做法是,將切割點創(chuàng)建成新的拓撲路口點,其編號從整個地圖拓撲最大的拓撲路口點編+1開始;取出切割點所在弧的首尾兩個路口點,創(chuàng)建它們的覆蓋拓撲路口點(因為它們將受到從切割點創(chuàng)建的拓撲路口點的影響),除切割點所在的弧外,從原始的拓撲點上復(fù)制繼承剩下所有的弧,最后再建立它們與切割點生成的新拓撲路口點之間的連通弧。
建立了臨時計算拓撲后,需要應(yīng)用前述拓撲覆蓋的原理,為DijkStra計算創(chuàng)建一個臨時計算信息表,目的是索引計算所需要的拓撲數(shù)據(jù)和暫時保存計算過程中產(chǎn)生的臨時結(jié)果。
確切的例子如下Class CNavCalcTempInfo{//……int m_iTPPtNoCTPPoint* m_pTPPt;//拓撲頂點指針,直接訪問BOOLm_bArrival;//是否已有最短路徑到達Int m_iTPPtNoPrev;//前點在數(shù)組中的編號Doublem_dPathLen;//當(dāng)前路徑長度//……}可以創(chuàng)建上述結(jié)構(gòu)的一個數(shù)組來描述臨時計算信息表,其長度最大為原始地圖拓撲中所有拓撲路口點數(shù)和臨時計算拓撲中新創(chuàng)建的拓撲路口點數(shù)之和。
最后將臨時計算拓撲中拓撲路口點的指針?biāo)饕钊氲脚R時計算信息表中,其中尤其值得注意的是將路口點編號與數(shù)組元素下標(biāo)用一一對應(yīng)(相等關(guān)系)起來,將路口點對象的指針?biāo)饕钊霐?shù)組元素的m_pTPPt字段中,相同路口點編號的拓撲路口點對象,需要重復(fù)覆蓋地填入(臨時新建的路口點對象指針?biāo)饕采w原始拓撲路口點的指針?biāo)饕?。索引數(shù)據(jù)填入完成后,初始化臨時計算信息表,使得除起始拓撲路口點外,其他剩余所有點的最短路徑到達標(biāo)志都是FALSE(假),最短路徑前點編號和當(dāng)前路徑長度都取無效值。
3、當(dāng)一切計算準(zhǔn)備完成后,開始進行DijkStra計算首先將起始拓撲路口點能通過有向弧索引到的拓撲路口點的前點編號填為起始拓撲路口點的編號,當(dāng)前路徑長度填為各自有向弧的長度,是否已有最短路徑到達標(biāo)志不變,然后開始循環(huán)過程。
循環(huán){在臨時計算信息數(shù)組中遍歷,查找尚未有最短路徑到達,但當(dāng)前路徑長度有效的點,取其中當(dāng)前路徑長度最短的拓撲路口點若未找到,表示起點到終點不存在可通路徑,然后中斷循環(huán)若已查找到,則當(dāng)前找到的拓撲路口點的最短路徑已求出(原因參見前面的原理部分)。
若當(dāng)前找到的拓撲路口點即終止拓撲路口點,表示起點到終點的最短路徑已求得,中斷循環(huán)。
否則,檢查當(dāng)前拓撲路口點能通過有向弧索引到的拓撲路口點的當(dāng)前路徑長度,若無效則其前點編號填為當(dāng)前拓撲路口點的編號,其當(dāng)前路徑長度填為各自有向弧的長度+當(dāng)前拓撲路口點的當(dāng)前最短路徑長度,是否已有最短路徑到達標(biāo)志不變,然后繼續(xù)循環(huán)過程;若有效,比較其當(dāng)前路徑長度與通過當(dāng)前拓撲路口點后直接到達的路徑長度,若前者較大,處理同前面當(dāng)前路徑長度無效時的情形。
}由于拓撲路口點有限,故有限次后,此循環(huán)過程停止。
步驟5判斷最高層對象是否存在起點計算子任務(wù)判斷最高層對象是否存在起點計算子任務(wù),如存在則從計算得到的路徑P上搜索第一個出邊界點作為起點計算子任務(wù)的新終點,并將路徑P中第一個出邊界點前的點全部刪除;此步驟涉及三個較重要的概念如何判斷是否存在起點計算子任務(wù)?從程序編制的角度看,可以認為索引起點計算子任務(wù)的指針不為空,即表示存在起點計算子任務(wù);如何搜索邊界點?一般地,某級地圖拓撲必須保存其包含的低級拓撲的所有出入邊界點的信息,這要求地圖制作和加載的時候?qū)⑦@個信息以某些位標(biāo)志的方式記錄在拓撲路口點的屬性中。
將路徑P中第一個出邊界點前的點全部刪除是因為此部分將被低級拓撲中計算得到的細節(jié)更清晰的路徑代替,因此必須刪除(由于路徑是以所經(jīng)過點的鏈表方式保存的,刪除即指從鏈表中移除這些點對象)步驟6判斷最高層對象是否存在終點計算子任務(wù)如存在則從計算得到的路徑P上搜索最后一個入邊界點作為終點點計算子任務(wù)的新起點,并將路徑P中最后一個入邊界點后的點全部刪除;其具體解釋同上。
步驟7合并路徑將起點計算子任務(wù)得到的路徑加入的路徑P被裁剪后部分的頭部,即將路徑中的點對象從尾部開始到頭部逆序的方式逐個移動到路徑P的頭部;將終點計算子任務(wù)得到的路徑加入到路徑P被裁剪后部分的尾部,即將路徑中的點對象從頭部開始到尾部順序逐個移動到路徑P的尾部;步驟8最終即可形成起點A到終點B的最短路徑由于拓撲地圖總數(shù)有限,且轉(zhuǎn)化是按拓撲等級不斷升高單向進行的,因此有限次后,轉(zhuǎn)化過程必定停止。
最終可能得到兩個結(jié)果,第一,不能找到某一拓撲地圖同時包含起終點,此時表示起終點間無通路,計算最短路徑失??;第二,找到一拓撲地圖同時包含起終點,此時在可以此拓撲地圖上計算出最短路徑。
權(quán)利要求
1.一種城際導(dǎo)航路徑的計算方法,其特征在于先判斷并選出所有同時包含起終點的地圖拓撲,從中選出級別最低的地圖拓撲計算最短路徑P,找出該路徑P上起點城市的出邊界點和終點城市的入邊界點,然后對路徑P進行裁剪,僅保留不屬于起點城市和終點城市內(nèi)的部分,將計算得到的起點城市的出邊界點傳給起點城市拓撲作為新的終點,對起點城市拓撲使用單拓撲導(dǎo)航算法計算市級的最短路徑,然后加入到路徑P的頭部,同時將計算得到的終點城市的入邊界點傳給終點城市拓撲作為新的起點,對終點城市拓撲使用單拓撲導(dǎo)航算法計算市級的最短路徑,然后加入到路徑P的尾部,至此即可形成完整的城際導(dǎo)航最短路徑。
2.如權(quán)利要求1所述的一種城際導(dǎo)航路徑的計算方法,具體包括以下步驟步驟1創(chuàng)建一個最高層的路徑計算任務(wù)指定起終點指定起點A和終點B,主要指在最高層計算任務(wù)中記錄起終點的經(jīng)緯度。設(shè)置起終拓撲設(shè)置其起始拓撲TA為包含起點A的級別最低的地圖拓撲,終止拓撲TB為包含終點B的級別最低的地圖拓撲;步驟2判斷最高層計算任務(wù)的起終拓撲關(guān)系如果起終點所在起始拓撲和終止拓撲并不是同一地圖拓撲,則進入下一步計算;若相同則直接轉(zhuǎn)入步驟4;步驟3計算最高層計算任務(wù)起終點的公共拓撲優(yōu)先轉(zhuǎn)化其中級別較低者,假設(shè)起點拓撲TA的級別較低,為TA創(chuàng)建一個起點計算子任務(wù),起點仍為A,計算拓撲為TA,但終點暫不確定。同時將最高層計算任務(wù)中的起始拓撲轉(zhuǎn)化為所屬的高級拓撲后,轉(zhuǎn)步驟2;步驟4計算最高層計算任務(wù)的最短路徑當(dāng)最高層計算任務(wù)的起始拓撲和終止拓撲相同時,此時它的計算拓撲即可確定下來,此時可對最高層計算對象采用單拓撲導(dǎo)航DijkStra算法,計算起點A和終點計算最短路徑P;步驟5判斷最高層對象是否存在起點計算子任務(wù)判斷最高層對象是否存在起點計算子任務(wù),如存在則從計算得到的路徑P上搜索第一個出邊界點作為起點計算子任務(wù)的新終點,并將路徑P中第一出邊界點前的點全部刪除;步驟6判斷最高層對象是否存在終點計算子任務(wù)如存在則從計算得到的路徑P上搜索最后一個入邊界點作為終點點計算子任務(wù)的新起點,并將路徑P中最后一個入邊界點后的點全部刪除;步驟7合并路徑將起點計算子任務(wù)得到的路徑加入的路徑P被裁剪后部分的頭部,即將路徑中的點對象從尾部開始到頭部逆序的方式逐個移動到路徑P的頭部,將終點計算子任務(wù)得到的路徑加入到路徑P被裁剪后部分的尾部,即將路徑中的點對象從頭部開始到尾部順序逐個移動到路徑P的尾部;步驟8最終即可形成起點A到終點B的最短路徑。
全文摘要
本發(fā)明涉及一種城際導(dǎo)航路徑的計算方法,先判斷并選出所有同時包含起終點的地圖拓撲,從中選出級別最低的地圖拓撲計算最短路徑P,找出該路徑P上起點城市的出邊界點和終點城市的入邊界點,然后對路徑P進行裁剪,僅保留不屬于起點城市和終點城市內(nèi)的部分,將起點城市的出邊界點傳給起點城市拓撲作為新的終點,對起點城市拓撲使用單拓撲導(dǎo)航算法計算市級的最短路徑,然后加入到路徑P的頭部,同時將終點城市的入邊界點傳給終點城市拓撲作為新的起點,對終點城市拓撲使用單拓撲導(dǎo)航算法計算市級的最短路徑,然后加入到路徑P的尾部,至此即可形成完整的城際導(dǎo)航最短路徑。利用該種方法不需要進行大量的數(shù)據(jù)運算,使之滿足實用的要求。
文檔編號G06F17/00GK1796942SQ200410155550
公開日2006年7月5日 申請日期2004年12月21日 優(yōu)先權(quán)日2004年12月21日
發(fā)明者時宜, 涂高元, 邱志斌, 陳典全, 許寧, 余建成 申請人:廈門雅迅網(wǎng)絡(luò)股份有限公司