模擬退火
一:概括
1.爬山算法
所謂的爬山算法實際上就是簡單的貪心算法,貪心算法通過從當前解的臨近空間選擇一個最優的解作為新的當前解,因此這個解很有可能是局部最優解,而不是全局最優的。因為A的領域周圍沒有比他更優的解了。
2.模擬算法
模擬退火算法可以有效的解決這個陷入局部最優解的問題從而找到一個全局最優解。實際上模擬退火算法也是貪心算法,只不過它在這個基礎上增加了隨機因素。這個隨機因素就是:以一定的概率來接受一個比單前解要差的解。通過這個隨機因素使得算法有可能跳出這個局部最優解
二:起源
以爬山算法為代表的局部搜索算法僅僅適用於某類組合優化問題並且解的質量也不是很理想。於是為了克服這些缺點,人們通過一些自然物理過程尋找解決辦法模擬退火算法源於對固體的退火過程的模擬,通過采用Metropolis接受准則,並用一組稱為冷卻表的參數控制算法進程,使得我們可以在多項式時間內求出一個近似最優解。
固體退火:
1.先將固體加熱至溶化然后徐徐冷卻。
2.退火要徐徐進行使得系統在每一溫度下都達到平衡。
3.冷卻時不能急劇減溫。
模擬退火算法:
1、從某個初始解i0出發,經過L次解的變換(每次根據Metropoils算法求解),求得在給定溫度下的相對最優解。
2、減小控制參數T,重新變換解(如上)
3、求得在控制參數T趨於0時的最優解
三:參數說明
1.Metropoils算法
這個算法是模擬退火的關鍵,其實也很好理解。前面說到,模擬退火之所以是可以找到全局近似最優解,是因為它在一定程度上接受某個差解,從而可以跳出局部最優解。那么它如何接受這個差解呢?就是靠這個Metropoils算法。
Metropoils其實就是定義了一個轉移概率P:
當產生的新解比之前的效果好,那么我們以1的概率接受這個新解,用這個新解代替之前的解。如果這個新產生的解比之前的差,那么我們就以一定的概率接受它,這樣我們就有可能跳出局部最優解。
2.Mapkob鏈長
其實呢,這個什么的鏈長其實很簡單,但是它對算法的效果卻很重要。我們提到,固體退火的時候要徐徐下降使得固定在該溫度下達到平衡,那么對應到模擬退火來說其實就是在某個問題下得到一個穩定的最優解。如何得到這個穩定的最優解呢?很簡單!不斷迭代,不斷產生新解然后采用 Metropoils准則接受這個新解,這樣經過好多次好多次的迭代,就可以了。Mapkob鏈長就是迭代的次數啦。
3.溫度T
這里溫度T包括兩個方面,一方面是初始溫度,另一個就是溫度的衰減問題。
初始溫度:一般設置的大一點 ,T大一點可以保證初始階段可以搜索到全局最優解的區域,如果太小就可能無法跳出局部解。設個100000什么的。
衰減函數:其實就是每次讓溫度如何下降的問題。T=ɑ*T. ɑ 一般取接近1的數,小一點的衰減量可以使得迭代次數增加,這樣就可以產生更多變換解,就可以返回高質量的解。還可以有別的衰減函數。
四:實現
總結:算法在給定溫度下持續進行“產生新解,計算目標函數,判斷是否接受新解,接受或舍棄的迭代過 程”,然后降低溫度,再進行上述過程。
1、初始化:設置參數(初始溫度T、終止條件T<1,衰減函數T=a*T,Mapkob鏈長);
2、在給定溫度下,不斷產生新解並以Metropoils算法進行迭代Mapkob鏈長;
3、降低溫度T,回到第二步;
4、結束;
效果:
我們可以看到不管采用哪個方法產生新解都會收斂到近似最優解。因此,模擬退火的求解能力還是很強的。
具體代碼:https://github.com/guojiasheng/Tsp.git