1. 程式人生 > >利用遺傳演算法求解TSP問題

利用遺傳演算法求解TSP問題

轉載地址

https://blog.csdn.net/greedystar/article/details/80343841

目錄

一、問題描述

二、演算法描述

三、求解說明

四、參考資料

五、原始碼


一、問題描述

旅行商問題是圖論中的一個著名問題。

假設有一個旅行商人要拜訪N個城市,要求他從一個城市出發,每個城市最多拜訪一次,最後要回到出發的城市,保證所選擇的路徑長度最短。

二、演算法描述

(一)演算法簡介

遺傳演算法(GeneticAlgorithm)是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,通過模擬自然進化過程搜尋最優解。遺傳演算法是從代表問題可能潛在的解集的一個種群(population)開始的,初代種群產生之後,按照適者生存和優勝劣汰的原理,逐代(generation)演化產生出越來越好的近似解,在每一代,根據問題域中個體的適應度(fitness)大小選擇個體,並藉助於自然遺傳學的遺傳運算元(genetic operators)進行組合交叉(crossover)和變異(mutation),產生出代表新的解集的種群。這個過程將導致種群像自然進化一樣的後生代種群比前代更加適應於環境,末代種群中的最優個體經過解碼(decoding),可以作為問題近似最優解。(摘自百度百科)。

(二)遺傳運算元

遺傳演算法中有選擇運算元、交叉運算元和變異運算元。

選擇運算元用於在父代種群中選擇進入下一代的個體。

交叉運算元用於對種群中的個體兩兩進行交叉,有Partial-Mapped Crossover、Order Crossover、Position-based Crossover等交叉運算元。

變異運算元用於對種群中的個體進行突變。

(三)演算法步驟描述

遺傳演算法的基本運算過程如下:

1. 初始化:設定進化代數計數器t=0、設定最大進化代數T、交叉概率、變異概率、隨機生成M個個體作為初始種群P

2. 個體評價:計算種群P中各個個體的適應度

3. 選擇運算:將選擇運算元作用於群體。以個體適應度為基礎,選擇最優個體直接遺傳到下一代或通過配對交叉產生新的個體再遺傳到下一代

4. 交叉運算:在交叉概率的控制下,對群體中的個體兩兩進行交叉

5. 變異運算:在變異概率的控制下,對群體中的個體兩兩進行變異,即對某一個體的基因進行隨機調整

6. 經過選擇、交叉、變異運算之後得到下一代群體P1。

重複以上1-6,直到遺傳代數為T,以進化過程中所得到的具有最大適應度個體作為最優解輸出,終止計算。

三、求解說明

(一)優化目標

給定二維資料int[][]pos用於儲存各個城市的座標,採用歐式距離代表城市之間的距離。利用遺傳演算法,找到不重複遍歷所有城市的路徑中,所走距離最短的路徑。

(二)選擇運算元

選擇運算元採用輪盤賭選擇,以每個個體的適應度為基礎,為每個個體計算累積概率。

個體1、2、3、4的個體適應度如上圖所示。

適應度計算規則:染色體代表的路徑實際距離作為個體的適應度,如下(distence[x][y]表示城市x到y的距離)

染色體 0 2 1 3,適應度為distence[0][2] + distence[2][1] + distence[1][3] + distence[3][0]

qa 表示個體a的累積概率,如上圖所示個體1、2、3、4的累積概率分別為0.14、0.53、0.69、1

隨機生成一個0到1的浮點數f,若 qa < f <= qb,則個體b被選中。

(三)交叉運算元

1. Partial-Mapped Crossover(部分對映交叉)

2. Order Crossover(順序交叉)

3. Position-based Crossover(基於位置的交叉)

(四)變異運算元

變異運算元隨機進行多次,每次在個體基因序列中選擇兩個位置的基因進行交換。

四、參考資料

基於遺傳演算法求解TSP問題(JAVA)

用遺傳演算法求解TSP問題

五、原始碼

