本發(fā)明屬于網(wǎng)絡(luò)圖路徑搜索技術(shù)領(lǐng)域,具體涉及一種指定點(diǎn)約束條件下利用改進(jìn)的遺傳算法搜索到最優(yōu)路徑的方法。
背景技術(shù):
路徑規(guī)劃問題是傳統(tǒng)的組合優(yōu)化問題,有著較為廣泛的實(shí)際應(yīng)用。比較經(jīng)典的路徑規(guī)劃問題是求解網(wǎng)絡(luò)圖各個點(diǎn)之間的的最多路徑,不過,隨著網(wǎng)絡(luò)圖規(guī)模的增大和對高效率的需求,在某些特定應(yīng)用場景中,我們需要求解網(wǎng)絡(luò)圖中在指定點(diǎn)約束下的最短路徑。
目前,關(guān)于網(wǎng)絡(luò)圖中指定點(diǎn)約束下的最短路徑的方法主要有:窮盡搜索算法和啟發(fā)式搜索法和智能搜索算法。
窮舉搜索算法,該算法又細(xì)分為深度度優(yōu)先搜索和廣度優(yōu)先搜索;深度優(yōu)先搜索是指從起點(diǎn)選擇某一擴(kuò)展節(jié)點(diǎn),之后接著再擴(kuò)展節(jié)點(diǎn)上繼續(xù)搜索,直到搜索到終點(diǎn),或者當(dāng)沒有搜索到合理的路徑時進(jìn)行回溯。寬度優(yōu)先搜索是指從起點(diǎn)尋找終點(diǎn)的過程中,根據(jù)節(jié)點(diǎn)的出度情況依次擴(kuò)展,每一條搜索分支都保持同樣的深度;以上兩種思想都是窮舉網(wǎng)絡(luò)圖的整個解空間,當(dāng)網(wǎng)絡(luò)圖規(guī)模比較大時,很難在規(guī)定的時間內(nèi)找到合適的解,實(shí)時性比較差。
啟發(fā)式搜索法,該方法是對窮極搜索算法的一種改進(jìn),窮極搜索是一種盲目搜索,沒有充分利用到現(xiàn)有路徑的信息,沒有對擴(kuò)展路徑進(jìn)行預(yù)判,啟發(fā)式搜索維持一個優(yōu)先隊(duì)列,擬合一個權(quán)重函數(shù),按照當(dāng)前路徑值和擴(kuò)展后的路徑權(quán)重以及包含必經(jīng)點(diǎn)的數(shù)量,有選擇的進(jìn)行搜索。該方法雖然沒有窮舉解空間,但是由于需要維護(hù)一個優(yōu)先隊(duì)列,當(dāng)網(wǎng)絡(luò)圖規(guī)模比較大時,優(yōu)先隊(duì)列的排序選擇會消耗大量時間,精確度和實(shí)時性沒有得到根本改善。
智能搜索算法,以遺傳算法為代表的智能搜索算法從全局的角度進(jìn)行解空間的搜索,可以大大提高搜索的效率。不過,目前利用遺傳算法求解該問題時,將所有的點(diǎn)都進(jìn)行編碼,導(dǎo)致編碼復(fù)雜,染色體參差不齊,對后續(xù)的交叉、變異等算子都帶來很多不便,最終導(dǎo)致傳統(tǒng)的遺傳算法求解該問題也相對比較復(fù)雜。
技術(shù)實(shí)現(xiàn)要素:
為了克服上述現(xiàn)有技術(shù)的不足,本發(fā)明的目的是提供一種基于遺傳算法的求指定點(diǎn)約束下的路由方法,可以將問題轉(zhuǎn)化,進(jìn)一步降低問題的解空間的復(fù)雜度,從而解決現(xiàn)有搜索方法中搜索時間長和精度低的技術(shù)問題。
為了實(shí)現(xiàn)上述目的,本發(fā)明采取的技術(shù)方案為:
1、一種基于遺傳算法的求指定點(diǎn)約束下的路由方法,包括以下步驟:
1)讀取網(wǎng)絡(luò)圖信息,用鄰接矩陣A方式存儲信息,并將指起始點(diǎn)和指定點(diǎn)信息放入集合S中;
2)對網(wǎng)絡(luò)圖進(jìn)行預(yù)處理,結(jié)合矩陣A和集合S的數(shù)據(jù),求出起始點(diǎn)及指定點(diǎn)相互之間的最短路徑,并將其存儲在一個二維矩陣D中;
3)以起始點(diǎn)和指點(diǎn)的信息及集合S為基礎(chǔ)進(jìn)行編碼,構(gòu)建染色體C,從而將問題轉(zhuǎn)化成一個類TSP問題;
4)利用改進(jìn)后的遺傳算法求解具有以下步驟:
a、固定起點(diǎn)和終點(diǎn),隨機(jī)產(chǎn)生若干個有指定點(diǎn)組成的隨機(jī)序列,插入在起點(diǎn)和終點(diǎn)之間形成初始化種群;
b、以一定概率的方式從種群中挑選若干對染色體進(jìn)行交叉運(yùn)算;
c、以一定概率的方式從種群中挑選若干個染色體進(jìn)行變異運(yùn)算;
d、根據(jù)適應(yīng)度評價函數(shù),對種群中的個體進(jìn)行排序,結(jié)合若干個歷史最優(yōu)解就行選擇,優(yōu)勝劣汰,得到下一代種群;
e、未達(dá)到預(yù)設(shè)的迭代次數(shù)則跳轉(zhuǎn)到步驟4)的步驟a),否則結(jié)束本步驟;
5)根據(jù)矩陣D中的信息,檢查路徑P’的合法性,如果路徑存在環(huán),可利用路徑修復(fù)函數(shù)R進(jìn)行處理,最終將D中信息帶入到P’中得到一個完整的路徑。
進(jìn)一步,所述的步驟2)中求出起始點(diǎn)和指定點(diǎn)相互之間路徑,通過如下方法確定:求取起始點(diǎn)到終點(diǎn)和指定點(diǎn)的最短路徑,求取每一個指定點(diǎn)到其他指定點(diǎn)及終點(diǎn)的最短路徑;求取方法可采用Dijkstra算法和堆結(jié)構(gòu)相結(jié)合的方法,減少計(jì)算復(fù)雜度,如果相互之間不存在滿足條件的路徑則記為無窮大。
進(jìn)一步,所述的步驟3)中構(gòu)建染色體C,并且初始化一定數(shù)量的種群P,通過如下步驟確定:
a、構(gòu)建一個一維向量,固定好起點(diǎn)和終點(diǎn)的位置,然后將其他指定點(diǎn)隨機(jī)的插入起點(diǎn)和終點(diǎn)之間就可以得到染色體C;
b、重復(fù)步驟3)的步驟a)的操作,即可得到相應(yīng)數(shù)量的種群P。
進(jìn)一步,所述的步驟4)中的交叉算子,通過如下方法確定:從種群中選取一對染色體Ca和Cb,在除起點(diǎn)和終點(diǎn)外,隨機(jī)的選擇兩個位置pos1和pos2,則可以將兩個染色體各分為三段Ca1、Ca2、Ca3和Cb1、Cb2、Cb3;保持起點(diǎn)和終點(diǎn)的位置不變交換Ca1和Cb3,然后依次將剩下的指定點(diǎn)依次插入到染色體中,得到兩個新的染色體Ca’和Cb’。
進(jìn)一步,所述的步驟4)中的變異算子,通過如下方法確定:從種群中選取一個染色體,首先隨機(jī)在除起點(diǎn)和終點(diǎn)外,隨機(jī)的選擇兩個位置pos1 和pos2,將區(qū)間[pos1,pos2]之間的指定點(diǎn)提取出來,然后在染色體剩下的點(diǎn)中隨機(jī)選取一個位置pos3,接著將[pos1,pos2]之間的指定點(diǎn)插入到pos3處。
進(jìn)一步,所述的步驟4)中的選擇算子,通過如下方法確定:在種群進(jìn)化的過程中,需要不斷的進(jìn)行優(yōu)勝劣汰,選擇更好的候選解最為下一代的種群。根據(jù)適應(yīng)度函數(shù)為種群中每一個染色體計(jì)算出一個評價值,根據(jù)評價值進(jìn)行排序,將評價值比較低的個體淘汰,同時保留若干個歷史最優(yōu)解,將歷史最優(yōu)解和剩下的未被淘汰的個體組成新的種群,完成個體的選擇和種群的進(jìn)化。
進(jìn)一步,所述的步驟(4)中的適應(yīng)度函數(shù),通過如下公式確定:
式中,代表染色體某一段基因,代表染色體中相鄰兩點(diǎn)之間的權(quán)重,Dups代表經(jīng)過重復(fù)點(diǎn)的個數(shù),Pu是對重復(fù)點(diǎn)進(jìn)行懲罰的系數(shù),所述的該公式反應(yīng)了一個染色體的權(quán)重越小,重復(fù)點(diǎn)的個數(shù)越少,適應(yīng)度評價值越好,解也就越優(yōu)秀。
進(jìn)一步,所述的步驟5)中可利用路徑修復(fù)函數(shù)R進(jìn)行處理,其中修復(fù)函數(shù)是指當(dāng)我們根據(jù)權(quán)利要求5中所述的方法得到一個完成的路徑P時,如果存在重復(fù)點(diǎn),通過如下步驟確定:
a、將路徑P中和重復(fù)點(diǎn)相鄰的指定點(diǎn)a和b之間的路徑斷開。
b、將路徑上現(xiàn)有的點(diǎn)進(jìn)行標(biāo)記放在一個集合set中,防止再次經(jīng)過。
c、利用Dijkstra算法結(jié)合集合set信息,得到一條不經(jīng)過集合set中點(diǎn)的路徑片段P1。
d、將P1添加到原路徑P中,還原修復(fù)原路徑。
e、繼續(xù)檢測是否有重復(fù)點(diǎn),如果有跳轉(zhuǎn)到步驟(1),否則結(jié)束修復(fù)。
本發(fā)明的有益效果是:
本發(fā)明由于先將問題轉(zhuǎn)化為類TSP問題,只對起始點(diǎn)、終點(diǎn)和指定點(diǎn)進(jìn)行編碼,大大降低了問題的解空間,同時優(yōu)化交叉算子、變異算子和選擇算子,能夠在比較短的時間內(nèi)在解空間中找到一個比較優(yōu)秀的路徑,從而提高路徑搜索的實(shí)時性和精確性。
附圖說明
圖1是本發(fā)明方法的主流程;
圖2是本發(fā)明算法的程序流程圖;
圖3是本發(fā)明某一網(wǎng)絡(luò)圖用例的示意圖和最終路徑示意圖;
圖4是本發(fā)明中遺傳算法編碼的示意圖;
圖5是本發(fā)明中遺傳算法交叉算子操作的示意圖;
圖6是本發(fā)明中遺傳算法變異算子操作的示意圖。
具體實(shí)施方式
以下結(jié)合附圖對本發(fā)明進(jìn)一步敘述。
如圖1所示,本發(fā)明的具體實(shí)施過程包括以下步驟:
步驟1.讀取網(wǎng)絡(luò)圖信息,
網(wǎng)絡(luò)圖是一個帶權(quán)重的有向圖G=(V,E),V為頂點(diǎn)集,E為有向邊集,每一條有向邊均有一個權(quán)重。如圖3所示是網(wǎng)絡(luò)圖的拓?fù)浣Y(jié)構(gòu)示意圖。網(wǎng)絡(luò)圖以兩個文件的形式提供帶求問題的信息,一個為圖的數(shù)據(jù)(G),一個為需要計(jì)算的路徑信息,網(wǎng)絡(luò)圖的數(shù)據(jù)中,每一行包含如下的信息:LinkID,SouID,DestID,Cost;其中,LinkID 為該有向邊的索引,SouID 為該有向邊的起始頂點(diǎn)的索引,DestID為該有向邊的終止頂點(diǎn)的索引,Cost 為該有向邊的權(quán)重。路徑信息中,只有一行如下數(shù)據(jù):StartID,EndID,IncSet;其中,StartID為該路徑的起點(diǎn),EndID為該路徑的終點(diǎn),IncSet表示必須經(jīng)過的頂點(diǎn)集合V'。用鄰接矩陣A方式存儲信息,并將指起始點(diǎn)和指定點(diǎn)信息放入集合S中。
步驟2.利用Dijkstra算法求取距離矩陣。
為了降低遺傳算法編碼的復(fù)雜性,首先需要對網(wǎng)絡(luò)圖求取距離矩陣;距離矩陣是一個二維矩陣,矩陣的x軸包括起點(diǎn)和其他指定點(diǎn),矩陣的y軸包括其他指定點(diǎn)和終點(diǎn)。每個元素存儲的是每兩個點(diǎn)之間的路徑信息,其中只能包含非指定點(diǎn)信息,包括權(quán)重、點(diǎn)的集合等信息。如果兩點(diǎn)之間不包含滿足條件的路徑,則記為無窮大。在利用Dijkstra算法進(jìn)行求取的過程中,注意標(biāo)記指定點(diǎn),從而才能求出不包含指定點(diǎn)的最短路徑,為了提高Dijkstra算法的效率,可以利用輔助堆結(jié)構(gòu)來降低算法的復(fù)雜性。
步驟3.對問題進(jìn)行編碼,從而將問題轉(zhuǎn)化為類TSP問題。
以起始點(diǎn)和指點(diǎn)的信息即集合S為基礎(chǔ)進(jìn)行編碼,構(gòu)建染色體C。如附圖4所示,將起點(diǎn)2和終點(diǎn)19分別放在一個數(shù)組的開頭和結(jié)尾,然后將必經(jīng)點(diǎn)以隨機(jī)的方式插入在起點(diǎn)和終點(diǎn)之間,重復(fù)該過程多次,得到一定數(shù)量的種群P,此時可以將問題看成一個類TSP問題。
步驟4.利用改進(jìn)的遺傳算法求解上述類TSP問題
如圖2所示,遺傳算法求解該問題時,首先需要編碼,然后進(jìn)行選擇、交叉、變異等操作,最后進(jìn)行修復(fù)和解碼操作,具體操作如下:
4.1)適應(yīng)度評價函數(shù)的設(shè)計(jì),適應(yīng)度函數(shù)是種群進(jìn)化的關(guān)鍵,直接關(guān)系到種群的選擇,適應(yīng)度函數(shù)的設(shè)計(jì)由如下公式確定:
式中,代表染色體某一段基因,代表染色體中相鄰兩點(diǎn)之間的權(quán)重,Dups代表經(jīng)過重復(fù)點(diǎn)的個數(shù),Pu是對重復(fù)點(diǎn)進(jìn)行懲罰的系數(shù)。將距離矩陣D的路徑片段插入到種群中每一個個體,通過上述公式可以看出路徑權(quán)重越小,染色體重復(fù)點(diǎn)越少個體適應(yīng)度越大,該個體也就越優(yōu)秀,存活的概率更大。
4.2)對種群進(jìn)行選擇,實(shí)現(xiàn)優(yōu)勝劣汰;選擇的設(shè)計(jì)方法如下:根據(jù)適應(yīng)度函數(shù)為種群中每一個染色體計(jì)算出一個評價值,根據(jù)評價值進(jìn)行排序,將評價值比較低的個體淘汰,同時保留若干個歷史最優(yōu)解,將歷史最優(yōu)解和剩下的未被淘汰的個體組成新的種群,完成個體的選擇和種群的進(jìn)化。
4.3)以一定的概率對種群中的一對染色體進(jìn)行交叉。交叉的方法如下:如圖5所示,在每個染色體上隨機(jī)選取兩個位置(除起點(diǎn)和終點(diǎn)除外),此時,染色體被分成三段,將第一個染色體的第一段和第二個染色體的第三段進(jìn)行交換,即圖中(1)和(6)段進(jìn)行交換,然后用剩下的兩段進(jìn)行補(bǔ)齊操作,防止有重復(fù)點(diǎn)的出現(xiàn)。
4.4)以一定的概率對種群中的一對染色體進(jìn)行變異。變異的方法如下:如圖6所示,從種群中選取一個染色體,首先隨機(jī)在除起點(diǎn)和終點(diǎn)外,隨機(jī)的選擇兩個位置pos1 和pos2,將區(qū)間[pos1,pos2]之間的指定點(diǎn)提取出來,然后在染色體剩下的點(diǎn)中隨機(jī)選取一個位置pos3,接著將[pos1,pos2]之間的指定點(diǎn)插入到pos3處。
步驟5.根據(jù)矩陣D中的信息,檢查路徑P’的合法性,如果路徑存在環(huán),可利用路徑修復(fù)函數(shù)R進(jìn)行處理,最終將D中信息帶入到P’中得到一個完整的路徑。修復(fù)函數(shù)的過程如下:
5.1)將路徑P中和重復(fù)點(diǎn)相鄰的指定點(diǎn)a和b之間的路徑斷開。
5.2)將路徑上現(xiàn)有的點(diǎn)進(jìn)行標(biāo)記放在一個集合set中,防止再次經(jīng)過。
5.3)利用Dijkstra算法結(jié)合集合set信息,得到一條不經(jīng)過集合set中點(diǎn)的路徑片段P1。
5.4)將P1添加到原路徑P中,還原修復(fù)原路徑。
5.5)繼續(xù)檢測是否有重復(fù)點(diǎn),如果有跳轉(zhuǎn)到步驟(1),否則結(jié)束修復(fù)。
實(shí)驗(yàn)對比:
測試環(huán)境:計(jì)算機(jī)采用Intel Core i5-3470 CPU @ 2.8Ghz,4GB內(nèi)存,軟件采用Visual Studio 2013實(shí)驗(yàn)平臺。
說明:將本發(fā)明的方法與窮舉搜索和啟發(fā)式搜索進(jìn)行對比,運(yùn)行不同規(guī)模的網(wǎng)絡(luò)圖,從時間與權(quán)重的兩個角度進(jìn)行對比,時間限制在10s以內(nèi)。
實(shí)驗(yàn)結(jié)果分析:從表格中可以看出,在網(wǎng)絡(luò)圖點(diǎn)數(shù)比較少時本發(fā)明與現(xiàn)有方法效果差不多,不過,隨著網(wǎng)絡(luò)圖點(diǎn)數(shù)規(guī)模的增大,本發(fā)明的優(yōu)勢就顯現(xiàn)出來了,從case3和case4可以看出,窮舉搜索在300點(diǎn)規(guī)模的網(wǎng)絡(luò)圖就很難找到合適的路徑,啟發(fā)式搜索在500點(diǎn)規(guī)模以上的網(wǎng)絡(luò)圖,也比較困難,所以,本發(fā)明所述的方法,在規(guī)模較大的網(wǎng)絡(luò)圖,可以在速度和路徑權(quán)重兩個方面都有比較好的效果。