TS算法通過引入一個靈活的存儲結構和相應的禁忌准則來避免迂回搜索,並通過藐視准則來赦免一些被禁忌的優良狀態,進而保證多樣化的有效探索以最終實 現全局優化。相對於模擬退火和遺傳算法,TS是又一種搜索特點不同的 meta-heuristic算法。
禁忌搜索是人工智能的一種體現,是局部領域搜索的一種擴展。禁忌搜索最重要的思想是標記對應已搜索的局部最優解的一些對 象,並在進一步的迭代搜索中盡量避 開這些對象(而不是絕對禁止循環),從而保證對不同的有效搜索途徑的探索。禁忌搜索涉及到領域(neighborhood)、禁忌表(tabu list)、禁忌長度(tabu 1ength)、候選解(candidate)、藐視准則(candidate)等概念。
簡單TS算法的基本思想是:給定一個當前解(初始解)和一種鄰域,然后在當前解的鄰域中確定若干 候選解;若最佳候選解對應的目標值優於“best so far”狀態,則忽視其禁忌特性,用其替代當前解和“best so far”狀態,並將相應的對象加入禁忌表,同時修改禁忌表中各對象的任期;若不存在上述候選解,則選擇在候選解中選擇非禁忌的最佳狀態為新的當前解,而無 視它與當前解的優劣,同時將相應的對象加入禁忌表,並修改禁忌表中各對象的任期;如此重復上述迭代搜索過程,直至滿足停止准則。
條理化些,則簡單禁忌搜索的算法步驟可描述如下:
(1)給定算法參數,隨機產生初始解x,置禁忌表為空。
(2)判斷算法終止條件是否滿足?若是,則結束算法並輸出優化結果;否則,繼續以下步驟。
(3)利用當前解工的鄰域函數產生其所有(或若干)鄰域解,並從中確定若干候選解。
(4)對候選解判斷藐視准則是否滿足?若成立,則用滿足藐視准則的最佳狀態y替代x成為新的當前解,即x=y,並用與y對應的禁忌對象替換最早進入禁忌表的禁忌對象,同時用y替換“best so far”狀態,然后轉步驟6;否則,繼續以下步驟。
(5)判斷候選解對應的各對象的禁忌屬性,選擇候選解集中非禁忌對象對應的最佳狀態為新的當前解,同時用與之對應的禁忌對象替換最早進入禁忌表的禁忌對象元素。
(6)轉步驟(2)。
條理化些,則簡單禁忌搜索的算法步驟可描述如下:
(1)給定算法參數,隨機產生初始解x,置禁忌表為空。
(2)判斷算法終止條件是否滿足?若是,則結束算法並輸出優化結果;否則,繼續以下步驟。
(3)利用當前解工的鄰域函數產生其所有(或若干)鄰域解,並從中確定若干候選解。
(4)對候選解判斷藐視准則是否滿足?若成立,則用滿足藐視准則的最佳狀態y替代x成為新的當前解,即x=y,並用與y對應的禁忌對象替換最早進入禁忌表的禁忌對象,同時用y替換“best so far”狀態,然后轉步驟6;否則,繼續以下步驟。
(5)判斷候選解對應的各對象的禁忌屬性,選擇候選解集中非禁忌對象對應的最佳狀態為新的當前解,同時用與之對應的禁忌對象替換最早進入禁忌表的禁忌對象元素。
(6)轉步驟(2)。
同時,與傳統的優化算法相比,TS算法的主要特點是:
(1)在搜索過程中可以接受劣解,因此具有較強的“爬山”能力;
(2) 新解不是在當前解的鄰域中隨機產生,而或是優於“best so far”的解,或是非禁忌的最佳解,因此選取優良解的概率遠遠大於其他解。由於TS算法具有靈活的記憶功能和藐視准則,並且在搜索過程中可以接受劣解,所 以具有較強的“爬山”能力,搜索時能夠跳出局部最優解,轉向解空間的其他區域,從而增強獲得更好的全局最優解的概率,所以TS算法是一種局部搜索能力很強 的全局迭代尋優算法。
(1)在搜索過程中可以接受劣解,因此具有較強的“爬山”能力;
(2) 新解不是在當前解的鄰域中隨機產生,而或是優於“best so far”的解,或是非禁忌的最佳解,因此選取優良解的概率遠遠大於其他解。由於TS算法具有靈活的記憶功能和藐視准則,並且在搜索過程中可以接受劣解,所 以具有較強的“爬山”能力,搜索時能夠跳出局部最優解,轉向解空間的其他區域,從而增強獲得更好的全局最優解的概率,所以TS算法是一種局部搜索能力很強 的全局迭代尋優算法。
為了找到“全局最優解”,就不應該執着於某一個特定的區域。局部搜索的缺點就是太貪婪地對某一個局部區域以及其鄰域搜索,導致一葉障目,不見泰山。禁忌搜 索就是對於找到的一部分局部最優解,有意識地避開它(但不是完全隔絕),從而獲得更多的搜索區間。兔子們找到了泰山,它們之中的一只就會留守在這里,其他 的再去別的地方尋找。就這樣,一大圈后,把找到的幾個山峰一比較,珠穆朗瑪峰脫穎而出。
當兔子們再尋找的時候,一般地會有意識地避開泰山,因為他們知道,這里已經找過,並且有一只兔子在那里看着了。這就是禁忌搜索中“禁忌表(tabu list)”的含義。那只留在泰山的兔子一般不會就安家在那里了,它會在一定時間后重新回到找最高峰的大軍,因為這個時候已經有了許多新的消息,泰山畢竟 也有一個不錯的高度,需要重新考慮,這個歸隊時間,在禁忌搜索里面叫做“禁忌長度(tabu length)”;如果在搜索的過程中,留守泰山的兔子還沒有歸隊,但是找到的地方全是華北平原等比較低的地方,兔子們就不得不再次考慮選中泰山,也就是 說,當一個有兔子留守的地方優越性太突出,超過了“best to far”的狀態,就可以不顧及有沒有兔子留守,都把這個地方考慮進來,這就叫“特赦准則(aspiration criterion)”。這三個概念是禁忌搜索和一般搜索准則最不同的地方,算法的優化也關鍵在這里。
以上程序中有關鍵的幾點:
(1)禁忌對象:可以選取當前的值(cur)作為禁忌對象放進tabu list,也可以把和當前值在同一“等高線”上的都放進tabu list。
(2)為了降低計算量,禁忌長度和禁忌表的集合不宜太大,但是禁忌長度太小容易循環搜索,禁忌表太小容易陷入“局部極優解”。
(3)上述程序段中對best_to_far的操作是直接賦值為最優的“解禁候選解”,但是有時候會出現沒有大於best_to_far的,候選解也全部被禁的“死鎖”狀態,這個時候,就應該對候選解中最佳的進行解禁,以能夠繼續下去。
(4)終止准則:和模擬退火,遺傳算法差不多,常用的有:給定一個迭代步數;設定與估計的最優解的距離小於某個范圍時,就終止搜索;當與最優解的距離連續若干步保持不變時,終止搜索;
禁忌搜索是對人類思維過程本身的一種模擬,它通過對一些局部最優解的禁忌(也可以說是記憶)達到接納一部分較差解,從而跳出局部搜索的目的.
(1)禁忌對象:可以選取當前的值(cur)作為禁忌對象放進tabu list,也可以把和當前值在同一“等高線”上的都放進tabu list。
(2)為了降低計算量,禁忌長度和禁忌表的集合不宜太大,但是禁忌長度太小容易循環搜索,禁忌表太小容易陷入“局部極優解”。
(3)上述程序段中對best_to_far的操作是直接賦值為最優的“解禁候選解”,但是有時候會出現沒有大於best_to_far的,候選解也全部被禁的“死鎖”狀態,這個時候,就應該對候選解中最佳的進行解禁,以能夠繼續下去。
(4)終止准則:和模擬退火,遺傳算法差不多,常用的有:給定一個迭代步數;設定與估計的最優解的距離小於某個范圍時,就終止搜索;當與最優解的距離連續若干步保持不變時,終止搜索;
禁忌搜索是對人類思維過程本身的一種模擬,它通過對一些局部最優解的禁忌(也可以說是記憶)達到接納一部分較差解,從而跳出局部搜索的目的.
禁忌搜索算法是局部搜索算法的變形。應該注意到禁忌搜索算法計算中的關鍵點:禁忌對象、長度和候選集成為算法的主要特征。環繞這些特征需要考慮下列因素。
(1)是否有其他形式的候選集?
(2)禁忌的長度如何確定?如果在算法中記憶下搜索到的當前最優解,極端的兩種情況是:一是將所有的對換個數作為禁忌長度,此時等價於將候選集中的所有的對換遍歷;另外則取為1,這等價於局部搜索算法。
(3)是否有評價值的其他替代形式?有時計算目標值的工作量較大,或無法接受計算目標值所花費的時間,於是需要其他的方法。
(4)被禁的對換能否再一次解禁?有這樣的直觀現象,當搜索到一個局部最優解后,它鄰域中的其他狀態都被禁,我們是否解禁一些狀態以便跳出局部最優?解禁的功能就是為了獲得更大的搜索范圍,以免陷入局部最優。
(5)如何利用更多的信息?在禁忌搜索算法中,還可記錄其他一些信息。如一個被禁對象(交換)被禁的次數,評價值變化的大小等。
(6)終止原則,即一個算法停止的條件,怎樣給出?
禁忌長度是被禁對象不允許選取的迭代次數。一般是給被禁對象x一個數(禁忌長度)t,要求對象x在t步迭代內被禁,在禁忌表中采用 tabu(x)=t記憶,每迭代一步,該項指標做運算tabu(x)=t-1,直到tabu(x)=0時解禁。於是,我們可將所有元素分成兩類,被禁元素 和自由元素。有關禁忌長度t的選取,可以歸納為下面幾種情況:
(1)t為常數,如t=10,t=n的開方,其中n為鄰居的個數。這種規則容易在算法中實現。
(2)t屬於[tmin,tmax]。此時t是可以變化的數,它的變化是依據被禁對象的目標值和鄰域的結構。此時tmin,tmax是確定的。確定 tmin,tmax的常用方法是根據問題的規模T,限定變化區間,也可以用鄰域中鄰居的個數n確定變化區間。當給定了變化區間,確定t的大小主要依據實際 問題、實驗和設計者的經驗。當函數值下降較大時,可能谷較深,欲跳出局部最優,希望被禁的長度較大。
(3)tmin,tmax的動態選取。有的情況下,用tmin,tmax的變化能表達到更好的解。
禁忌長度的選取同實際問題、實驗和設計者的經驗有緊密的聯系,同時它決定了計算的復雜性。過短會造成循環的出現。如 f(1)=1,f(2)=3.5,f(3)=2.5,f(4)=2,f(5)=3,f(6)=6,,極端情況禁忌長度是1,鄰域為相距不超過1的整數點, 一旦陷入局部最優點x=4,則出現循環而無法跳出局部最優。過長又造成計算時間較長。
將評價函數分為基於目標函數和其他方法兩類。
1、基於目標函數的評價函數
這一類主要包含以目標函數的運算所得到的評價方法。如記評價函數為p(x),目標函數為f(x),則評價函數可以用目標函數
p(x)=f(x);
目標函數值與xnow目標值的差值
p(x)=f(x)-f(xnow),
其中xnow是上一次迭代計算的解;目標函數值與當前最優解xbest目標值的差值
p(x)=f(x)-f(xbest),
其中xbest是目前計算中的最好解。
基於目標函數的評價函數的形成主要通過對目標函數進行簡單的運算,它的變形很多。
2、其他方法
有時計算目標值比較復雜或耗時較多,解決這一問題的方法之一是采用替代的評價函數。替代的評價函數還應該反應原目標函數的一些特性,如原目標函數對應的最優點還應該是替代函數的最優點。構造替代函數的目標是減少計算的復雜性。具體問題的替代函數構造依問題而定。
一下羅列三種常用的特赦規則,在下面的討論中,認為評價值越小越好。
(1) 基於評價值的規則。在整個計算過程中,記憶已出現的最好解xbest。當候選集中出現一個解xnow,其評價值(可能是目標值)滿足c(xbest)>c(xnow)時,雖說從xbest達到xnow的變化是被禁忌的,此時,解禁xnow使其自由。直觀理解,我們得到一個更好的解。
(2) 基於最小錯誤的規則。當候選集中所有的對象都被禁忌時,而(1)的規則又無法是程序繼續下去。為了得到更好的解,從候選集的所有元素中選一個評價值最小的狀態解禁。
(3)基於影響力的規則。有些對象的變化對目標值的影響很大,而有的變化對目標值的變化較小,我們應該關注影響大的變化。從這個角度理解,如果一個影響大 的變化成為被禁對象,我們應該使其自由,這樣才能得到問題的一個更好的解。需要注意的是,我們不能理解為:對象的變化對目標影響大就一定使得目標(或是評 價值)變小,它只是一個影響力指標。這一規則應結合禁忌長度和評價函數值使用。如在候選集中目標值都不及當前的最好解,而一個禁忌對象的影響指標很高且很快將被解禁時,我們可以通過解禁這個狀態以期望得到更好的解。
在計算的過程中,記憶一些信息對解決問題是有利的。如一個最好的目標值出現的頻率很高,這使我們有理由推測:現有參數的算法可能無法再得到更好的解,因為重復的次數過高,使我們認為可能出現了多次循環。根據解決問題的需要,我們可以記憶解集合、有序被禁對象組、目標值集合等的出現頻率。一般可以根據狀態的變化將頻率信息分為兩類:靜態和動態。
靜態的頻率信息主要是某些變化,諸如解、對換或目標值在計算中出現的頻率。求解它們的頻率相對比較簡單。如可以記錄它們在計算中出現的次數,出現的次數與 總的跌代數的比率,從一個狀態出發再回到該狀態的迭代次數等。這些信息有助於我們了解一些解、對換或目標值的重要性,是否出現循環和循環的次數。在禁忌搜 索中,為了更充分的利用信息,一定要記憶目前最優解。
動態的頻率信息主要是從一個解、對換或目標值到另一個解、對換或目標值的變化趨勢,如記憶一個解序列的變化,或即一個解序列變化的若干個點等。由於記錄比較復雜,因此它提供的信息量也較大。在計算動態頻率時,通常采用的方法為:
(1)一個序列的長度,即序列中元素個數。在記錄若干個關鍵點的序列中,按這些關鍵點的序列長度的變化進行計算;
(2)從序列中的一個元素出發,再回到該序列該元素的迭代次數;
(3)一個序列的平均目標(平均)值,從序列中一個元素到另一個元素目標(平均)值的變化情況;
(4)該序列出現的頻率。
