旅行商問題(tsp) 是一類有代表性的已被證明具有 npc 計算複雜性的組合難題 , 它的提法是 : 給定 n 個城市 , 有一旅行商從某一城市出發 , 訪問各城市一次且僅有一次後回到原出發城市 , 要求找出一條最短 的巡迴路徑. 該問題等價於 n 個點的圓排列 , 其路徑數為 (n - 1) ! / 2. 若按窮舉法求解 , 即使用每秒運 算一億次的巨型機對只有 20 個城市tsp 求解 , 也需搜尋 350 年之久[1 ] . 由於 tsp 代表一類組合優化問 題 , 在實際工程中有許多應用 , 如電子地圖、交通誘導、vlsi 單元布局、atm 分組交換網等. 因此 , 利 用各種先進演算法(如 sa 和 ga) 對 tsp 類似的問題進行求解就成為乙個值得關注的問題. 事實上 , 只要能找到能用於實際問題的「亞優解」(sub2optimal solution)即可. 禁忌搜尋演算法在這一領域中已顯示出強大的優越性 , 正日益受到重視 , 它所得到的亞優解往往優於傳統演算法得到的區域性極值解 , 加之搜尋效率高 , 已受到廣泛歡迎. 本文針對 tsp 問題的特點 , 設計了禁忌搜尋演算法的一種有效實現形式 , 實驗表明 , 這一方法具有良好的收斂性和較高的搜尋效率.
禁忌搜尋(tabu search ,簡稱 ts) 技術是一種亞啟發式搜尋技術[2 ] , 由 glover 在 1986 年首次提出 , 進而形成一套完整演算法[3 ,4 ] . 所謂禁忌就是禁止重複前面的工作. 為了迴避區域性鄰域搜尋陷入區域性最優的主要不足 , 禁忌搜尋演算法用乙個禁忌表記錄下已經到達過的區域性最優點 , 在下一次的搜尋中 , 利用禁忌表中的資訊不再或有選擇地搜尋這些點 , 以此來跳出區域性最優點. 就好比人的短時記憶 , 走過的路不再重複或有選擇地重複 ; 同時「遺忘」又使得這些禁止是弱禁止 , 即在一定的時間之後這些禁止將失效 , 最終達到全域性優化之目的.
(1) 解的領域對映為 22opt , 即固定起點城市 , 後面的每兩個城市進行對換 , 鄰域中的元素個數為 c2n + 1 ;
(2) 目標函式定義為巡迴路徑的城市間距離之和 , 目標函式亦作為評價函式 ;
(3) 禁忌物件定義為目標函式所求得的目標值 ;
(4) 禁忌長度(tabu-length) 隨具體問題而定 ;
(5) 從鄰域中選最佳的 tabu-length + 1 個元素作為候選集 ;
(6) 為提高解的質量 , 防止出現迴圈 , 應用了特赦規則. 本文的特赦規則定義為 : 當當前最優解未下降的次數超過給定值時 , 則特赦禁忌表中的最優解 , 將其作為下一次迭代的初始解 ;
(7) 終止規則為 : 程式執行超過給定最大迭代步數 , 或特赦次數超過給定最大特赦次數 ;
(8) 為增強搜尋空間的多樣性 , 本文應用了多初始點策略 , 即分別以每乙個城市作為初始點進行搜尋. 實驗表明 , 能以較大概率達到最優解或亞優解.
import random
import math
defn
(x):
data=x.copy(
) newdata=
for i in
range(1
,len
(data)-1
):for j in
range
(i+1
,len
(data)):
data[i]
,data[j]
=data[j]
,data[i]
data=x.copy(
)return newdata
deff
(data,coordinate)
: dis=
0for i in
range(1
,len
(data)):
dis+=math.sqrt(
(coordinate[data[i]-1
][0]
-coordinate[data[i-1]
-1][
0])**
2+\(coordinate[data[i]-1
][1]
-coordinate[data[i-1]
-1][
1])**
2)dis+=math.sqrt(
(coordinate[-1
][0]
-coordinate[0]
[0])
**2+\ (coordinate[-1
][1]
-coordinate[0]
[1])
**2)return dis
if __name__ ==
"__main__"
: coordinate=[[
0.4,
0.4439],
[0.2439
,0.1463],
[0.1707
,0.2293],
[0.2293
,0.7610],
[0.5171
,0.9414
]\ ,
[0.8732
,0.6536],
[0.6878
,0.5219],
[0.8488
,0.3609],
[0.6683
,0.2536],
[0.6159
,0.2623]]
x=[i for i in
range(1
,11)]
random.shuffle(x)
totalx=
totaldis=
) dis=f(x,coordinate)
teshe=
10 tesheflag=
0 flag=
0 time=
100 tabulength=
5while flag
newdata=n(x)
n=c=
cn=for i in
range
(len
(newdata)):
,coordinate)
)for i in
range
(tabulength)
:min
(n))])
min(n)
) newdata.remove(newdata[n.index(
min(n))]
) n.remove(
min(n)
) newx=c[cn.index(
min(cn))]
)if newx >= x :
tesheflag+=
1if tesheflag ==5:
x=totalx[totaldis.index(
min(totaldis))]
else
: x=newx.copy(
) dis=f(x,coordinate)
flag+=
1print
("當前最優解:"
,x)print
("距離為"
,dis)
禁忌搜尋演算法求解TSP
本文的禁忌搜尋演算法是最經典禁忌搜尋演算法,可以在此基礎上進行修改和擴充套件 主函式 author chauncy xu date 2020年4月1日 clc clear all close all len side,city city num city size city,1 城市數目 gen 1...
禁忌搜尋演算法
禁忌搜尋 tabu search 演算法是一種亞啟發式 meta heuristic 隨機搜尋演算法,它從乙個初始可行解出發,選擇一系列的特定搜尋方向 移動 作為試探,選擇實現讓特定的目標函式值變化最多的移動。為了避免陷入區域性最優解,ts採用了一種靈活的 記憶 技術,對已經進行的優化過程進行記錄和...
禁忌搜尋演算法
對於優化問題相關演算法有如下分類 禁忌搜尋是由區域性搜尋演算法發展而來,爬山法是從通用區域性搜尋演算法改進而來。在介紹禁忌搜尋之前先來熟悉下爬山法和區域性搜尋演算法。在搜尋過程中,始終選擇當前點的鄰居中與離目標最近者的方向搜尋。1 隨機選擇乙個初始的可能解x0 d,xb x0,p n xb d是問題...