優化算法入門系列文章目錄(更新中):
1. 模擬退火算法
2. 遺傳算法
一. 爬山算法 ( Hill Climbing )
介紹模擬退火前,先介紹爬山算法。爬山算法是一種簡單的貪心搜索算法,該算法每次從當前解的臨近解空間中選擇一個最優解作爲當前解,直到達到一個局部最優解。
爬山算法實現很簡單,其主要缺點是會陷入局部最優解,而不一定能搜索到全局最優解。如圖1所示:假設C點爲當前解,爬山算法搜索到A點這個局部最優解就會停止搜索,因爲在A點無論向那個方向小幅度移動都不能得到更優的解。
圖1
二. 模擬退火(SA,Simulated Annealing)思想
爬山法是完完全全的貪心法,每次都鼠目寸光的選擇一個當前最優解,因此只能搜索到局部的最優值。模擬退火其實也是一種貪心算法,但是它的搜索過程引入了隨機因素。模擬退火算法以一定的概率來接受一個比當前解要差的解,因此有可能會跳出這個局部的最優解,達到全局的最優解。以圖1爲例,模擬退火算法在搜索到局部最優解A後,會以一定的概率接受到E的移動。也許經過幾次這樣的不是局部最優的移動後會到達D點,於是就跳出了局部最大值A。
模擬退火算法描述:
若J( Y(i+1) )>= J( Y(i) ) (即移動後得到更優解),則總是接受該移動
若J( Y(i+1) )< J( Y(i) ) (即移動後的解比當前解要差),則以一定的概率接受移動,而且這個概率隨着時間推移逐漸降低(逐漸降低才能趨向穩定)
這裏的“一定的概率”的計算參考了金屬冶煉的退火過程,這也是模擬退火算法名稱的由來。
根據熱力學的原理,在溫度爲T時,出現能量差爲dE的降溫的概率爲P(dE),表示爲:
P(dE) = exp( dE/(kT) )
其中k是一個常數,exp表示自然指數,且dE<0。這條公式說白了就是:溫度越高,出現一次能量差爲dE的降溫的概率就越大;溫度越低,則出現降溫的概率就越小。又由於dE總是小於0(否則就不叫退火了),因此dE/kT < 0 ,所以P(dE)的函數取值範圍是(0,1) 。
隨着溫度T的降低,P(dE)會逐漸降低。
我們將一次向較差解的移動看做一次溫度跳變過程,我們以概率P(dE)來接受這樣的移動。
關於爬山算法與模擬退火,有一個有趣的比喻:
爬山算法:兔子朝着比現在高的地方跳去。它找到了不遠處的最高山峯。但是這座山不一定是珠穆朗瑪峯。這就是爬山算法,它不能保證局部最優值就是全局最優值。
模擬退火:兔子喝醉了。它隨機地跳了很長時間。這期間,它可能走向高處,也可能踏入平地。但是,它漸漸清醒了並朝最高方向跳去。這就是模擬退火。
下面給出模擬退火的僞代碼表示。
三. 模擬退火算法僞代碼
四. 使用模擬退火算法解決旅行商問題
旅行商問題 ( TSP , Traveling Salesman Problem ) :有N個城市,要求從其中某個問題出發,唯一遍歷所有城市,再回到出發的城市,求最短的路線。
旅行商問題屬於所謂的NP完全問題,精確的解決TSP只能通過窮舉所有的路徑組合,其時間複雜度是O(N!) 。
使用模擬退火算法可以比較快的求出TSP的一條近似最優路徑。(使用遺傳算法也是可以的,我將在下一篇文章中介紹)模擬退火解決TSP的思路:
1. 產生一條新的遍歷路徑P(i+1),計算路徑P(i+1)的長度L( P(i+1) )
2. 若L(P(i+1)) < L(P(i)),則接受P(i+1)爲新的路徑,否則以模擬退火的那個概率接受P(i+1) ,然後降溫
3. 重複步驟1,2直到滿足退出條件
產生新的遍歷路徑的方法有很多,下面列舉其中3種:
1. 隨機選擇2個節點,交換路徑中的這2個節點的順序。
2. 隨機選擇2個節點,將路徑中這2個節點間的節點順序逆轉。
3. 隨機選擇3個節點m,n,k,然後將節點m與n間的節點移位到節點k後面。
五. 算法評價
模擬退火算法是一種隨機算法,並不一定能找到全局的最優解,可以比較快的找到問題的近似最優解。 如果參數設置得當,模擬退火算法搜索效率比窮舉法要高。
from here : http://www.cnblogs.com/heaad/ 轉載請註明