模擬退火
首先看一下度娘的定義
模擬退火算法(Simulate Anneal,SA)是一種通用概率演算法,用來在一個大的搜尋空間內找尋命題的最優解
模擬退火是一種非常好用的隨機化算法,它是爬山算法的改進版
爬山算法的思想就是一個勁的找最優解,如果接下來的任何狀態都比當前狀態差,那么就停止
但是這樣顯然是錯誤的,比如下面這種情況
爬山找到A點之后就GG了,但是模擬退火算法會以一定的概率走向F,進而走向B,找到更優的解
至於這里為什么叫做“退火”,還要從物理學說起
在熱力學上,退火(annealing)現象指物體逐漸降溫的物理現象,溫度愈低,物體的能量狀態會低;夠低后,液體開始冷凝與結晶,在結晶狀態時,系統的能量狀態最低。大自然在緩慢降溫(亦即,退火)時,可“找到”最低能量狀態:結晶。但是,如果過程過急過快,快速降溫(亦稱「淬煉」,quenching)時,會導致不是最低能態的非晶形。
這里的最低能量狀態,也就是我們題目中的最優解
實現
因為要模擬退火的過程,因此我們先定義一些變量
$T$:當前溫度,由高溫到低溫,代表算法進行到了什么程度,一般為double類型
$\Delta T$:每次溫度的變化率,一般取$0.95 - 0.99$,模擬緩慢降溫的過程(上一次的溫度乘溫度變換率即為這一次的溫度)
$f(x)$ 當前狀態對應的值
上面我們提到,模擬退火會以一定的概率轉移到比當前差的解,那么這個概率是多少呢?科學家經過分析,當這個概率為$e^{-\frac{\Delta f}{T}}$時最優
那么根據退火的過程,我們不難得到模擬退火的算法流程
- 枚舉溫度$T$
- 計算出下一步的狀態
- 若下一步的狀態比當前狀態優或者滿足進行轉移的條件,進行轉移
- 降溫
因為模擬退火算法具有偶然性,因此我們一般需要對一個問題進行多次模擬退火算法
至於溫度的設定,以及執行算法次數的確定,這個需要看rp依題目而定
聽說模擬退火在計算幾何中有非常重要的應用,但是本蒟蒻現在連叉積都不會,所以這一塊等以后再補吧
題目
兩道很水不錯的題目