原始碼地址:遺傳演算法求解TSP問題(參考自基於遺傳演算法求解TSP問題(JAVA)

目錄

一、問題描述

二、演算法描述

三、求解說明

四、參考資料

五、原始碼


一、問題描述

旅行商問題是圖論中的一個著名問題。

假設有一個旅行商人要拜訪N個城市,要求他從一個城市出發,每個城市最多拜訪一次,最後要回到出發的城市,保證所選擇的路徑長度最短。

二、演算法描述

(一)演算法簡介

遺傳演算法(GeneticAlgorithm)是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,通過模擬自然進化過程搜尋最優解。遺傳演算法是從代表問題可能潛在的解集的一個種群(population)開始的,初代種群產生之後,按照適者生存和優勝劣汰的原理,逐代(generation)演化產生出越來越好的近似解,在每一代,根據問題域中個體的適應度(fitness)大小選擇個體,並藉助於自然遺傳學的遺傳運算元(genetic operators)進行組合交叉(crossover)和變異(mutation),產生出代表新的解集的種群。這個過程將導致種群像自然進化一樣的後生代種群比前代更加適應於環境,末代種群中的最優個體經過解碼(decoding),可以作為問題近似最優解。(摘自百度百科)。

(二)遺傳運算元

遺傳演算法中有選擇運算元、交叉運算元和變異運算元。

選擇運算元用於在父代種群中選擇進入下一代的個體。

交叉運算元用於對種群中的個體兩兩進行交叉,有Partial-Mapped Crossover、Order Crossover、Position-based Crossover等交叉運算元。

變異運算元用於對種群中的個體進行突變。

(三)演算法步驟描述

遺傳演算法的基本運算過程如下:

1. 初始化:設定進化代數計數器t=0、設定最大進化代數T、交叉概率、變異概率、隨機生成M個個體作為初始種群P

2. 個體評價:計算種群P中各個個體的適應度

3. 選擇運算:將選擇運算元作用於群體。以個體適應度為基礎,選擇最優個體直接遺傳到下一代或通過配對交叉產生新的個體再遺傳到下一代

4. 交叉運算:在交叉概率的控制下,對群體中的個體兩兩進行交叉

5. 變異運算:在變異概率的控制下,對群體中的個體兩兩進行變異,即對某一個體的基因進行隨機調整

6. 經過選擇、交叉、變異運算之後得到下一代群體P1。

重複以上1-6,直到遺傳代數為T,以進化過程中所得到的具有最大適應度個體作為最優解輸出,終止計算。

三、求解說明

(一)優化目標

給定二維資料int[][]pos用於儲存各個城市的座標,採用歐式距離代表城市之間的距離。利用遺傳演算法,找到不重複遍歷所有城市的路徑中,所走距離最短的路徑。

(二)選擇運算元

選擇運算元採用輪盤賭選擇,以每個個體的適應度為基礎,為每個個體計算累積概率。

個體1、2、3、4的個體適應度如上圖所示。

適應度計算規則:染色體代表的路徑實際距離作為個體的適應度,如下(distence[x][y]表示城市x到y的距離)

染色體 0 2 1 3,適應度為distence[0][2] + distence[2][1] + distence[1][3] + distence[3][0]

qa 表示個體a的累積概率,如上圖所示個體1、2、3、4的累積概率分別為0.14、0.53、0.69、1

隨機生成一個0到1的浮點數f,若 qa < f <= qb,則個體b被選中。

(三)交叉運算元

1. Partial-Mapped Crossover(部分對映交叉)

2. Order Crossover(順序交叉)

3. Position-based Crossover(基於位置的交叉)

(四)變異運算元

變異運算元隨機進行多次,每次在個體基因序列中選擇兩個位置的基因進行交換。

四、參考資料

基於遺傳演算法求解TSP問題(JAVA)

用遺傳演算法求解TSP問題

五、原始碼

原始碼地址:遺傳演算法求解TSP問題(參考自基於遺傳演算法求解TSP問題(JAVA)