本發(fā)明涉及一種包含必經(jīng)節(jié)點(diǎn)集的最佳路徑求解方法。
背景技術(shù):
算路問題屬于基礎(chǔ)算法問題,在圖論、網(wǎng)絡(luò)、交通等各個(gè)方面均有著廣泛的研究與運(yùn)用,其中經(jīng)典的算法有最短路徑的Floyd算法,Dijkstra算法等。Floyd算法又稱為插點(diǎn)法,是一種用于尋找給定的加權(quán)圖中多源點(diǎn)之間最短路徑的算法,使用該算法可以很方便的計(jì)算出任意兩個(gè)節(jié)點(diǎn)間的最短距離。Dijkstra算法是典型的單源路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑,主要特點(diǎn)是以起始點(diǎn)為中心向外層層擴(kuò)展,直到擴(kuò)展到終點(diǎn)為止,使用該算法可以快速求出任意兩點(diǎn)間的最短路徑。這些算法可以很好的解決沒有約束條件少的單源路徑問題。
但是隨著應(yīng)用領(lǐng)域的不斷擴(kuò)展,網(wǎng)絡(luò)規(guī)模與復(fù)雜度不斷增大,用戶需求也日趨復(fù)雜化,傳統(tǒng)的經(jīng)典尋路算法以及其一系列面向地理網(wǎng)絡(luò)或特定路徑規(guī)劃的優(yōu)化算法,很難滿足這一需求。主要表現(xiàn)為:節(jié)點(diǎn)與弧段數(shù)大幅度增加,導(dǎo)致路徑搜索算法復(fù)雜度增加較快;多只考慮權(quán)重,缺乏節(jié)點(diǎn)和弧段的多屬性集成;對(duì)節(jié)點(diǎn)數(shù)目和經(jīng)過特定節(jié)點(diǎn)集約束需求日漸增多。在新的應(yīng)用背景下,算路問題也必然要面對(duì)這些新的問題。基于算路問題的廣泛應(yīng)用性,算路問題的更優(yōu)算法實(shí)現(xiàn)對(duì)于網(wǎng)絡(luò)資源高效配置,交通路徑選擇等具有重要價(jià)值。此外,代數(shù)矩陣可直接支撐高階矩陣分析,基于代數(shù)矩陣的網(wǎng)絡(luò)分析算法具有結(jié)構(gòu)清晰、算法簡單等特點(diǎn)。其優(yōu)越的矩陣構(gòu)造和分析能力可為多維路徑網(wǎng)絡(luò)表達(dá)與分析計(jì)算提供有效的支撐。其空間自定義,運(yùn)算的對(duì)象無關(guān)與維度無關(guān)特性使得其在路徑結(jié)構(gòu)表達(dá)與求解方面具有獨(dú)特優(yōu)勢(shì),并可用于多約束問題的統(tǒng)一求解。將路徑節(jié)點(diǎn)轉(zhuǎn)化為字符串,進(jìn)而建立路徑字符串矩陣,這種字符串矩陣既具備一般代數(shù)矩陣運(yùn)算的特點(diǎn)和特性,又包含路徑字符串運(yùn)算的特殊規(guī)則。因此,基于路徑字符串矩陣進(jìn)行多約束網(wǎng)絡(luò)分析算法設(shè)計(jì)可以為包含特點(diǎn)節(jié)點(diǎn)集的節(jié)點(diǎn)路徑網(wǎng)絡(luò)問題提供可行的解決方案。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于提供一種包含必經(jīng)節(jié)點(diǎn)集的最佳路徑求解方法,以克服現(xiàn)有技術(shù)中存在的缺陷。
為實(shí)現(xiàn)上述目的,本發(fā)明的技術(shù)方案是:一種包含必經(jīng)節(jié)點(diǎn)集的最佳路徑求解方法,按照如下步驟實(shí)現(xiàn):
步驟S1:通過有向帶權(quán)圖的路徑數(shù)據(jù)和必經(jīng)節(jié)點(diǎn)集數(shù)據(jù),建立有向帶權(quán)圖的鄰接矩陣,并根據(jù)鄰接矩陣的路徑連通信息,將路徑節(jié)點(diǎn)轉(zhuǎn)化為路徑字符串,構(gòu)建用于運(yùn)算路徑的字符串路徑計(jì)算矩陣C和用于存儲(chǔ)路徑網(wǎng)絡(luò)信息的字符串路徑網(wǎng)絡(luò)矩陣W;
步驟S2:初始化所述字符串路徑計(jì)算矩陣和所述字符串路徑網(wǎng)絡(luò)矩陣,進(jìn)行字符串矩陣右乘運(yùn)算,使得矩陣中路徑節(jié)點(diǎn)個(gè)數(shù)滿足最少路徑節(jié)點(diǎn)個(gè)數(shù)需求;
步驟S3:將矩陣中字符串路徑轉(zhuǎn)化為并列獨(dú)立的路徑集,檢查所獲得的每一條路徑中是否包含全部的必經(jīng)路徑節(jié)點(diǎn),如果全都包含,則保存該條路徑,否則,舍棄;同時(shí),計(jì)算符合上述條件的路徑的累加權(quán)重,并保留權(quán)重最小的路徑;
步驟S4:循環(huán)遍歷每條可行的路徑,保存每次遍歷獲得的代價(jià)最小路徑;
步驟S5:檢測(cè)路徑集存儲(chǔ)空間是否為空,為空則表明沒有符合條件的路徑,輸出NP,結(jié)束整個(gè)運(yùn)算;若不為空,則以權(quán)重為參考標(biāo)準(zhǔn),獲取路徑集中累加權(quán)重最小且路徑節(jié)點(diǎn)數(shù)最少的路徑,即為所求的最佳路徑。
在本發(fā)明一實(shí)施例中,在所述步驟S1中,所述有向帶權(quán)圖的路徑數(shù)據(jù)為描述復(fù)雜路由網(wǎng)絡(luò)本身的屬性數(shù)據(jù),所述必經(jīng)節(jié)點(diǎn)集數(shù)據(jù)用以約束所求路徑的中間節(jié)點(diǎn);所述有向帶權(quán)圖的路徑數(shù)據(jù)以及所述必經(jīng)節(jié)點(diǎn)集數(shù)據(jù)存儲(chǔ)于一.csv數(shù)據(jù)文件,該.csv數(shù)據(jù)文件的文件頭部包括路徑節(jié)點(diǎn)的總節(jié)點(diǎn)數(shù)、通路個(gè)數(shù)以及每行的列數(shù);根據(jù)文件頭部的路徑網(wǎng)絡(luò)數(shù)據(jù)的大小讀取路徑節(jié)點(diǎn)數(shù)據(jù);根據(jù)路徑節(jié)點(diǎn)號(hào)和路徑代價(jià)值建立鄰接矩陣,若兩個(gè)路徑不通或路徑節(jié)點(diǎn)到其本身,則對(duì)應(yīng)的代價(jià)值為無窮大。
在本發(fā)明一實(shí)施例中,在所述步驟S1中,按照如下方式構(gòu)建字符串路徑網(wǎng)絡(luò)矩陣W:將有向路徑節(jié)點(diǎn)字符串化,將單一的路徑節(jié)點(diǎn)轉(zhuǎn)化為兩兩相通的路徑通路字符串,字符串路徑網(wǎng)絡(luò)矩陣為方陣,其維度數(shù)與相應(yīng)的有向路徑節(jié)點(diǎn)總個(gè)數(shù)相同;字符串路徑網(wǎng)絡(luò)矩陣的維度與鄰接矩陣的維度相同,均為n*n,n為路徑節(jié)點(diǎn)總數(shù);
按照如下方式構(gòu)建字符串路徑計(jì)算矩陣C:將有向路徑節(jié)點(diǎn)字符串化,字符串路徑計(jì)算矩陣維度為2*n的矩陣,n為路徑節(jié)點(diǎn)總數(shù),第一行為起點(diǎn)到其他各個(gè)節(jié)點(diǎn)的路徑信息,第二行為終點(diǎn)到其他各個(gè)節(jié)點(diǎn)的路徑信息。
在本發(fā)明一實(shí)施例中,在所述步驟S2中,對(duì)于路徑節(jié)點(diǎn)總數(shù)為n的路徑網(wǎng)絡(luò),記路徑的起止節(jié)點(diǎn)為a和b,其字符串路徑計(jì)算矩陣Cm為一2*n的矩陣j=1,2,…,n,m為必經(jīng)節(jié)點(diǎn)集里的節(jié)點(diǎn)數(shù),則基于路徑的運(yùn)算規(guī)則可知,計(jì)算矩陣中路徑的擴(kuò)展方法為:
Cm=Cm-1*W1=Cm-2*W1*W1=C1*W1*···W1
在字符串矩陣右乘運(yùn)算中,包括路徑字符串加法運(yùn)算以及路徑字符串乘法運(yùn)算,所述路徑字符串加法運(yùn)算如下:
(1)“a1|a2”+“0”=“a1|a2”;
(2)“a1|a2”+“a1|a2”=“a1|a2”;
(3)“a1|a2”+”a3|a2”=“a1|a2+a3|a2”;
所述路徑字符串乘法運(yùn)算如下:
(1)“a1|a2”*“0”=“0”;
(2)“a1|a2”*“a3|a2”=“0”;
(3)“a1|a2”*“a2|a3”=“a1|a2|a3”
(4)“a1|a2”*“a2|a3|a1”=“a1|a2|a3|a1”=“0”
其中,a1、a2、a3、a4表示字符串路徑節(jié)點(diǎn);若路徑節(jié)點(diǎn)a1到路徑節(jié)點(diǎn)a2相通,則在步驟S1中,轉(zhuǎn)換為路徑字符串a(chǎn)1|a2,若路徑節(jié)點(diǎn)a1到路徑節(jié)點(diǎn)a2不相通,則記為0;有向節(jié)點(diǎn)到有向節(jié)點(diǎn)本身不相通,也記為0。
在本發(fā)明一實(shí)施例中,在所述步驟S3中,如果路徑字符串中僅包含一條路徑,則將該路徑與必經(jīng)節(jié)點(diǎn)進(jìn)行比對(duì),該路徑中包含全部的必經(jīng)節(jié)點(diǎn)時(shí),保存該路徑,否則不保存;如果路徑字符串中包含若干個(gè)用符號(hào)“+”連接的路徑,則先根據(jù)符號(hào)“+”,將路徑字符串分解為多個(gè)單一的路徑字符串進(jìn)行處理。
在本發(fā)明一實(shí)施例中,在所述步驟S4中,遍歷剩下存在的路徑,再進(jìn)行n-m-2次字符串右乘運(yùn)算;由矩陣中路徑的擴(kuò)展公式可知:
其中,n為路徑網(wǎng)絡(luò)中節(jié)點(diǎn)的總數(shù),m為必經(jīng)節(jié)點(diǎn)的個(gè)數(shù),i為循環(huán)的次數(shù);循環(huán)遍歷是在路徑節(jié)點(diǎn)個(gè)數(shù)滿足最少路徑節(jié)點(diǎn)個(gè)數(shù)需求的基礎(chǔ)上進(jìn)行的;每輪遍歷中重復(fù)步驟S3對(duì)每次遍歷中會(huì)擴(kuò)展若干條路徑進(jìn)行包含必經(jīng)節(jié)點(diǎn)檢查,將符合條件的路徑保存到路徑集中。
相較于現(xiàn)有技術(shù),本發(fā)明具有以下有益效果:本發(fā)明所提供的一種包含必經(jīng)節(jié)點(diǎn)集的最佳路徑求解方法,克服了大規(guī)模復(fù)雜網(wǎng)絡(luò)包含必經(jīng)節(jié)點(diǎn)集的路徑求解困難問題,通過引入矩陣乘法運(yùn)算,將字符化的路徑節(jié)點(diǎn)進(jìn)行矩陣存儲(chǔ),可以快速尋找到包含必經(jīng)節(jié)點(diǎn)集的最佳路徑。
附圖說明
圖1為本發(fā)明中一種包含必經(jīng)節(jié)點(diǎn)集的最佳路徑求解方法的流程圖。
圖2為本發(fā)明一實(shí)施例中的網(wǎng)絡(luò)模型1網(wǎng)絡(luò)拓?fù)潢P(guān)系圖。
圖3為本發(fā)明一實(shí)施例中的網(wǎng)絡(luò)模型2網(wǎng)絡(luò)拓?fù)潢P(guān)系圖。
圖4為本發(fā)明一實(shí)施例中包含必經(jīng)節(jié)點(diǎn)集的最佳路徑求解方法的算法流程圖。
具體實(shí)施方式
下面結(jié)合附圖,對(duì)本發(fā)明的技術(shù)方案進(jìn)行具體說明。
如圖1所示,本發(fā)明提供的一種包含必經(jīng)節(jié)點(diǎn)集的最佳路徑求解方法,主要用于大規(guī)模復(fù)雜路由網(wǎng)絡(luò)中包含必經(jīng)節(jié)點(diǎn)集的最佳路徑的尋找,下面以圖2以及圖3中提供的兩個(gè)路由網(wǎng)絡(luò)模型案例來具體的對(duì)本發(fā)明的算法做進(jìn)一步說明。
先對(duì)本實(shí)施例中使用的數(shù)據(jù)進(jìn)行說明,本實(shí)施例中使用的有向帶權(quán)圖數(shù)據(jù)存儲(chǔ)在.csv數(shù)據(jù)文件中,這種文件能夠很好的描述路徑網(wǎng)絡(luò)拓?fù)潢P(guān)系。該文件的頭部為路徑網(wǎng)絡(luò)的總體描述部分,包括行數(shù)和列數(shù),數(shù)據(jù)體部分共有4列,行數(shù)由路徑網(wǎng)絡(luò)中的通路數(shù)決定,其中,第一列為路徑號(hào),第二列為和第三列為兩相通的路徑號(hào),第四列為該路徑的代價(jià)值。圖2中提供的網(wǎng)絡(luò)拓?fù)潢P(guān)系,其總節(jié)路徑總節(jié)點(diǎn)數(shù)為4,起始節(jié)點(diǎn)為0,目標(biāo)節(jié)點(diǎn)為1,必經(jīng)節(jié)點(diǎn)有2個(gè),必經(jīng)節(jié)點(diǎn)集V1’={2,3}。圖2中每條路徑上的數(shù)字為路徑代價(jià)值。圖3中提供的網(wǎng)絡(luò)拓?fù)潢P(guān)系,起始節(jié)點(diǎn)為2,終止節(jié)點(diǎn)為19,其總節(jié)點(diǎn)數(shù)為20,必經(jīng)節(jié)點(diǎn)有6個(gè),必經(jīng)節(jié)點(diǎn)集V2‘={3,5,7,11,13,17}。圖3中方點(diǎn)型頂點(diǎn)為始末兩個(gè)頂點(diǎn),加粗型頂點(diǎn)組成必經(jīng)節(jié)點(diǎn)集V’,虛線路徑為一條滿足必經(jīng)約束的路徑。
如圖4所示,本發(fā)明提供的一種包含必經(jīng)節(jié)點(diǎn)集的最佳路徑求解方法具體實(shí)現(xiàn)步驟如下:
步驟S101:加載有向帶權(quán)圖的數(shù)據(jù)信息,和必經(jīng)節(jié)點(diǎn)集數(shù)據(jù)信息,建立有向帶權(quán)圖的鄰接矩陣;根據(jù)鄰接矩陣的路徑連通信息,將路徑節(jié)點(diǎn)轉(zhuǎn)化為字符串路徑,構(gòu)建用于存儲(chǔ)路徑網(wǎng)絡(luò)信息的字符串路徑網(wǎng)絡(luò)矩陣,和用于運(yùn)算路徑的字符串路徑計(jì)算矩陣。
將復(fù)雜路由網(wǎng)絡(luò)數(shù)據(jù)分為兩部分存儲(chǔ),即有向帶全圖數(shù)據(jù)和必經(jīng)節(jié)點(diǎn)集數(shù)據(jù)。其中有向帶全圖數(shù)據(jù)是描述復(fù)雜路由網(wǎng)絡(luò)本身的屬性的數(shù)據(jù),存儲(chǔ)路由網(wǎng)絡(luò)的鏈路通斷信息;必經(jīng)節(jié)點(diǎn)集數(shù)據(jù)是用來約束所求路徑的中間節(jié)點(diǎn),最后求解的最佳路徑必須全部包含必經(jīng)節(jié)點(diǎn)集內(nèi)的路徑節(jié)點(diǎn)。路徑計(jì)算矩陣和路徑網(wǎng)絡(luò)矩陣是路徑字符串矩陣模型的矩陣,這兩個(gè)字符串矩陣在本路徑計(jì)算中起著至關(guān)重要的作用。根據(jù)鄰接矩陣,將路徑節(jié)點(diǎn)轉(zhuǎn)化為路徑字符串,構(gòu)建路徑網(wǎng)絡(luò)字符串矩陣模型和路徑計(jì)算字符串矩陣模型,該矩陣模型既具備一般代數(shù)矩陣運(yùn)算的特性,又包含字符串矩陣的新規(guī)則,能夠?qū)⒊R?guī)的算路問題轉(zhuǎn)化為高階字符串矩陣運(yùn)算,能夠在大規(guī)模復(fù)雜路由網(wǎng)絡(luò)中快速尋路。
進(jìn)一步的,首先,調(diào)用C語言文件流函數(shù),讀取存儲(chǔ)有向帶權(quán)圖的數(shù)據(jù)信息的.csv文件頭部,以int型數(shù)據(jù)為例,文件頭有12個(gè)字節(jié),其包括路徑節(jié)點(diǎn)的總節(jié)點(diǎn)數(shù),通路個(gè)數(shù),每行的列數(shù)。然后,根據(jù)頭部的路徑網(wǎng)絡(luò)數(shù)據(jù)的大小來讀取路徑節(jié)點(diǎn)數(shù)據(jù)。根據(jù)路徑節(jié)點(diǎn)號(hào)和路徑代價(jià)值來建立鄰接矩陣,若兩個(gè)路徑不通,則其代價(jià)值為無窮大。對(duì)于圖2提供的網(wǎng)絡(luò)拓?fù)?,其鄰接矩陣為A,則:
其中,路徑節(jié)點(diǎn)到其本身是沒有意義的,即其本身是不通的,故在本實(shí)施例中,將其代價(jià)值定義為無窮大。必經(jīng)節(jié)點(diǎn)集數(shù)據(jù)信息也同樣存儲(chǔ)在.csv文件,共有1行3列,其中第一列為起點(diǎn)節(jié)點(diǎn),第二列為終點(diǎn)節(jié)點(diǎn),第三列為起點(diǎn)到終點(diǎn)必須經(jīng)過的節(jié)點(diǎn),這些節(jié)點(diǎn)用特殊字符隔開。
步驟S1011:構(gòu)建字符串路徑網(wǎng)絡(luò)矩陣模型
首先將有向路徑節(jié)點(diǎn)字符串化,將單一的路徑節(jié)點(diǎn)轉(zhuǎn)化為兩兩相通的路徑通路字符串,比如路徑節(jié)點(diǎn)0到路徑節(jié)點(diǎn)1是相通的,那么轉(zhuǎn)化為路徑字符串為“0|1”。若兩個(gè)有向節(jié)點(diǎn)間不通,則記為“0”。有向節(jié)點(diǎn)到有向節(jié)點(diǎn)本身是不相通的,也記為“0”。路徑網(wǎng)絡(luò)矩陣為方陣,其維度數(shù)與相應(yīng)的有向路徑節(jié)點(diǎn)總個(gè)數(shù)相同。路徑網(wǎng)絡(luò)矩陣的維度與鄰接矩陣的維度相同,均為n*n,其中n為路徑節(jié)點(diǎn)總數(shù)。同樣對(duì)于圖2提供的網(wǎng)絡(luò)拓?fù)?,根?jù)其鄰接矩陣建立的路徑網(wǎng)絡(luò)矩陣為w,則:
步驟S1012:構(gòu)建字符串路徑計(jì)算矩陣模型
路徑計(jì)算矩陣的構(gòu)建方式同路徑網(wǎng)絡(luò)矩陣,也是將路徑節(jié)點(diǎn)字符串化,但是其維度不同。為了得到起點(diǎn)到終點(diǎn)的合理通路路徑,將計(jì)算矩陣設(shè)計(jì)為2*n的矩陣,n為路徑節(jié)點(diǎn)總數(shù)。該矩陣中,第一行為起點(diǎn)到其他各個(gè)節(jié)點(diǎn)的路徑信息,第二行為終點(diǎn)到其他各個(gè)節(jié)點(diǎn)的路徑信息。對(duì)于圖2提供的網(wǎng)絡(luò)拓?fù)?,建立的?jì)算矩陣為C,則:
步驟102:初始化路徑計(jì)算矩陣和路徑網(wǎng)絡(luò)矩陣,進(jìn)行字符串矩陣右乘運(yùn)算,使得矩陣中路徑節(jié)點(diǎn)個(gè)數(shù)滿足最少路徑節(jié)點(diǎn)個(gè)數(shù)需求,即將計(jì)算矩陣和路徑網(wǎng)絡(luò)矩陣進(jìn)行m次字符串矩陣右乘運(yùn)算,初步得到起點(diǎn)到終點(diǎn)的所有包含必經(jīng)節(jié)點(diǎn)集的路徑。
路徑計(jì)算矩陣與路徑網(wǎng)絡(luò)矩陣之間的字符串矩陣乘法運(yùn)算有別于普通的代數(shù)矩陣乘法運(yùn)算,是一種基于路徑字符串的乘法運(yùn)算,具有一般代數(shù)矩陣運(yùn)算的運(yùn)算特性,又具備路徑字符串運(yùn)算的特殊規(guī)則。該字符串矩陣乘法運(yùn)算用于擴(kuò)展可行路徑,剔除不通路徑和重復(fù)路徑。本步驟中m表示必經(jīng)節(jié)點(diǎn)集中路徑節(jié)點(diǎn)的個(gè)數(shù),每進(jìn)行一次字符串矩陣乘法運(yùn)算,路徑節(jié)點(diǎn)會(huì)增加一個(gè),要想最終所求的最佳路徑中包含所有的必經(jīng)路徑節(jié)點(diǎn),即滿足矩陣中路徑節(jié)點(diǎn)個(gè)數(shù)滿足最少路徑節(jié)點(diǎn)個(gè)數(shù)需求,則至少要進(jìn)行m次矩陣乘法運(yùn)算,并將這m次運(yùn)算的結(jié)果矩陣稱為臨界矩陣。在該步驟中,進(jìn)一步規(guī)定了字符串路徑中的新規(guī)則,在路徑擴(kuò)展性原則,路徑連通性原則和無回路的原則下,制定了路徑字符串加法和路徑字符串乘法的運(yùn)算新方式,進(jìn)而確定了高階路徑字符串矩陣模型乘法運(yùn)算的規(guī)則方法;同時(shí)在算路過程中,一次進(jìn)行了m次運(yùn)算來使路徑節(jié)點(diǎn)個(gè)數(shù)滿足最少路徑節(jié)點(diǎn)個(gè)數(shù)需求,避免了額外的運(yùn)算開銷。
進(jìn)一步的,在本實(shí)施例中,由路徑網(wǎng)絡(luò)矩陣W和路徑計(jì)算矩陣C可知:每進(jìn)行一次字符串矩陣的右乘運(yùn)算,路徑節(jié)點(diǎn)數(shù)就會(huì)增加一個(gè)。如果必經(jīng)節(jié)點(diǎn)集里的節(jié)點(diǎn)數(shù)為m,要想最后的節(jié)點(diǎn)路徑包含所有的必經(jīng)節(jié)點(diǎn)集里的節(jié)點(diǎn),則至少要進(jìn)行m次字符串矩陣的右乘運(yùn)算。
從路徑網(wǎng)絡(luò)矩陣和路徑計(jì)算矩陣的構(gòu)成可以看出,路徑計(jì)算矩陣為路徑網(wǎng)絡(luò)矩陣的子矩陣,記為Wm,矩陣中的元素始終為多重向量,路徑網(wǎng)絡(luò)矩陣運(yùn)算滿足結(jié)合律,則Wm=W*W*···W。對(duì)于節(jié)點(diǎn)數(shù)為n的路徑網(wǎng)絡(luò),設(shè)定路徑的起止節(jié)點(diǎn)為a,b,其路徑計(jì)算矩陣Cm為一個(gè)2x n的矩陣j=1,2,…,n。基于路徑的運(yùn)算規(guī)則可知,計(jì)算矩陣中路徑的擴(kuò)展方法為:
Cm=Cm-1*W1=Cm-2*W1*W1=C1*W1*···W1
本實(shí)施例中矩陣的運(yùn)算規(guī)則同代數(shù)矩陣運(yùn)算的規(guī)則相似,但在處理路徑字符串時(shí)使用了特殊的運(yùn)算方法。在計(jì)算路徑過程中考慮到要盡可能得到最優(yōu)的路徑解,刪除不滿足必經(jīng)點(diǎn)條件的路徑,這樣可以濾出大量不必要的運(yùn)算。
步驟S1021:路徑字符串加法運(yùn)算
路徑字符串加法運(yùn)算要基于路徑擴(kuò)展性原則,即經(jīng)過路徑字符串加法運(yùn)算后,開辟了新的獨(dú)立的路徑或者維持原路徑。如果開辟了新路徑,則用“+”來連接這條新路徑。路徑字符串加法運(yùn)算是字符串矩陣運(yùn)算的一個(gè)環(huán)節(jié),用來輔助字符串矩陣相乘運(yùn)算。用a1,a2,a3表示字符串路徑節(jié)點(diǎn),則字符串加法運(yùn)算有一下三種情況:
(1)“a1|a2”+“0”=“a1|a2”;
(2)“a1|a2”+“a1|a2”=“a1|a2”;
(3)“a1|a2”+”a3|a2”=“a1|a2+a3|a2”。
這樣的字符串加法規(guī)則,能夠很好的擴(kuò)展新的路徑。
步驟S1022:路徑字符串乘法運(yùn)算
路徑字符串相乘運(yùn)算要基于連通性原則,即是基于路徑字符串首尾節(jié)點(diǎn)相同來運(yùn)算的。如果第一個(gè)路徑字符串的尾部字符路徑節(jié)點(diǎn)和第二個(gè)路徑字符串首部字符路徑節(jié)點(diǎn)相同,則去掉第一個(gè)路徑字符串的尾字符,然后將兩個(gè)路徑字符串合并成一個(gè)新的路徑字符串。在網(wǎng)絡(luò)路由中路徑中有回路是毫無意義的,因此路徑字符串運(yùn)算過程中,還要遵守?zé)o回路的原則。合并成的新路徑還要進(jìn)行無回路檢測(cè),包含回路的新路徑將被剔除。用a1,a2,a3,a4表示字符串路徑節(jié)點(diǎn),則字符串乘法運(yùn)算包括以下四種情況:
(1)“a1|a2”*“0”=“0”;
(2)“a1|a2”*“a3|a2”=“0”;
(3)“a1|a2”*“a2|a3”=“a1|a2|a3”;
(4)“a1|a2”*“a2|a3|a1”=“a1|a2|a3|a1”=“0”。
在圖2提供的網(wǎng)絡(luò)拓?fù)鋵?duì)應(yīng)的路徑網(wǎng)絡(luò)矩陣W和路徑計(jì)算矩陣C已經(jīng)確定,計(jì)算結(jié)果的路徑集為P,下面通過計(jì)算網(wǎng)絡(luò)中起點(diǎn)是0,終點(diǎn)是1,必經(jīng)節(jié)點(diǎn)為2,3的最短路徑,來闡明字符串矩陣的運(yùn)用過程:
則P=0|3|2|1+0|2|3|1,即通過兩次矩陣運(yùn)算可以求得兩個(gè)包含必經(jīng)節(jié)點(diǎn)集的路徑,分別為0|3|2|1和0|2|3|1。單條字符串路徑通過“+”相連可以組成一條復(fù)合字符串路徑,該類字符串路徑乘法運(yùn)算時(shí),需要先拆分成單條字符串路徑,然后一一進(jìn)行單條字符串路徑的乘法運(yùn)算。
步驟S103:將字符串矩陣元素轉(zhuǎn)化為路徑集,檢查所獲得的每一條路徑中是否包含全部的必經(jīng)路徑節(jié)點(diǎn),如果全都包含則保存該條路徑,否則舍棄,同時(shí)計(jì)算符合條件的路徑的累加權(quán)重,保留權(quán)重最小的路徑。
在本實(shí)施例中,先將字符串矩陣乘法運(yùn)算后的矩陣轉(zhuǎn)化為路徑集,路徑集中可能包好多條起點(diǎn)到終點(diǎn)的獨(dú)立并列的路徑,若路徑中包含全部必經(jīng)節(jié)點(diǎn)的路徑則保存,其他路徑不保存。同時(shí)計(jì)算符合條件的路徑的累加權(quán)重,保留權(quán)重最小的路徑。其中,路徑中每兩個(gè)節(jié)點(diǎn)間都有權(quán)重值,一條路徑的代價(jià)為該路徑各節(jié)點(diǎn)間權(quán)重值的累加值。必經(jīng)節(jié)點(diǎn)集的節(jié)點(diǎn)是固定的,一條路徑中只有包含所有的必經(jīng)點(diǎn)才是符合條件的路徑。如果路徑字符串中只包含一條路徑,則將該路徑與必經(jīng)節(jié)點(diǎn)進(jìn)行比對(duì),該路徑中包含全部的必經(jīng)節(jié)點(diǎn)時(shí),保存該路徑,否則不保存。如果路徑字符串中包含多個(gè)用符號(hào)“+”連接的路徑,則先要根據(jù)符號(hào)“+”將路徑字符串分解為多個(gè)單一的路徑字符串進(jìn)行處理。這樣的處理就可以剔除掉很多不符合條件的路徑,簡化后續(xù)的運(yùn)算處理。
經(jīng)過路徑字符串矩陣乘法運(yùn)算的結(jié)果矩陣,其矩陣的元素變?yōu)閱我换蛘邚?fù)合路徑字符串,將結(jié)果矩陣中包含的路徑字符串轉(zhuǎn)換為路徑集,即從高階字符串矩陣乘法重新回到常規(guī)路徑的計(jì)算,在路徑集中進(jìn)行包含必經(jīng)路徑節(jié)點(diǎn)的檢查。
步驟S104:循環(huán)遍歷字符串矩陣乘法模型,找到可能存在的符合條件的路徑,并保存每次遍歷中獲得的代價(jià)最小的路徑。
路徑計(jì)算矩陣和路徑網(wǎng)絡(luò)矩陣每進(jìn)行一次字符串矩陣的右乘運(yùn)算,路徑節(jié)點(diǎn)就會(huì)增加一個(gè)。遍歷剩下的可能存在的路徑,還需要進(jìn)行n-m-2次字符串右乘運(yùn)算。循環(huán)遍歷每條可行的路徑,需要路徑計(jì)算矩陣和路徑網(wǎng)絡(luò)矩陣還要進(jìn)行n-m-2次字符串矩陣的右乘循環(huán)運(yùn)算,在每次循環(huán)過程中重復(fù)步驟三的操作。除去路徑的起點(diǎn)和終點(diǎn),最多需要進(jìn)行n-2次矩陣乘法運(yùn)算就可以將全部路徑節(jié)點(diǎn)遍歷。
由字符串路徑的擴(kuò)展公式可知:
其中,n為路徑網(wǎng)絡(luò)中節(jié)點(diǎn)的總數(shù),m為必經(jīng)節(jié)點(diǎn)的個(gè)數(shù),i為循環(huán)的次數(shù)。循環(huán)遍歷是在路徑節(jié)點(diǎn)個(gè)數(shù)滿足最少路徑節(jié)點(diǎn)個(gè)數(shù)需求的基礎(chǔ)上進(jìn)行的,即在此之前路徑計(jì)算矩陣和路徑網(wǎng)絡(luò)矩陣已經(jīng)進(jìn)行了m次字符串矩陣右乘運(yùn)算。每次遍歷中會(huì)擴(kuò)展若干條路徑,這些路徑中有點(diǎn)包含全部必經(jīng)節(jié)點(diǎn)有的則沒有完全包含,需要對(duì)這些路徑進(jìn)行包含必經(jīng)節(jié)點(diǎn)的檢查,即每輪遍歷中都要重復(fù)步驟S103的操作,將符合條件的路徑保存到路徑集中。
在本實(shí)施例中,為了計(jì)算最佳路徑,設(shè)立了循環(huán)遍歷的原則和方法,即循環(huán)遍歷從路徑計(jì)算矩陣的m階矩陣開始,循環(huán)的次數(shù)為n-m-2,并在每輪的遍歷中獲取擴(kuò)展得到的包含全部必經(jīng)節(jié)點(diǎn)的新路徑,通過設(shè)定的遍歷條件和循環(huán)次數(shù)能夠遍歷全部包含必經(jīng)節(jié)點(diǎn)集的路徑,進(jìn)一步確保了能夠求解到最佳路徑。
步驟S105:檢測(cè)路徑集存儲(chǔ)空間是否為空,為空則表明沒有符合條件的路徑,輸出NP,結(jié)束整個(gè)運(yùn)算;若不為空,則以權(quán)重為參考標(biāo)準(zhǔn),獲取路徑集中累加權(quán)重最小的路徑。路徑集中,權(quán)重最小,路徑節(jié)點(diǎn)數(shù)最少的路徑即為所求的理想路徑。在本實(shí)施例中,包含全部必經(jīng)節(jié)點(diǎn)且代價(jià)值相對(duì)較小的路徑都保存在路徑集中,在路徑集中找到路徑代價(jià)值最小且路徑節(jié)點(diǎn)數(shù)最少的路徑,就是所求的包含必經(jīng)節(jié)點(diǎn)集的最佳路徑
以上是本發(fā)明的較佳實(shí)施例,凡依本發(fā)明技術(shù)方案所作的改變,所產(chǎn)生的功能作用未超出本發(fā)明技術(shù)方案的范圍時(shí),均屬于本發(fā)明的保護(hù)范圍。