禁忌搜尋算法
為了找到“全局最優解”,就不應該執著於某一個特定的區域。局部搜尋的缺點就是太貪婪地對某一個局部區域以及其鄰域搜尋,導致一葉障目,不見泰山。禁忌搜尋就是對於找到的一部分局部最優解,有意識地避開它(但不是完全隔絕),從而獲得更多的搜尋區間。兔子們找到了泰山,它們之中的一隻就會留守在這裡,其他的再去別的地方尋找。就這樣,一大圈後,把找到的幾個山峰一比較,珠穆朗瑪峰脫穎而出。
當兔子們再尋找的時候,一般地會有意識地避開泰山,因為他們知道,這裡已經找過,並且有一隻兔子在那裡看著了。這就是禁忌搜尋中“禁忌表(tabu list)”的含義。那隻留在泰山的兔子一般不會就安家在那裡了,它會在一定時間後重新回到找最高峰的大軍,因為這個時候已經有了許多新的訊息,泰山畢竟也有一個不錯的高度,需要重新考慮,這個歸隊時間,在禁忌搜尋裡面叫做“禁忌長度(tabu length)”;如果在搜尋的過程中,留守泰山的兔子還沒有歸隊,但是找到的地方全是華北平原等比較低的地方,兔子們就不得不再次考慮選中泰山,也就是說,當一個有兔子留守的地方優越性太突出,超過了“best to far”的狀態,就可以不顧及有沒有兔子留守,都把這個地方考慮進來,這就叫“特赦準則(aspiration criterion)”。這三個概念是禁忌搜尋和一般搜尋準則最不同的地方,算法的最佳化也關鍵在這裡。
偽碼錶達:
procedure tabu search;
begin
initialize a string vc at random,clear up the tabu list;
cur:=vc;
repeat
select a new string vn in the neighborhood of vc;
if va>best_to_far then {va is a string in the tabu list}
begin
cur:=va;
let va take place of the oldest string in the tabu list;
best_to_far:=va;
end else
begin
cur:=vn;
let vn take place of the oldest string in the tabu list;
end;
until (termination-condition);
end;
以上程式中有關鍵的幾點:
(1)禁忌對象:可以選取當前的值(cur)作為禁忌對象放進tabu list,也可以把和當然值在同一“等高線”上的都放進tabu list。
(2)為了降低計算量,禁忌長度和禁忌表的集合不宜太大,但是禁忌長度太小容易循環搜尋,禁忌表太小容易陷入“局部極優解”。
(3)上述程式段中對best_to_far的操作是直接賦值為最優的“解禁候選解”,但是有時候會出現沒有大於best_to_far的,候選解也全部被禁的“死鎖”狀態,這個時候,就應該對候選解中最佳的進行解禁,以能夠繼續下去。
(4)終止準則:和模擬退火,遺傳算法差不多,常用的有:給定一個疊代步數;設定與估計的最優解的距離小於某個範圍時,就終止搜尋;當與最優解的距離連續若干步保持不變時,終止搜尋;
禁忌搜尋是對人類思維過程本身的一種模擬,它通過對一些局部最優解的禁忌(也可以說是記憶)達到接納一部分較差解,從而跳出局部搜尋的目的.
遺傳算法是基於生物進化的原理髮展起來的一種廣為套用的、高效的隨機搜尋與最佳化的方法。其主要特點是群體搜尋策略和群體中個體之間的信息交換,搜尋不依賴於梯度信息。
螞蟻算法是群體智慧型可用於解決其他組合最佳化問題,比如有n個城市,需要對所有n個城市進行訪問且只訪問一次的最短距離。