一種帶約束條件的拓?fù)鋱D最優(yōu)路徑算法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及拓?fù)鋱D最優(yōu)路徑算法,具體涉及一種帶約束條件的拓?fù)鋱D最優(yōu)路徑算法。
【背景技術(shù)】
[0002]在電信傳輸網(wǎng)中,電信設(shè)備為網(wǎng)絡(luò)的通信節(jié)點(diǎn),光纖連接兩臺(tái)電信設(shè)備為通信通道,許多電信設(shè)備連接起來(lái)組成了整個(gè)通信網(wǎng)絡(luò)。
[0003]在工程上,配置電信傳輸網(wǎng)電路時(shí),需要尋找到從一臺(tái)電信設(shè)備經(jīng)過(guò)指定的電信設(shè)備和光纖到另一臺(tái)電信設(shè)備的最優(yōu)路徑。為了方便解決問(wèn)題,將電信傳輸網(wǎng)抽象成拓?fù)鋱D的形式,電信設(shè)備作為拓?fù)涔?jié)點(diǎn),光纖作為拓?fù)滏溌?;這樣問(wèn)題就轉(zhuǎn)變?yōu)槿绾卧谕負(fù)鋱D中尋找從源拓?fù)涔?jié)點(diǎn)到宿拓?fù)涔?jié)點(diǎn)的最優(yōu)路徑,并且滿足指定的約束條件。
[0004]目前,在拓?fù)鋱D中尋找兩拓?fù)涔?jié)點(diǎn)間最優(yōu)路徑的確定性算法是Dijkstra算法,但是該算法存在一下不足:
[0005](I)無(wú)法指定最優(yōu)路徑的約束條件,即無(wú)法指定最優(yōu)路徑必經(jīng)的拓?fù)涔?jié)點(diǎn)和拓?fù)滏溌罚矡o(wú)法指定最優(yōu)路徑避開(kāi)的拓?fù)涔?jié)點(diǎn)和拓?fù)滏溌罚?br>[0006](2)無(wú)法保證最優(yōu)路徑不重復(fù)經(jīng)過(guò)某一拓?fù)涔?jié)點(diǎn)或拓?fù)滏溌罚?br>[0007](3)定義拓?fù)涔?jié)點(diǎn)的度數(shù)為拓?fù)涔?jié)點(diǎn)連接的拓?fù)滏溌返臄?shù)目,當(dāng)源拓?fù)涔?jié)點(diǎn)的度數(shù)較大時(shí),尋找最優(yōu)路徑的時(shí)間顯著增加,無(wú)法滿足工程應(yīng)用對(duì)時(shí)間的要求。
【發(fā)明內(nèi)容】
[0008]本發(fā)明所要解決的技術(shù)問(wèn)題是在指定約束條件下,尋找源、宿拓?fù)涔?jié)點(diǎn)間的最優(yōu)路徑的問(wèn)題。
[0009]為了解決上述技術(shù)問(wèn)題,本發(fā)明所采用的技術(shù)方案是提供一種帶約束條件的拓?fù)鋱D最優(yōu)路徑算法,包括以下步驟:
[0010]步驟S10、將電信傳輸網(wǎng)中所有電信設(shè)備抽象生成拓?fù)涔?jié)點(diǎn),電信設(shè)備間的所有光纖連接抽象生成拓?fù)滏溌?,組成拓?fù)渚仃嚕?br>[0011]步驟S20、選擇源拓?fù)涔?jié)點(diǎn)Ns和宿拓?fù)涔?jié)點(diǎn)Nd ;
[0012]步驟S30、選擇路徑必須經(jīng)過(guò)的拓?fù)涔?jié)點(diǎn)和拓?fù)滏溌?,按預(yù)設(shè)順序建立必經(jīng)拓?fù)涔?jié)點(diǎn)列表和必經(jīng)拓?fù)滏溌妨斜?,并將必?jīng)拓?fù)滏溌忿D(zhuǎn)化為必經(jīng)拓?fù)涔?jié)點(diǎn),順序添加到必經(jīng)拓?fù)涔?jié)點(diǎn)列表中;
[0013]步驟S40、建立避開(kāi)拓?fù)涔?jié)點(diǎn)列表和避開(kāi)拓?fù)滏溌妨斜恚⒏峦負(fù)渚仃嚕?br>[0014]步驟S50、設(shè)置當(dāng)前尋路的起始拓?fù)涔?jié)點(diǎn)和終結(jié)拓?fù)涔?jié)點(diǎn)分別為必經(jīng)拓?fù)涔?jié)點(diǎn)Nt和Ne,并判定必經(jīng)拓?fù)涔?jié)點(diǎn)Nt是否連接必經(jīng)拓?fù)滏溌稬〈t,e>,如果是,執(zhí)行步驟S60 ;否貝1J,執(zhí)行步驟S70 ;
[0015]步驟S60、將必經(jīng)拓?fù)涔?jié)點(diǎn)Nt、Ne和必經(jīng)鏈路L〈t,e>加入到整體路徑中,執(zhí)行步驟 S80 ;
[0016]步驟S70、在必經(jīng)拓?fù)涔?jié)點(diǎn)Nt、Ne間尋找最優(yōu)路徑,加入到整體路徑中,執(zhí)行步驟S80 ;
[0017]步驟S80、判斷當(dāng)前終結(jié)拓?fù)涔?jié)點(diǎn)Ne是否為宿拓?fù)涔?jié)點(diǎn)Nd,如果是,則結(jié)束程序;否則,執(zhí)行步驟S90;
[0018]步驟S90、將必經(jīng)拓?fù)涔?jié)點(diǎn)Nt、Ne間最優(yōu)路徑中的拓?fù)涔?jié)點(diǎn)設(shè)置為避開(kāi)的拓?fù)涔?jié)點(diǎn),將必經(jīng)拓?fù)涔?jié)點(diǎn)Nt、Ne間的最優(yōu)路徑中的拓?fù)滏溌吩O(shè)置為避開(kāi)的拓?fù)滏溌?,然后?zhí)行步驟S40。
[0019]在上述方法中,所述拓?fù)渚仃嚍猷徑泳仃嚕總€(gè)拓?fù)涔?jié)點(diǎn)按序號(hào)順序組成列表,以每個(gè)拓?fù)涔?jié)點(diǎn)Nk作為起始的拓?fù)滏溌妨斜頌長(zhǎng)〈k,*>,其中,*為與拓?fù)涔?jié)點(diǎn)Nk關(guān)聯(lián)的拓?fù)涔?jié)點(diǎn)序號(hào);拓?fù)滏溌妨斜淼拿宽?xiàng)包括權(quán)值和對(duì)應(yīng)拓?fù)滏溌返慕K結(jié)拓?fù)涔?jié)點(diǎn),每個(gè)拓?fù)涔?jié)點(diǎn)Nk維護(hù)與其關(guān)聯(lián)的拓?fù)滏溌妨斜怼?br>[0020]在上述方法中,步驟S40到步驟S90的步驟會(huì)迭代多次,從源拓?fù)涔?jié)點(diǎn)Ns開(kāi)始,依次向后一個(gè)必經(jīng)拓?fù)涔?jié)點(diǎn)尋路,一直到宿拓?fù)涔?jié)點(diǎn)Nd為止,依次尋找相鄰兩個(gè)必經(jīng)拓?fù)涔?jié)點(diǎn)間的最優(yōu)路徑,把這些最優(yōu)路徑依次連接組成經(jīng)過(guò)所有必經(jīng)拓?fù)涔?jié)點(diǎn)的最優(yōu)整體路徑;
[0021]如果必經(jīng)拓?fù)涔?jié)點(diǎn)列表中IncludeNodeList中的必經(jīng)拓?fù)涔?jié)點(diǎn)有m個(gè),那么第i次迭代從必經(jīng)拓?fù)涔?jié)點(diǎn)IncludeNodeList [i]尋路到必經(jīng)拓?fù)涔?jié)點(diǎn)IncludeNodeList [i+Ι],其中0〈i〈m。
[0022]在上述方法中,步驟S30具體包括以下步驟:
[0023]步驟S31、將源拓?fù)涔?jié)點(diǎn)Ns加入到必經(jīng)拓?fù)涔?jié)點(diǎn)列表中;
[0024]步驟S32、將其他必經(jīng)拓?fù)涔?jié)點(diǎn)按約束條件順序要求依次插入到必經(jīng)拓?fù)涔?jié)點(diǎn)列表中;
[0025]步驟S33、順序取必經(jīng)拓?fù)滏溌妨斜碇械囊粭l拓?fù)滏溌稬〈i,j> ;
[0026]步驟S34、判斷拓?fù)涔?jié)點(diǎn)Ni是否在必經(jīng)拓?fù)涔?jié)點(diǎn)列表中,如果是,執(zhí)行步驟S35 ;否貝1J,執(zhí)行步驟S38;
[0027]步驟S35、將拓?fù)涔?jié)點(diǎn)Nj插入到必經(jīng)拓?fù)涔?jié)點(diǎn)列表中,位置在拓?fù)涔?jié)點(diǎn)Ni之后;
[0028]步驟S36、判斷拓?fù)涔?jié)點(diǎn)Nj是否在必經(jīng)拓?fù)涔?jié)點(diǎn)列表中,如果是,則執(zhí)行步驟S37 ;否則,執(zhí)行步驟S38;
[0029]步驟S37、將拓?fù)涔?jié)點(diǎn)Ni插入到必經(jīng)拓?fù)涔?jié)點(diǎn)列表中,位置在拓?fù)涔?jié)點(diǎn)Nj之前,然后執(zhí)彳丁步驟S39 ;
[0030]步驟S38、將拓?fù)涔?jié)點(diǎn)Ni和Nj順序插入到必經(jīng)拓?fù)涔?jié)點(diǎn)列表的最后;
[0031]步驟S39、判斷必經(jīng)拓?fù)滏溌妨斜硎欠褚呀?jīng)遍歷完,如果未遍歷完,則執(zhí)行步驟S33 ;否則,執(zhí)行步驟S310 ;
[0032]步驟S310、將宿拓?fù)涔?jié)點(diǎn)Nd加入到必經(jīng)拓?fù)涔?jié)點(diǎn)列表最后,作為必經(jīng)拓?fù)涔?jié)點(diǎn)列表中最后一個(gè)元素,結(jié)束流程。
[0033]在上述方法中,步驟S40具體包括以下步驟:
[0034]步驟S41、順序取避開(kāi)拓?fù)涔?jié)點(diǎn)列表的一個(gè)拓?fù)涔?jié)點(diǎn)Nk ;
[0035]步驟S42、刪除拓?fù)渚仃囍械耐負(fù)涔?jié)點(diǎn)Nk以及與其關(guān)聯(lián)的拓?fù)滏溌妨斜恚?br>[0036]步驟S43、遍歷拓?fù)渚仃嚨钠渌負(fù)涔?jié)點(diǎn),在與其他拓?fù)涔?jié)點(diǎn)關(guān)聯(lián)的拓?fù)滏溌妨斜碇袆h除拓?fù)涔?jié)點(diǎn)Nk ;
[0037]步驟S44、判斷避開(kāi)拓?fù)涔?jié)點(diǎn)列表是否遍歷完,如果沒(méi)有遍歷完,則執(zhí)行步驟S41 ;否則,執(zhí)行步驟S45;
[0038]步驟S45、順序取避開(kāi)拓?fù)滏溌妨斜碇械囊粭l拓?fù)滏溌稬〈i,j> ;
[0039]步驟S46、找到拓?fù)渚仃囍械耐負(fù)涔?jié)點(diǎn)Ni,遍歷與其關(guān)聯(lián)的拓?fù)滏溌妨斜恚瑒h除其中的拓?fù)涔?jié)點(diǎn)Nj ;
[0040]步驟S47、找到拓?fù)渚仃囍械耐負(fù)涔?jié)點(diǎn)Nj,遍歷與其關(guān)聯(lián)的拓?fù)滏溌妨斜?,刪除其中的拓?fù)涔?jié)點(diǎn)Ni ;
[0041]步驟S48、判斷避開(kāi)拓?fù)滏溌妨斜硎欠癖闅v完,如果沒(méi)有遍歷完,則執(zhí)行步驟S45,否則,結(jié)束程序。
[0042]在上述方法中,步驟70具體包括以下步驟:
[0043]步驟S71、計(jì)算當(dāng)前起始拓?fù)涔?jié)點(diǎn)Nt和終結(jié)拓?fù)涔?jié)點(diǎn)Ne的度數(shù),并比較拓?fù)涔?jié)點(diǎn)Nt的度數(shù)是否比拓?fù)涔?jié)點(diǎn)Ne的大,如果是,則執(zhí)行步驟S72 ;否則,執(zhí)行步驟S73 ;
[0044]步驟S72、設(shè)置拓?fù)涔?jié)點(diǎn)Ne當(dāng)前起始拓?fù)涔?jié)點(diǎn),拓?fù)涔?jié)點(diǎn)Nt為當(dāng)前終結(jié)拓?fù)涔?jié)占.V,
[0045]步驟S73、使用Dijkstra算法計(jì)算從起始拓?fù)涔?jié)點(diǎn)Ne到終結(jié)拓?fù)涔?jié)點(diǎn)Nt的最優(yōu)路徑;
[0046]步驟S74、判斷拓?fù)涔?jié)點(diǎn)Nt和Ne是否執(zhí)行了步驟S72,如果是,執(zhí)行步驟S75 ;否貝IJ,結(jié)束程序;
[0047]步驟S75、反轉(zhuǎn)最優(yōu)路徑,結(jié)束程序。
[0048]本發(fā)明通過(guò)刪除拓?fù)渚仃囍械耐負(fù)涔?jié)點(diǎn)和拓?fù)滏溌返姆椒?,使得尋路中避開(kāi)了指定的拓?fù)涔?jié)點(diǎn)和拓?fù)滏溌?;再通過(guò)將指定的必經(jīng)拓?fù)滏溌稬〈i,j>的拓?fù)涔?jié)點(diǎn)Ni和Nj依次加入到必經(jīng)拓?fù)涔?jié)點(diǎn)列表IncIudeNodeLi st的方法,使得尋得的最優(yōu)路徑一定經(jīng)過(guò)拓?fù)滏溌稬〈i,j>