原文
一名旅行商準備前往若干個城市推銷他的產品,他想要從駐地出發,經過每個城市恰好一次,最後返回駐地,求滿足條件的最短路徑。這便是旅行商問題。旅行商問題是乙個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必是最短路徑。所以可以判斷具有最優子結構和重疊子問題時,該問題可以用動態規劃求解。...