利用PSO求解TSP問題

2021-09-05 13:08:07 字數 2490 閱讀 3245

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

tsp問題想必大家再熟悉不過了,它是乙個np-hard問題,難以用暴力列舉的演算法進行計算。針對np-hard問題,有許多方法可以求得其近似解,而且效果不錯,進化計算演算法和群智慧型演算法便是其中之一。

之前也在部落格上看過其他人用pso求解tsp問題,主要有一下幾個問題

tsp問題的規模相對較小

對於規模較大的問題,結果並不算太好。

一般而言,如果不考慮對tsp問題的額外的處理方式,直接用pso演算法,對於一些規模較小的問題(節點數量一般不超過20),pso演算法的效果還行,但是,當問題的規模變得比較大時(50及以上),pso演算法就無能為力。乙個重要的原因在於當節點數量增加時,問題的複雜度會變得很大,pso演算法會陷入區域性最優,而且這個區域性最優往往離最優解很遠。這個時候,有兩種選擇,一是改進pso演算法本身,這個基本很難,我嘗試過,效果並不太好,pso演算法的模式基本都是固定的,如果只改變速度中的權重或是簡單的調參,收效甚微;二是改變對tsp問題的編碼以及粒子速度與位置的定義,使問題本身相對更加容易處理。我用的是第二種方法。

對於tsp問題,我們一般將粒子的位置定義為乙個位置點的序列。比如,它表示的是一條路徑,即1->2, 2->3, 3->4, 4->5, 5->1(我選的tsp問題是乙個環路,所以最後的路徑會成環),路徑的長度可以計算每一條邊的長度並求和得到,邊的距離是兩點之間的歐氏距離(問題中的點都是二維的)。

tsp問題中粒子的速度是粒子在當前解空間的運動速度,一般是與粒子當前位置和粒子群體的歷史最好位置的差成正比(有時還要考慮粒子當前位置與粒子的歷史最好位置的差)。

在此問題中,粒子的速度被定義為乙個二元組合,表示當前路徑(即粒子的位置)的乙個交換操作。比如(2,3),表示對當前粒子位置中節點2和3進行一次交換操作。粒子的速度可以與位置進行求和,例如,+=。和是兩個相同的速度,交換不會考慮粒子的先後順序。速度的長度定義為元組的個數。

a. 位置-位置=速度

位置相減會得到乙個速度,即乙個元組序列。例如,-=,我們可以這樣看,兩個速度的差別在於3,4兩個節點的位置不同,只需將第二個速度進行一次節點的交換便可得到第乙個速度。

b. 速度+速度=速度

兩個速度相加會得到乙個新的速度。比如+=。如果有重複的元組,則會去掉相應的重複項(因為兩個相同的交換操作會相互抵消)。+=。

c. 速度*常數=速度

速度乘以常數會得到乙個速度,只不過這個速度的長度和新的速度長度不同。

speed_1*c=speed_2, 則*0.5=。

d. 位置+速度=位置

位置和速度相加會得到乙個新的位置。比如,+=。按照速度中的元組對位置進行相應變換即可。

e.滑動運算

滑動操作是對粒子的位置進行操作。假定速度x=, sl(x,k)=。這裡定義這個運算的原因在於粒子速度的等價性。比如,與,它們是兩個相同的速度,但是表示不同,如果直接對其做差,相當於做了一次氣泡排序,但是事實上他們的差值應該為0。所以,我們在對速度進行做差時,會用速度的n-1個等義(相當於n-1次滑動運算的結果)表示進行做差,取其中長度最小的速度作為最後的結果。

f.交叉消除

這個運算可以說是這個問題的核心。我在用一般的pso演算法進行求解的時候,發現了乙個問題,就是結果中的路徑會有大量的交叉。

如上圖所示,而且我在部落格上看很多人利用pso演算法求解tsp問題的時候也有同樣的問題。這是乙個很重要的原因,因為大多數的解空間都會有大量的不好的解,這些不好的解的原因在於它們存在大量的邊的交叉。於是,我們定義了消除交叉的操作。具體請看下圖

這個演算法不是簡單的將兩條邊進行交換就完事了,我嘗試過這種操作,效果很不好。它會將後面的邊也進行交換。只改變了交叉的邊的那一部分,對後面的操作沒有影響。

最後的結果如下圖:

可以看到,與之前相比好了很多,而且與最優解非常接近,除了一些小的瑕疵。

下面是我參考的一些資料。

1.測試資料

2.參考**

TSP問題求解方法

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

模擬退火求解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...

狀壓dp求解TSP問題

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