禁忌搜尋演算法

2021-10-06 12:23:44 字數 3893 閱讀 2393

禁忌搜尋(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...