1. 程式人生 > 其它 >模擬退火演算法

模擬退火演算法

模擬退火演算法

模擬退火演算法

演算法簡介

模擬退火演算法來源於固體退火原理,是一種基於概率的演算法,其出發點是基於物理中固體物質的退火過程與一般組合優化問題之間的相似性。模擬退火演算法從某一較高初溫出發,伴隨溫度引數的不斷下降,結合概率突跳特性在解空間中隨機尋找目標函式的全域性最優解,即在區域性最優解能概率性地跳出並最終趨於全域性最優,適用的問題通常是一些求最優解的問題

如果把問題抽象地看成一個長成這樣的毫無規律的函式,而最優解就是函式的最低點
摘自部落格園某位大佬
在這裡插入圖片描述
我們通常會想到一種簡單粗暴的方法——貪心

選擇問題的某一個狀態,然後不斷向更優的情況靠近

比如從A出發,可以獲得區域性最優解B,但這顯然不是全域性最優解,這樣做的侷限性是,侷限

在區域性的一個凹部分而無法跳出去去尋找更優的解

在這裡插入圖片描述
為了解決這一問題,科學家們想到了物理的退火降溫的過程——

一個處於很高溫度的物體,現在要給它降溫,使物體內能降到最低。

我們常規的思維是,越快越好,讓它的溫度迅速地降低。

然而,實際上,過快地降溫使得物體來不及有序地收縮,難以形成結晶。而結晶態,才是物體真正內能降到最低的形態。

正確的做法,是徐徐降溫,也就是退火,才能使得物體的每一個粒子都有足夠的時間找到自己的最佳位置並緊密有序地排列。開始溫度高的時候,粒子活躍地運動並逐漸找到一個合適的狀態。在這過程中溫度也會越降越低,溫度低下來了,那麼粒子也漸漸穩定下來,相較於以前不那麼活躍了。這時候就可以慢慢形成最終穩定的結晶態了。

演算法描述

  1. 設定引數:
	1. ΔT   	溫度下降速度,每次溫度等於上一次溫度乘上ΔT,實際應用時一般取0.95−0.99,模擬徐徐降溫
	2.  T       系統初始溫度(充分大)
	3. eps      搜尋停止閾值(一般為一個很小的數)
	4. T_min    溫度的下限,若溫度降至T_min則搜尋停止
	5. Y(i)   當前狀態的評價值
	6. Y(i+1) 下一次新的狀態的評價值


引數設定的不同,所得結果也可能不相同,只有引數設定合適的大小,才能在一定的時間內更大概率得到最優解
(借鑑大佬的經驗+1+1+1+1+1....+1)

首先,根據資料範圍和精度要求,可以基本確定EPS的大小了,不過也需要嘗試手動微調。

比較麻煩的是溫度和變動率。首先不必顧慮,都開大一點,先把最優解跑出來。
然後,手動二分吧,注意每個二分的值要多跑幾遍,因為模擬退火有偶然性,一次跑出最優解不代表大部分時候都能。

dalao總結了一種方法:觀察法
一邊退火一邊輸出當前的溫度、解等資訊,通過觀察大致感受一下解的降低速率
一般來說,如果解的降低速率比較均勻,跑出來的最優解也就好一些
不均勻的話,就調整引數,將解的降低速率較快的時間段的ΔT變大一點,速率就能減慢一點。反之同理。

  1. 演算法描述:
  • 若Y(i+1)> Y(i) 即答案值變換後,可以獲得更優解,則可以將狀態變換
  • 若Y(i+1)<= Y(i) 即答案變換後得到的解更差,我們一定概率接受它的變換,這個概率隨著時間而逐漸降低,這個概率表示exp(-ΔT/T)
  • T逐漸降低且T趨近於0,直至T_min終止,獲得答案

3.演算法步驟:

while(T<T_min)
    {
        if(Y(i+1) > Y(i))
            Y(i + 1) = Y(i);
        else
        {
            if(exp(ΔT/T) > random(0,1))
                Y(i + 1) = Y(i);
        }
        T *= ΔT;
    }

南昌理工acm集訓隊