專利名稱:一種基于Boost庫的K則最短路徑搜索方法和系統的制作方法
技術領域:
本發明屬于計算機網絡領域,具體涉及一種基于Boost庫的K則最短路徑搜索方法和系統。
背景技術:
在網絡規劃或路徑搜索中,經常需要尋找新路由,一般地,這可以通過圖論中的最短路徑方法解決。常用的最短路方法是廣度優先方法、dijkstra方法等經典方法。這些方法的一個共同特點是只尋找圖中給定點到任意點間的最短路徑。但是這在實踐中往往是不夠的,比如,在路由規劃中,除了最短路徑外,可能需要尋找第二短路徑作為備用,在有些條件下,可能需要尋找第三、第四短的路徑或者所有路徑。這類問題統一稱為K短路徑問題或 K則最短路徑問題。K短路徑問題最早由Hoffman和I^avley提出,多年來一直受到業界廣泛重視,K短徑分為嚴密K則最短路徑方法和有損K則最短路徑方法兩類。前者具有嚴密的理論基礎,所得到的K條路徑是起終點間所有可能路徑按權值遞增排序后的前K條路徑,后者通過啟發式策略等技術,通過犧牲有限的精度以換取效率的大幅度提高。根據路徑是否成環,K則最短路徑方法還可以分為限定無環方法和自由路徑方法。前者要求求得的路徑必須是簡單路徑,不能含有回路,后者允許路徑包含回路。限定無環路徑的K則最短路徑應用更加普遍。 本發明針對限定無環K短路徑。與單源最短路徑問題相比,K則最短路徑問題在方法設計上更為復雜,目前尚沒有一種K則最短路徑方法如單源最短路徑方法中的Dijkstra方法一樣得到業界共識并且達到大規模實用化程度。對于單源最短路徑問題,已經有現成的可以直接調用的高效率免費開源計算機方法,最著名的是C++Boost Graph圖庫。該庫已經集成了圖論中的大多數基本方法,包括BFS、DFS、dijkstra. Bellman R)rd等基本最短路徑方法,這樣大大減輕了應用的難度,基本可以直接嵌入在自己代碼中,不需要單獨編寫方法本身代碼。常用的K短路徑搜索方法有刪除邊方法、偏離邊方法等。但是這些方法僅僅是一種理論上的模型,與實際應用還有一定差距,不同于最短路徑方法,尚未有開源的成熟高效計算機方法可供直接應用。
發明內容
本發明的目的是供一種能直接應用于網絡的多重最短路徑搜索方法,該方法應能解決以下幾個方面具體問題1)可提供限定無環路徑的K則最短路徑問題的計算機算法,具有實用性,而非一種純理論上的算法概念;2)給出源宿節點間任意給定數目(即K數)并且以路徑距離排序的所有路徑,如果實際路徑數小于K或K = 0,則給出所有實際路徑,否則給出前K短路徑;3)可提供限定分離條件的K則最短路徑問題計算機算法,限定分離方式分別為節點分離、邊分離、不分離3種;為實現上述目的,本發明提供一種基于Boost庫的K則最短路徑搜索方法,其改進之處在于該方法在成熟的C++Boost Graph圖庫基礎之上擴展K則最短路徑算法;采用d 叉堆數據結構最優化排序待選最短路徑;采用偏離邊的方式發展多重最短路由。本發明提供的優選技術方案中,所述K短路徑搜索方法包括如下步驟步驟1 調用Boost庫函數計算源宿節點間最短路徑,令k = 1 ;步驟2 如果要求路徑分離,則調用支持分離的K短路徑算法,否則進入步驟3 ;步驟3 定義d叉堆數據結構Q,將所求最短路徑放入堆Q ;步驟4 判斷如果k < K且堆Q不空,進入步驟5,否則算法結束;步驟5 從堆Q中彈取出第k短路徑,記為P,采用偏離邊方法從ρ發展新的偏離短路徑,存入堆Q ;步驟6 :k++,返回步驟4 ;本發明提供的第二優選技術方案中,在所述步驟2中支持分離的K短路徑搜索方法包括如下步驟步驟2-1 判斷如果k < K并且第k短路徑非空則進入步驟2-2,否則算法結束;步驟2-2 將前k短路徑所有節點或邊存入排除列表;步驟2-3 調用改進Boost庫函數,忽略(不遍歷)排除列表中的節點或邊,求得第k+Ι短路徑,存入所求K短路徑集;步驟2-4 :k++,返回步驟2-1。本發明提供的第三優選技術方案中,在所述步驟5中以路徑ρ為基礎發展偏離路徑方法包括如下步驟步驟5-1 令i =路徑ρ偏離點索引;步驟5-2 判斷如果i < p. size ()則進入步驟5-3,否則算法結束;步驟5-3 記錄i對應節點為dev,記錄路徑ρ中第一個節點到第i節點集合為 colors,記錄節點dev對應偏離邊集合為edges ;步驟5-4 調用Boost函數計算以節點dev為始的最短路徑Pt,需忽略節點集 colors 禾口邊集 edges ;步驟5-5 根據Pt與colors合成新路徑_p,計算_p的偏離點、偏離邊集并作記錄;步驟5-6 將新路徑_p存入d叉堆Q,i++,返回步驟5-2。本發明提供的第四優選技術方案中,提供一種基于Boost庫的K則最短路徑搜索系統,其改進之處在于,所述搜索系統包括最短路徑計算單元,調用Boost庫函數計算含有限定條件的源宿節點間最短路徑;分離路徑計算單元,判斷最短路徑分離方式,如果要求路徑分離,則調用支持分離的K短路徑算法;K短路徑篩選單元,設置d叉堆數據結構Q,將所求k短路徑存入堆Q,并且自動篩選出第k短路徑;偏離路徑計算單元,根據從堆Q中彈取出的第k短路徑P,采用偏離邊方法從ρ發
5展新的偏離短路徑,存入堆Q。本發明提供的第五優選技術方案中,所述分離路徑判斷計算單元,包括排除列表存儲模塊,存儲前k短路徑節點集和邊集;分離路徑計算模塊,采用Boost庫函數并且忽略排除列表中的節點集或邊集計算第k+Ι短路徑,存入所求K短路徑集。本發明提供的第六優選技術方案中,所述偏離路徑計算單元,包括偏離邊存儲模塊,依次記錄前k短路徑的偏離點與偏離邊集;偏離路徑發展模塊,以第k短路徑ρ為基礎,發展其對應的偏離路徑集,并且存入 d叉堆Q;偏離路徑合成模塊,將路徑ρ偏離點前一段路徑與以偏離點為始的最短路徑合成新路徑_P,計算_P偏離點、偏離邊集并存儲。與現有技術方法相比,本發明提供的一種基于Boost庫的K則最短路徑搜索方法與系統,具有如下的特點1)采用STL標準模板庫作為基本數據結構,拼棄傳統固定大小數組結構,講求高效率、高精度原則;2)由于采用了 Boost庫的成熟數據結構和高效率的算法步驟,大大減少了計算的時間復雜度和空間復雜度,本發明可以適用于上百節點大規模網絡的K短路由計算;3)本發明的方法是從計算機應用角度考慮,而非一般意義上的單純算法概念,因此使網絡多重路由問題的搜尋方法更加接近實用化,大大減輕實際設計或開發算法的工作量。
圖1為K則最短路徑計算機搜索方法的流程圖。圖2為支持分離方式的K則最短路徑計算方法的流程圖。圖3為從給定最短路徑基礎上發展偏離路徑的流程圖。
具體實施例方式為了使本發明的目的、技術方案和優點更加清楚,下面結合附圖及實例對本發明作進一步詳細描述。假設所求K短路徑問題是計算從s點到t點的路徑跳數從小到大排序的前K短路徑,要求所求最短路徑不作分離限定。參考圖1,為本發明所述K則最短路由計算機算法流程,結合上面的具體問題分析得如下所述具體步驟步驟1 定義所求前K短路徑集為Kpaths。步驟2 調用Boost Graph庫的BFS函數計算s — t的最短路徑;步驟3 由于所求最短路徑不作分離限定,直接進入步驟4 步驟4 定義d叉堆數據結構Q,將所求最短路徑放入堆Q ;步驟5 記最短路徑第一個頂點為其偏離點,記錄該路徑每個頂點的偏離邊集為其出邊;
步驟6 令 k = 1 ;步驟7 判斷如果k < K并且堆Q非空則進入步驟8,否則算法結束;步驟8 彈出堆Q對應的最短路徑p,即為所求的第k短路徑,存入路徑集Kpaths ;步驟9 根據所求第k短路徑p,從其偏離點到最后一個頂點作遍歷,依次發展新偏離點及偏離路徑、更新頂點偏離邊集,將所求偏離路徑存入堆Q ;步驟10 :k++,返回步驟7 ;根據上面的流程,算法結束后,路徑集Kpaths所存即為以路由路徑跳數排序的前 K短路徑。如上所述步驟9中,以當前第k短路徑ρ為基礎發展新偏離路徑是一個復雜過程, 下面以前面實例為基礎作詳細描述。參考圖3,為本發明所述從給定最短路徑基礎上發展偏離路徑的算法流程,假定已經執行到步驟9,并且已求得第k短路徑p,下面為從該路徑ρ上發展偏離路徑的算法流程, 算法步驟號從1開始重新編號,求其詳細步驟如下步驟9-1 令i =路徑ρ偏離點索引;步驟9-2 判斷如果i < p. size ()則進入步驟3,否則算法結束;步驟9-3 記錄i對應偏離點為dev,記錄路徑ρ中第一個節點到第i節點集合為 colors,記錄節點dev對應偏離邊集合為edges ;步驟9-4 調用BFS算法計算以節點dev為始的最短路徑Pt,需忽略節點集colors 和邊集edges ;步驟9-5 根據Pt與colors合成新路徑_p,計算_p的偏離點、偏離邊集并作記錄;步驟9-6 將新路徑_p存入d叉堆Q,i++,返回第2步。如上所述,每次在步驟5中獲得新偏離路徑_p,步驟6中存入堆Q,當本次算法結束后,Q中已經添加了以路徑P為基礎發展出來的待選路徑集,這時進入前面K短路徑算法步驟10循環執行即可求s點到t點的所有K短路徑。以上的搜索從s點到t點不分離的、以路徑跳數排序的前K短路徑問題中,步驟2、 步驟9-4采用本發明所述K短路徑搜索系統(以下簡稱搜索系統)中的“最短路徑計算單元”計算所得;步驟4、步驟8、步驟9中對待選k短路徑操作采用本搜索系統中的“K短路徑篩選單元”計算所得;步驟9中的偏離路徑采用本搜索系統的“偏離路徑計算單元”計算所得;步驟9-3、步驟9-5采用“偏離邊存儲模塊”讀取或記錄新路徑_p的偏離點與偏離邊集;步驟9-5采用“偏離邊合成模塊”計算得新待選k短路徑_p。以上對本發明的實施步驟結合一個需求實例進行了詳細說明,以上實施例的說明只是用于幫助理解本發明的方法及其核心思想,實際可有不同于該實施例的步驟參數;同時,本發明所述的調用算法名稱及一些特定數據結構名稱均出自于Boost Graph庫,如果需要詳細了解本算法思想,必須首先了解Graph圖庫中相關算法及其所用的基本數據結構。需要聲明的是,本發明內容及具體實施方式
意在證明本發明所提供技術方案的實際應用,不應解釋為對本發明保護范圍的限定。本領域技術人員在本發明的精神和原理啟發下,可作各種修改、等同替換、或改進。但這些變更或修改均在申請待批的保護范圍內。
權利要求
1.一種基于Boost庫的K則最短路徑搜索方法,所述方法采用偏離邊算法搜尋多重路由,其特征在于,包括以下步驟(1).調用Boost庫函數計算源宿節點間最短路徑,定義變量k,令k=1 ;(2).判斷最短路徑分離方式,如果要求路徑分離,則調用支持分離的K短路徑算法,否則進入步驟3 ;(3).定義d叉堆數據結構Q,將所求最短路徑放入堆Q;(4).從堆Q中彈取出第k短路徑,記為p,采用偏離邊方法從ρ發展新的偏離路徑,存入堆Q。
2.根據權利要求1所述的搜索方法,其特征在于,所述步驟2中K是指所搜索的源宿節點間的指定的最短路徑個數。
3.根據權利要求1所述的搜索方法,其特征在于,所述步驟4是一個循環過程,循環變量為k,每次循環后k++ ;在步驟4之前需要作條件判斷,如果k < K且堆Q不空,則進入循環,否則算法結束。
4.根據權利要求1所述的搜索方法,其特征在于,所述步驟2中計算支持路徑分離的K 則最短路徑的方法包括以下步驟(2-1).采用排除列表存儲前k短路徑節點或邊;(2-2).采用Boost庫函數并且忽略排除列表中的節點或邊計算第k+Ι短路徑,存入所求K短路徑集。
5.根據權利要求1所述的搜索方法,其特征在于,所述步驟4中以路徑ρ為基礎,發展偏離路徑,其方法包括如下步驟(4-1).記錄路徑ρ偏離點為dev,記錄ρ中dev前一段節點集合為colors,記錄dev對應的偏離邊集合為edges ;(4-2).計算以節點dev為始的最短路徑Pt,忽略節點集color、邊集edges ;(4-3).根據Pt與路徑ρ中dev前一段路徑節點合成新路徑_P,計算_P偏離點、偏離邊集并作記錄;(4-4).新路徑_p存入d叉堆Q。
6.根據權利要求4所述的搜索方法,其特征在于該方法為一個循環過程,循環變量為 k,每次循環后k++ ;在步驟2-1之前需要作條件判斷,如果k < K并且第k短路徑非空,則進入循環,否則算法結束。
7.根據權利要求5所述的搜索方法,其特征在于該方法為一個循環過程,第一次循環中dev為路徑ρ偏離點,以后依次為從P中該點后一個節點直到最末一個節點作循環。
8.一種基于Boost庫的K則最短路徑搜索系統,其特征在于,所述系統包括最短路徑計算單元,調用Boost庫函數計算含有限定條件的源宿節點間最短路徑;分離路徑計算單元,判斷短路徑分離方式,如果要求路徑分離,則調用支持分離的K短路徑算法;K短路徑篩選單元,設置d叉堆數據結構Q,將所求k短路徑存入堆Q,并且自動篩選出第k短路徑;偏離路徑計算單元,根據從堆Q中彈取出的第k短路徑p,采用偏離邊方法從ρ發展新的偏離短路徑集,存入堆Q。
9.根據權利要求8所述的搜索系統,其特征在于,所述分離路徑計算單元,包括 排除列表存儲模塊,存儲前k短路徑節點集和邊集;分離路徑計算模塊,采用Boost庫函數并且忽略排除列表中的節點集或邊集計算第 k+Ι短路徑,存入所求K短路徑集。
10.根據權利要求8所述的搜索系統,其特征在于,所述偏離路徑計算單元,包括 偏離邊存儲模塊,依次記錄前k短路徑的偏離點與偏離邊集;偏離路徑發展模塊,以第k短路徑ρ為基礎,發展其對應的偏離路徑集,并且存入d叉堆Q;偏離路徑合成模塊,將路徑P偏離點前一段路徑與以偏離點為始的最短路徑合成新路徑_P,計算_P偏離點、偏離邊集并存儲。
全文摘要
本發明提供了一種基于Boost圖庫的K則最短路徑搜索方法和系統,所述方法在成熟的C++Boost Graph圖庫基礎之上擴展K則最短路徑算法;采用d叉堆數據結構最優化排序待選最短路徑;采用偏離邊的方式發展多重最短路由。該方法是從計算機應用角度考慮,在一定程度上解決K則最短路徑問題的實用化難題,大大減輕實際設計或開發算法的工作量。該系統是基于該方法的一套軟硬件系統,其已經集成了該方法的所有發明內容并且可以直接搜索計算前K短路徑。
文檔編號H04L12/56GK102523155SQ20111040647
公開日2012年6月27日 申請日期2011年12月8日 優先權日2011年12月8日
發明者盧利鋒, 周靜 申請人:中國電力科學研究院