禁忌搜索(Tabu Search)


1.禁忌搜索的一個通俗的例子
 
在組合優化問題的求解中,禁忌搜索(tabu search, TS)是眾多元啟發式算法中最為常用和有效的方法之一。我們以“尋找中國最高的山”作為例子,解釋禁忌搜索的核心思路。


這個比喻中有幾個核心的喻體和它們對應的本體:

山——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),一個區域可能有成千上萬座山。

現在問題來了,徐霞客從峨嵋山出發,再往下找,很可能不知不覺地又走到了黃山、廬山這些他已經去過的山,費了很大的工夫爬到山頂,發現都是“故地重游”。於是,徐霞客決定去過的山在短期內就不再去了。這個時候, 有兩個問題需要解決:1.怎么在爬山之前確定這座山有沒有爬過呢(當然,徐霞客是沒有地圖或者GPS的)?徐霞客的辦法是,每去一座山就把它的輪廓畫下來。以后遇到一座山的時候,先拿出手里的畫對比一下,如果與手中某張畫的輪廓很相似,就不用再爬了,因為這座山很有可能是來過的,爬到山頂也不會有新的收獲。事實上,要判斷兩座山是否完全一致,需要對比它們的每一塊石頭、每一棵樹,但這樣效率顯然太低了,於是就簡化為對比兩座山的輪廓——這里的輪廓,其實就是對山的一種抽象,我們稱之為解的特征點(featuring attributes)。如果兩個解的特征點一致,我們就當作它們是同一個解(當然,這種抽象的方法也是有弊端的,稍后我們會談到); 2.是否去過的山就永遠不再去了呢?其實從地質學的角度來看,一座高山的附近很可能有另一座高山,所以即使眼前這座山爬過了,通過它可能可以間接抵達附近的另一座沒有去過的高山。所以並不是說回頭草就一定不能吃,長遠來看可能還是有價值的。
 
結合上面兩個問題,徐霞客改進了他的搜索策略: 每爬完一座山就把它的輪廓畫下來,接下來每到達一座山的時候先判斷是否有相似輪廓的,如果有就直接繞過去。同時, 手里只保留固定數量的幾張圖紙(這里的“張數”就是tabu list length,禁忌名單的長度越長,允許重新爬一座山的間隔就越長),新加進來一張圖紙,就必須舍棄掉手中現有的最早的那張圖紙。因此,即使某一座山已經爬過了,但由於是發生很早以前的、圖紙已經丟掉了,是允許再爬一次的。


在這種策略的指導下,徐霞客明顯提升了搜索的效率,大量的重復的山被成功地跳過了。但是,隨之而來還有一個問題:輪廓相似的兩座山,就一定是同一座山么?顯然不是的。因為把實體的“山”抽象到“山的輪廓”這個步驟,丟失了大量的細節,因此同一個輪廓是有可能對應不止一座山的。那么,假設現在徐霞客來到一座山的山腳下,抬頭一看它的輪廓和手里的黃山很像。但是測了一下高度,有4700米(黃山才1900米),那顯然就不是黃山了,而是昆侖!——這種情況下,即使這座山和黃山的輪廓是一樣的,也一定是座新的山,即使它還在“禁忌列表”中,但它被“特赦”了(activates aspiration criteria)。那么,昆侖山附近可能有另一座沒有去過的高山。

這么一來,徐霞客又對自己的搜索方法做了改進:除了禁忌列表(tabu list),他又建了一個特赦列表(aspiration list),針對每一種輪廓,記錄了一個截至目前長得像這個輪廓的最高高度。那么未來即使碰到同一個輪廓的山,如果高度超過了這個輪廓下的歷史記錄,很容易就可以確定它是新的,那么就不用顧慮tabu list了,特赦之。

到這里還沒完,徐霞客漸漸意識到,平原地區很可能連綿幾百公里都沒有收獲,而高原地區可能一座山連着一座山,發現新的高峰的概率大得多。也就是說,高山和高山很可能是挨得比較近的,與其在九百六十萬平方公里的土地上均勻地投入力氣搜索,不如對某些區域多傾注一些精力。因此, 徐霞客每找到一座打破記錄的最高峰,就把它的位置詳細記錄下來,這樣他手里就握着第三個列表(回憶一下,第一個是tabu list,第二個aspiration list),現在這第三個列表就叫做elite list,顧名思義,這些都是找到過的“精英”,都是寶。當徐霞客連續幾個月沒有找到更高的山了,他就會從這個elite list中選擇一座山,重新回到那里,試試其他的路,看看有沒有可能有突破,同時這次嘗試之后,這座山也會被從elite list中刪掉,也就是說每座高山只當一次精英,這就是TS中常用的elite strategy(精英策略)。
 
2.實際例子
    現有一架飛機,從A點出發,需要經過B,C,D,E,F之后返回A點,且每個點只能經過一次,最后返回A點,求最短路徑。

該問題是一個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時停止迭代,歷史最優值即為輸出解。

詳細內容:http://blog.sina.com.cn/s/blog_3f6976a90102yjot.html 
              https://blog.csdn.net/adkjb/article/details/81712969


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM