TSP問題求解方法

2021-08-07 16:16:18 字數 1822 閱讀 8579

原文

一名旅行商準備前往若干個城市推銷他的產品,他想要從駐地出發,經過每個城市恰好一次,最後返回駐地,求滿足條件的最短路徑。這便是旅行商問題。旅行商問題是乙個np問題,至今尚未有準確的解法,現有的演算法只能盡可能減小誤差。目前最優的演算法能在誤差1%範圍內估計上百萬個城市的問題。

改良圈演算法的思想是首先求出乙個哈密頓圈c,然後通過適當地修改哈密頓圈得到具有較小權值的另乙個哈密頓圈。設初始圈c=

v1v2

...v

nv1

對於1≤

i1n ,構造新的哈密頓圈,即刪去邊vi

vi+1

和邊vj

vj+1

,新增邊vi

vj和邊vi

+1vj

+1得到的。ci

j=v1

v2..

.viv

jvj−

1vj−

2...

vi+1

vj+1

...v

nv1

若ω(v

ivj)

+ω(v

i+1v

j+1)

<ω(

vivi

+1)+

ω(vj

,vj+

1)則用ci

j 代替

c ,ci

j稱為c 的改良圈.

重複執行以上操作直至無法改進。

動態規劃的思想也比較簡單,只需要用二進位制來儲存當前的狀態(即當前已經走過的城市),dp

(i,j

)表示狀態為

i ,從城市

j出發的最短路徑,轉移方程如下dp

(i,j

)=min(dp

(i&u

,j)+

d(j,

u)遺傳演算法是一種啟發式演算法,適合解決tsp這種不確定性問題,遺傳演算法的主要步驟概括為新群

體產生→

選擇→交

叉變異→

群體更新

,套用到旅行商問題上關鍵在於模型的建立,即如何初始化,如何選擇(適應性評價方法),如何交叉變異

新群體產生

新群體產生可以隨機生成幾組1~n的排列,1~n為城市編號。排列1,3,4,2表示從1出發依次經過3,4到達2再返回到1。

選擇

遺傳演算法每一輪選擇適應度高的個體,可以使用路徑長度的倒數或者相反數來評價個體的適應性。每一輪選擇適應度高的個體

交叉

將父代樣本兩兩分組,對染色體的某一段進行交叉,如

​ 9 5 1 | 3 7 4 2 | 10 8 6

​ 10 5 4 | 6 3 8 7 | 2 1 9

交叉為​ 9 5 1 | 6 3 8 7 | 10 8 6

​ 10 5 4 | 3 7 4 2 | 2 1 9

對於有衝突的數字則將非交叉位置的重複數字用原位置的數代替,可以採用逐個交換,逐個代替的方法,如染色體1中的位置4與染色體2的位置4交換,即染色體1上位置4的數字變成6。6在染色體1中在第10位,則只需將染色體1位置4與位置10交換即可,染色體2也進行類似的操作

交叉後兩條染色體變成

​ 9 5 1 | 6 3 8 7 | 10 4 2

​ 10 5 8 | 3 7 4 2 | 6 1 9

變異

變異的過程比較簡單,隨機選取幾條染色體,並對每條染色體隨機取兩個位置,交換兩個位置的數字即可。

進化逆轉

隨機去兩個位置,將這兩個位置中間的數反向,保留原染色體和反向後的染色體中適應性較強的染色體。

模擬退火求解TSP問題

1.尋找下乙個解 2.計算下乙個解的能量 3.決定是否接受這個解 4.降溫 double randfloat double t0 1000000 tk 1,t t0,d 0.9999 int x initx 當前解 初始解 int anse,nowe 全域性最優解的能量,當前解的能量 anse no...

利用PSO求解TSP問題

pso 粒子群演算法 是群智慧型演算法的一種,其他的群智慧型演算法還有蟻群演算法,遺傳演算法等。其他的智慧型演算法還有模擬退火。之前看過一段時間的pso,商務智慧型課程最後的大作業便想用一下,剛好在github上看到有人用模擬退火解決tsp問題,而且效果不錯,於是便萌生了利用pso求解tsp問題的想...

狀壓dp求解TSP問題

嘗試過用貪心演算法求解tsp問題,但是並不好用,所以就用上了dp演算法。首先tsp問題滿足最優化原理 對先前決策所形成的狀態而言,其以後的所有決策都構成最優策略。通俗理解就是路徑abcdefg是最短路徑,則bcdefg必是最短路徑。所以可以判斷具有最優子結構和重疊子問題時,該問題可以用動態規劃求解。...