禁忌搜尋(tabu search)演算法是一種亞啟發式(meta-heuristic)隨機搜尋演算法,它從乙個初始可行解出發,選擇一系列的特定搜尋方向(移動)作為試探,選擇實現讓特定的目標函式值變化最多的移動。為了避免陷入區域性最優解,ts採用了一種靈活的「記憶」技術,對已經進行的優化過程進行記錄和選擇,指導下一步的搜尋方向,這就是tabu表的建立。
禁忌搜尋演算法的步驟如下:
1.選定乙個初始解x,給定乙個禁忌表h。
2.若滿足停止條件,則停止計算;否則,在x的鄰域中選出滿足禁忌要求(當某個解足夠好的時候,可以打破這個禁忌準則)的候選集canx,在canx中選擇乙個評價最佳的解xbest,令x=xbest,更新禁忌表h,重複步驟2。
用ts解tsp問題的**如下:
#禁忌搜尋演算法解tsp問題
import numpy as np
import random as rd
import copy
defdiscal
(path)
: dis =
0for i in
range
(len
(path)-1
):dis += distmat[path[i]
][path[i+1]
] dis += distmat[path[0]
][path[-1
]]return dis
defswap2
(sol)
: neighbor =
for i in
range
(len
(sol)):
for j in
range
(i +1,
len(sol)):
s = copy.deepcopy(sol)
x = s[j]
s[j]
= s[i]
s[i]
= xreturn neighbor
distmat = np.array([[
0,350,
290,
670,
600,
500,
660,
440,
720,
410,
480,
970],[
350,0,
340,
360,
280,
375,
555,
490,
785,
760,
700,
1100],
[290
,340,0
,580
,410
,630
,795
,680
,1030
,695
,780
,1300],
[670
,360
,580,0
,260
,380
,610
,805
,870
,1100
,1000
,1100],
[600
,280
,410
,260,0
,610
,780
,735
,1030
,1000
,960
,1300],
[500
,375
,630
,380
,610,0
,160
,645
,500
,950
,815
,950],
[660
,555
,795
,610
,780
,160,0
,495
,345
,820
,680
,830],
[440
,490
,680
,805
,735
,645
,495,0
,350
,435
,300
,625],
[720
,785
,1030
,870
,1030
,500
,345
,350,0
,475
,320
,485],
[410
,760
,695
,1100
,1000
,950
,820
,435
,475,0
,265
,745],
[480
,700
,780
,1000
,960
,815
,680
,300
,320
,265,0
,585],
[970
,1100
,1300
,1100
,1300
,950
,830
,625
,485
,745
,585,0
]])if __name__ ==
'__main__'
: solution =
[i for i in
range
(distmat.shape[0]
)]rd.shuffle(solution)
#隨機產生初始解
shortestdistance = discal(solution)
tabulist =
#禁忌表
iterx, iterxmax =0,
50while iterx < iterxmax:
cansolution = swap2(solution)
k =shorterdistance =
float
("inf"
)for i in
range
(len
(cansolution)):
if discal(cansolution[i]
)< shorterdistance:
shorterdistance = discal(cansolution[i]
)for i in
range
(len
(k))
:if discal(cansolution[k[
len(k)
-i-1]]
)< shortestdistance:
shortestdistance = discal(cansolution[k[
len(k)
-i-1]]
) solution = cansolution[k[
len(k)
-i-1]]
break
else
:if cansolution[k[
len(k)
-i-1]]
notin tabulist:
solution = cansolution[k[
len(k)
-i-1]]
break
iflen
(tabulist)
<6:
else
: tabulist.pop(0)
iterx +=
1print
(solution)
print
(discal(solution)
)
禁忌搜尋演算法
對於優化問題相關演算法有如下分類 禁忌搜尋是由區域性搜尋演算法發展而來,爬山法是從通用區域性搜尋演算法改進而來。在介紹禁忌搜尋之前先來熟悉下爬山法和區域性搜尋演算法。在搜尋過程中,始終選擇當前點的鄰居中與離目標最近者的方向搜尋。1 隨機選擇乙個初始的可能解x0 d,xb x0,p n xb d是問題...
初識禁忌搜尋演算法
一周前和實驗室師弟一起 的,在我的影響下他開始去坐畢設了.嘖嘖 現在等我同學過來找我,把那次的討論內容回憶一下。寫一寫個人理解,語句比較混亂,只乙個入門,我並沒有深入研究過。這是乙個啟發式搜尋演算法。以解決tsp問題為例,假設abcde五個城市,各個城市間距離的無向圖。1.假設以a開頭,abcde,...
禁忌搜尋演算法求解TSP
本文的禁忌搜尋演算法是最經典禁忌搜尋演算法,可以在此基礎上進行修改和擴充套件 主函式 author chauncy xu date 2020年4月1日 clc clear all close all len side,city city num city size city,1 城市數目 gen 1...