模擬退火演算法

2022-04-10 04:19:16 字數 2764 閱讀 2436

模擬退火演算法是一種隨機演算法,也是考驗 rp 的演算法。

像我這種非酋,每道題至少交一頁多。

他一般適用於求解最優性問題

如下面的這種情況

模擬退火的出發點是基於物理中固體物質的退火過程與一般組合優化問題之間的相似性。模擬退火演算法是一種通用的優化演算法,

其物理退火過程由加溫過程、等溫過程、冷卻過程這三部分組成。

原理:
模擬退火的原理也和金屬退火的原理近似:將熱力學的理論套用到統計學上,將搜尋空間內每一點想像成空氣內的分子;

分子的能量,就是它本身的動能;而搜尋空間內的每一點,也像空氣分子一樣帶有「能量」,以表示該點對命題的合適程度。

演演算法先以搜尋空間內乙個任意點作起始:每一步先選擇乙個「鄰居」,然後再計算從現有位置到達「鄰居」的概率。

簡單的說,模擬退火就是在一種一定範圍內求多峰函式最值的演算法。它在模擬溫度降低的同時得出新解,溫度越高,解的變化量越大

隨著溫度的逐漸降低,解的變化量也漸漸變小,並越發集中在最優解附近。最後溫度達到了我們設定的最低溫,對應到物理學上

也就是結晶了,這時,我們可以認為當前我們取得的解就是最優解,當然也可能不是,整個演算法也就終止了。

乙個很形象的圖

求解過程

首先,我們 介紹幾個引數

\(temp\) 為初始溫度, \(d\) 為變化度 \(eps\) 為末溫度。

從 \(t0\) 開始得到乙個新的 \(t1\) 若此時 \(t1\) 比 \(t0\) 優的話,我們的答案就是 \(t1\) 的答案。

反之,我們要有一定概率來接受這個值。

這個演算法很玄學,根據物理學的知識 p(de) = exp(de / t)

\(de\) 指溫度變化量, \(t\) 是初始溫度。

引用大佬的部落格中的一句話

"我個人對於這個概率的理解是這樣的:對於 δe,如果它較大,即我們遇到了乙個劣得多的解,那我們接受它的概率就相對較小,因為 −δe較小嘛;而如果 δe較小,即我們遇到了乙個較劣的解,

我們接受它的概率就較大,因為 −δe較大。對於 t,隨著時間的增加, t變得越來越小,因此我們把 −δe除以 t,這樣接受的概率就隨著溫度的降低而越來越小,因為 −δe是乙個負數嘛。

而對於整個式子,當 t較大的時候,我們會接受大部分的解,當 t較小的時候,我們就只會接受 δe較小的解。關於metropolis準則的具體證明,過於玄學,這裡就不給出了。當然你也可以自己試一下。如果

選擇接受 e,則把 e1​設定為 e,然後降溫並尋找下乙個解。"

一般來說,我們會在不超過時間限制的情況下,盡可能的多進行幾次模擬退火。

因為你退火的次數越多,得到的解越準確。

看到例題吧

uva10228 a star not a tree?

模擬退火板子題了。

我們一般這麼得到新座標

double ax = x + ((rand() << 1) - rand_max) * temp;//原來的座標加上變化量,就是新座標

double ay = y + ((rand() << 1) - rand_max) * temp;//記住就好了,一般都這麼寫

退火**:

void sa()

else if(exp(-bianhua / temp) * rand_max > rand())//選擇一定的概率接受這個解

temp *= d;//退火}}

總**:

#include#include#include#include#define d  0.996

#define eps 1e-12

using namespace std;

int t,n;

double stx,sty,sumx,sumy,ans,ax[110],ay[110];

double calc(double x,double y)//計算當前的答案

return res;

}void sa()

else if(exp(-bianhua / temp) * rand_max > rand())

temp *= d;

}}void work()

int main()

work();

printf("%.0lf\n", ans);

if(t != t) printf("\n");//輸出格式很煩人

}return 0;

}

一般的引數設定是按自己喜好來的,當然了你可能要多交幾遍。

正常的引數 初溫 \(t\) 一般設為 2000 -3000 的乙個數, \(d\) 一般為較小於 1 的數,比如 \(0.85-0.997\) 末溫的就設乙個較大於 \(0\) 得數 比如 1e-12

如果說,還過不去的話,那你就多調一下引數,多跑幾遍退火(也有可能是你太非了)

模擬退火演算法

w 模擬退火演算法的基本思想 將乙個優化問題比擬成乙個金屬物體,將優化問題的目標函式比擬成物體的能量,問題的解比擬成物體的狀態,問題的最優解比擬成能量最低的狀態,然後模擬金屬物體的退火過程,從乙個足夠高的溫度開始,逐漸降低溫度,使物體分子從高能量狀態緩慢的過渡到低能量狀態,直至獲得能量最小的理想狀態...

模擬退火演算法

一些求解極值的問題不能通過函式特性直接求解,只能暴力列舉,但是單純的列舉效率不高,通過模擬退火演算法可以高效的找到答案。學習好博文 最小圓覆蓋 hdu 3007 buried memory 大意 給出一些點,求出能覆蓋他們的最小的圓。輸出圓心和半徑 include include include i...

模擬退火演算法

1.模擬退火演算法認識 爬山演算法也是乙個用來求解最優化問題的演算法,每次都向著當前上公升最快的方向往上爬,但是初始化不同可能 會得到不同的區域性最優值,模擬退火演算法就可能跳出這種區域性最優解的限制。模擬退火演算法是模擬熱力學系統 中的退火過程。在退火過程中是將目標函式作為能量函式。大致過程如下 ...