模擬退火演算法(SA)

2021-10-05 04:48:15 字數 2315 閱讀 3570

介紹模擬退火前,先介紹爬山演算法。爬山演算法是一種簡單的貪心搜尋演算法,該演算法每次從當前解的臨近解空間中選擇乙個最優解作為當前解,直到達到乙個區域性最優解。

爬山演算法實現很簡單,其主要缺點是會陷入區域性最優解,而不一定能搜尋到全域性最優解。如圖1所示:假設c點為當前解,爬山演算法搜尋到a點這個區域性最優解就會停止搜尋,因為在a點無論向那個方向小幅度移動都不能得到更優的解。

在熱力學上,退火(annealing)現象指物體逐漸降溫的物理現象,溫度愈低,物體的能量狀態會低;夠低後,液體開始冷凝與結晶,在結晶狀態時,系統的能量狀態最低。大自然在緩慢降溫(亦即,退火)時,可「找到」最低能量狀態:結晶。但是,如果過程過急過快,快速降溫(亦稱「淬鍊」,quenching)時,會導致不是最低能態的非晶形。

如下圖所示,首先(左圖)物體處於非晶體狀態。我們將固體加溫至充分高(中圖),再讓其徐徐冷卻,也就退火(右圖)。加溫時,固體內部粒子隨溫公升變為無序狀,內能增大,而徐徐冷卻時粒子漸趨有序,在每個溫度都達到平衡態,最後在常溫時達到基態,內能減為最小(此時物體以晶體形態呈現)。

似乎,大自然知道慢工出細活:緩緩降溫,使得物體分子在每一溫度時,能夠有足夠時間找到安頓位置,則逐漸地,到最後可得到最低能態,系統最安穩。

想象一下如果我們現在有下面這樣乙個函式,現在想求函式的(全域性)最優解。如果採用greedy策略,那麼從a點開始試探,如果函式值繼續減少,那麼試探過程就會繼續。而當到達點b時,顯然我們的探求過程就結束了(因為無論朝哪個方向努力,結果只會越來越大)。最終我們只能找打乙個區域性最後解b。

若f( y(i+1) ) <= f( y(i) ) (即移動後得到更優解),則總是接受該移動;

若f( y(i+1) ) > f( y(i) ) (即移動後的解比當前解要差),則以一定的概率接受移動,而且這個概率隨著時間推移逐漸降低(逐漸降低才能趨向穩定)相當於上圖中,從b移向bc之間的小波峰時,每次右移(即接受乙個更糟糕值)的概率在逐漸降低。如果這個坡特別長,那麼很有可能最終我們並不會翻過這個坡。如果它不太長,這很有可能會翻過它,這取決於衰減 t 值的設定。

/*

* j(y):在狀態y時的評價函式值

* y(i):表示當前狀態

* y(i+1):表示新的狀態

* r: 用於控制降溫的快慢

* t: 系統的溫度,系統初始應該要處於乙個高溫的狀態

* t_min :溫度的下限,若溫度t達到t_min,則停止搜尋

*/while( t > t_min )

t = r * t ; //降溫退火 ,01. 初始化溫度t,初始解狀態s,每個溫度t下的迭代次數l;

2. 當k = 1,2,……,l時,進行3~6;

3. 對當前解進行變換得到新解s』(例如對某些解中的元素進行互換,置換);

4. 計算增量δt′=c(s′)-c(s),其中c(s)為評價函式;

5. 若δt′<0則接受s′作為新的當前解,否則以概率exp(-δt′/(kt))接受s′作為新的當前解(k為玻爾茲曼常數,數值為:k=1.3806505(24) × 10^-23 j/k);

6. 如果滿足終止條件則輸出當前解作為最優解,結束程式;

7. 減小t,轉到第2步,直到t小於初始設定的閾值。

#define iters 100 //迭代次數

#define t 100

#define t_min 1e-8

#define delta 0.98

#define inf 1e9

double x[iters];

double f(double x)

void init()

}double sa()}}

t = t * delta;

}for (int i = 0; i < iters; i++)

return ans;

}int main()

模擬退火(SA)模板

退役很久了,今天看一篇 用sa演算法代替隨機梯度優化神經網路,故學習一波sa演算法。因為網上的資料很多,所以這裡就不多說啦。詳情可以看 高中生太強啦 這裡放乙個模板 如圖 有n個重物,每個重物繫在一條足夠長的繩子上。每條繩子自上而下穿過桌面上的洞,然後繫在一起。圖中x處就是公共的繩結。假設繩子是完全...

演算法總結(七)SA 模擬退火演算法

學習資料 對於模擬退火演算法,核心內容還是對於退火的理解,以及以下這個公式 在溫度為t時,出現能量差為de的降溫的概率為p de 表示為 p de exp de kt 其中k是乙個常數,exp表示自然指數,且de 0。所以p和t正相關。這條公式就表示 溫度越高,出現一次能量差為de的降溫的概率就越大...

matlab練習程式(模擬退火SA)

模擬退火首先從某個初始候選解開始,當溫度大於0時執行迴圈。在迴圈中,通過隨機擾動產生乙個新的解,然後求得新解和原解之間的能量差,如果差小於0,則採用新解作為當前解。如果差大於0,則採用乙個當前溫度與能量差成比例的概率來選擇是否接受新解。溫度越低,接受的概率越小,差值越大,同樣接受概率越小。是否接受的...