這個比喻中有幾個核心的喻體和它們對應的本體:
山——solution
山的高度——objective value
山的輪廓——featuring attributes
小范圍內的最高峰——local optimum
全中國最高的山——best solution (with largest objective value)
爬到一座山頂后,四下張望,可以看到附近的緊鄰的其他山——neighbors/neighborhood
首先,我們的徐霞客同志在地圖上隨意指一個土坡,作為他搜索旅程的開端(initial solution)。我們用傳送門把徐霞客傳送到這個點,然后他就開始一個土坡、一個土坡地搜索了。每一步,他都盡量找一個比當前土坡更高的山坡,就這樣他一步步地找到了海拔1400米的廬山,四下看去,附近幾百公里已經沒有更高的山了,即廬山是附近區域內的局部最高峰(local optimum)。但它很可能並不是全中國的最高峰,因此想要不被困在廬山附近的山脈(trapped in local optima),徐霞客需要先去往海拔低的山(inferior solution),然后才能到達下一個更高的山峰——這里出現了TS的第一個核心特征:允許搜索過程中的解出現劣化,不一定每一步都要更好。
就這樣,徐霞客先走下坡路、再走上坡路,找到了1900米的黃山,已經有進步了,但同樣的,稍作停留,徐霞客繼續出發了,再接再厲地又找到了2000米的恆山和3000米的峨嵋山。徐霞客攜帶測高儀(用來計算目標函數),所以不用真的爬上山頂。徐霞客主要忙碌的是:不停的被傳送,然后從某一個點出發尋找附近的山(開始local search),一個區域可能有成千上萬座山。
在這種策略的指導下,徐霞客明顯提升了搜索的效率,大量的重復的山被成功地跳過了。但是,隨之而來還有一個問題:輪廓相似的兩座山,就一定是同一座山么?顯然不是的。因為把實體的“山”抽象到“山的輪廓”這個步驟,丟失了大量的細節,因此同一個輪廓是有可能對應不止一座山的。那么,假設現在徐霞客來到一座山的山腳下,抬頭一看它的輪廓和手里的黃山很像。但是測了一下高度,有4700米(黃山才1900米),那顯然就不是黃山了,而是昆侖!——這種情況下,即使這座山和黃山的輪廓是一樣的,也一定是座新的山,即使它還在“禁忌列表”中,但它被“特赦”了(activates aspiration criteria)。那么,昆侖山附近可能有另一座沒有去過的高山。
這么一來,徐霞客又對自己的搜索方法做了改進:除了禁忌列表(tabu list),他又建了一個特赦列表(aspiration list),針對每一種輪廓,記錄了一個截至目前長得像這個輪廓的最高高度。那么未來即使碰到同一個輪廓的山,如果高度超過了這個輪廓下的歷史記錄,很容易就可以確定它是新的,那么就不用顧慮tabu list了,特赦之。
該問題是一個Hamilton回路問題,其中起點和終點已經固定,因此我們可以將解形式記為,例如【A,D,C,F,E,A】,每次只需變換中間兩個元素即可,現在我們將禁忌長度設置為2,候選集合長度定義為4,迭代次數為100,通過以下步驟能使讀者更清洗的了解TS算法的步驟。
給定任意初始解 x1=【A,D,C,F,E,A】f(x1)=10,歷史最優為10
候選集合 禁忌表
【A,C,D,F,E,A】 f=15
【A,D,C,E,F,A】 f=20
【A,D,F,C,E,A】 f=8
【A,E,C,F,D,A】 f=6
我們發現對x1交換D和E時,f最優,此時x2=【A,E,C,F,D,A】 f(x2)=6,歷史最優為6,將D-E放入禁忌表中
候選集合 禁忌表
【A,E,F,C,D,A】 f=9 D-E
【A,F,C,E,D,A】 f=15
【A,C,E,F,D,A】 f=6
【A,E,D,F,C,A】 f=5
我們發現對x2交換C和D時,f最優,此時x3=【A,E,D,F,C,A】 f(x3)=5,歷史最優為5,將D-C放入禁忌表中
候選集合 禁忌表
【A,E,C,F,D,A】 f=8 D-E
【A,E,F,D,C,A】 f=10 D-C
【A,E,D,C,F,A】 f=14
【A,C,D,F,E,A】 f=16
此時我們發現對x3交換D和C時最優,但是由於D-C已經在禁忌表中,因此我們退而求其次,對x3交換F和D,此時x4=【A,E,F,D,C,A】 f(x4)=10,歷史最優為5,將F-D放入禁忌表中,由於禁忌長度為2,因此將最先放入禁忌表中的D-E移除禁忌表
候選集合 禁忌表
【A,E,F,C,D,A】 f=4 D-C
【A,E,C,D,F,A】 f=5 F-D
【A,F,E,D,C,A】 f=7
【A,C,F,D,C,A】 f=10
此時我們發現對x4交換D和C時最優,雖然D-C已經在禁忌表中,但是f(D-C)<歷史最優5,因此滿足特赦規則,現在將D-C移除禁忌表,此時x5=【A,E,F,C,D,A】 f(x5)=4,歷史最優為4,然后再將D-C放入禁忌表
候選集合 禁忌表
【A,C,F,E,D,A】 f=5 D-F
【A,E,C,F,D,A】 f=7 C-D
【A,D,F,C,E,A】 f=9
【A,F,E,C,D,A】 f=29
依次迭代下去,當迭代次數超過100時停止迭代,歷史最優值即為輸出解。