目錄:
1、數學定義
2、過程描述
3、算法簡介
4、總結
1、數學定義
局部搜索是解決最優化問題的一種啟發式算法。對於某些計算起來非常復雜的最優化問題,比如各種NP完全問題,要找到最優解需要的時間隨問題規模呈指數增長,因此誕生了各種啟發式算法來退而求其次尋找次優解,是一種近似算法(Approximate algorithms),以時間換精度的思想。局部搜索就是其中的一種方法。
對於組合問題,給出如下定義:
其中,S為搜索空間(解空間),其中的每一元素都是問題一個可能解。解決組合問題,即是找到一個s* ∈ S,使得目標函數f值最小。s*稱為全局最優解。
對於鄰域動作定義如下:
鄰域動作是一個函數,通過這個函數,對當前解s,產生其相應的鄰居解集合。例如:對於一個bool型問題,其當前解為:s = 1001,當將鄰域動作定義為翻轉其中一個bit時,得到的鄰居解的集合N(s)={0001,1101,1011,1000},其中N(s) ∈ S。同理,當將鄰域動作定義為互換相鄰bit時,得到的鄰居解的集合N(s)={0101,1001,1010}.
2、過程描述
局部搜索算法從一個初始解開始,通過鄰域動作,產生其鄰居解,判斷鄰居解的質量,根據某種策略,來選擇鄰居解,重復上述過程,至到達終止條件。不同局部搜索算法的區別就在於:鄰域動作的定義和選擇鄰居解的策略,也是決定算法好壞的關鍵(集中性和發散性,Intensification and Diversification)。
3、算法簡介
對於優化問題相關算法有如下分類:
下文分別簡單介紹幾個局部搜索相關算法,也是基於個體的啟發式算法(Single solution)。
3.1 爬山法(Hill-climbing)
爬山法與Iterative Improvement的思想是一樣的,區別在於前者尋找最大值,后者尋找最小值。一種完全的貪心的思想,有更好的,則選擇更好的,沒有更好的,則終止。
流程如上圖所示,判斷當前解s的鄰居解質量,若其中有比當前解更好的解,則s = Improve(N(S)),令當前解等於鄰居解中質量最好的解,重復上述過程,直至鄰居解中沒有更好的解為止。
缺點:很容易陷入局部極值,最終解的好壞與初始解的選擇有很大關系。
3.2 模擬退火(Simulated annealing)
為了防止陷入局部最優,模擬退火算法以一定概率接受比當前解差的解,接受差解的概率隨着迭代次數的增加而下降,或者說是隨着溫度T的下降而下降。先看流程圖,如下:
該算法從一個初始解開始,這個初始解可以是隨機選擇的,也可以是啟發式方式得到的,並初始化一個溫度。在每次迭代過程中,從當前解的鄰居解中隨機的選擇一個解,若隨機選擇的一個鄰居解比當前解的質量好,則替換當前解,若質量比當前解差,則以一定的概率接受這個差解,來替換當前解。最后更新溫度T,進行下一次迭代。
- 接受差解的概率是一個關於 T 和 (f(s') - f(s)) 的函數。函數形式為:p(T,s',s) = exp(- ( f(s') - f(s) ) / T)
- 溫度T隨着搜索的過程而減小,由上述表達式可知,隨着T減小(對於最小值問題,解的質量最好,f(x)的值越小),接受差解的概率越小,因此模擬退火算法將慢慢收斂於一個 simple iterative improvement algorithm。
- 該算法由兩個階段:random walk and iterative improvement,這兩者體現了啟發式算法核心思想:Diversification and Intensification,前者提供了一個廣闊的搜索空間,后者使其收斂於最小值(或者局部最小值)。
3.3 禁忌搜索(Tabu/Taboo Search, TS)
禁忌搜索,顧名思義,禁止某些選項。TS算法通過引入一個靈活的存儲結構和相應的禁忌准則來避免暫時的迂回搜索。
舉個簡單的例子:一日三餐,為了尋找最好的搭配。
- 當10月1日(初始日)中午隨機選了幾樣東西作為食物,早上:面包,中午:米飯,晚上:面條;
- 當10月2日(第二次迭代),在眾多相近的選擇中(鄰居解集合),我選擇效果最好的,早上:面包,中午:面條,晚上:面條,
- 2日整體效果比1日好,那么其變化為:中午由 米飯->面條, “中午:米飯”這個屬性被我記住了(禁忌表),在接下來幾天(禁忌長度)中,對於鄰居解中任何有“中午:米飯”的解,我將不會考慮,除非該解比歷史最好的效果都好(解禁條件)。
通過上例,引出一下幾個概念:
禁忌表(tabu list):記錄被禁止的屬性,其值為禁忌長度(tabu tenure),該長度范圍內,該屬性被禁止。
解禁條件(aspiration condition):當含有禁忌屬性的解,效果好於歷史最好解時,我們選擇這個被禁忌的解,其他情況,被禁忌的解不予考慮。
對於禁忌算法,每次一迭代都要更新禁忌表,禁忌表的維護決定了算法的快慢,對於禁忌長度,可以是恆定的長度,也可以是動態的長度。具體的細節,可以參見博文的圖染色問題。
3.4 Explorative Local Search methods
注:此節中,偽代碼中提到的 LocalSearch(s) 為簡單的局部搜索,上面三種算法的任意一種。c
3.4.1 迭代局部搜索(Iterated Local Search, ILS)
在局部搜索得到的局部最優解上,加入了擾動,再重新進行局部搜索。其思想是:物以類聚,好的解之間會有一些共性,所以在局部最優解上做擾動,比隨機的選擇一個初始解在進行局部搜索,效果更好。
過程描述如下:
其偽代碼如下:
對與其中的接受准則:這里采用了模擬退火中的概率函數:
3.4.2 變鄰域搜索(Variable Neighborhood Search, VNS)
- 變鄰域搜索算法的主要思想是:采用多個不同的鄰域進行系統搜索。首先采用最小的鄰域搜索,當無法改進解時,則切換到稍大一點的鄰域。如果能繼續改進解,則退回到最小的鄰域,否則繼續切換到更大的鄰域。
- 變鄰域搜索的特點是利用不同的動作構成的鄰域結構進行交替搜索,在集中性和疏散性之間達到很好的平衡。
- 其思想可以概括為“變則通”。
過程描述如下:
每變換一次鄰域,相對於切換了搜索的地形(landscape)。效果如下:
偽代碼如下圖:
4、總結
啟發式算法蘊含着許多人生哲學,它雖不是數學方法,其思想更類似於人類解決問題的思想和一些人生中總結的道理,值得好好體會。最后用網上一段描述局部搜索的例子來作為總結:
為了找出地球上最高的山,一群有志氣的兔子們開始想辦法。
- 兔子朝着比現在高的地方跳去。他們找到了不遠處的最高山峰。但是這座山不一定是珠穆朗瑪峰。這就是Iterative Improvement,它不能保證局部最優值就是全局最優值。
- 兔子喝醉了。他隨機地跳了很長時間。這期間,它可能走向高處,也可能踏入平地。但是,他漸漸清醒了並朝最高方向跳去。這就是模擬退火。
- 兔子們知道一個兔的力量是渺小的。他們互相轉告着,哪里的山已經找過,並且找過的每一座山他們都留下一只兔子做記號。他們制定了下一步去哪里尋找的策略。這就是禁忌搜索。
- 兔子們吃了失憶葯片,並被發射到太空,然后隨機落到了地球上的某些地方。他們不知道自己的使命是什么。但是,如果你過幾年就殺死一部分海拔低的兔子,多產的兔子們自己就會找到珠穆朗瑪峰。這就是遺傳算法。
參考資料:
- Metaheuristicsin Combinatorial Optimization: Overview and Conceptual Comparison
- 華中科技大學呂志鵬老師:啟發式優化課件