由於據說打得一手好隨機化搜索的yyb據佬在考場上D2T3重測前拿下90分怒虐全場,因此蒟蒻也聞風而動了html
網上好多博客都講得十分高大上啊欺負我這種什麼也不會的蒟蒻算法
因而蒟蒻就想嘗試用一種更淺顯通俗的方式去理解它函數
模擬退火適用的問題一般是一些求最優解的問題spa
好比,把問題抽象地當作一個長成這樣的毫無規律的函數,而最優解就是函數的最低點htm
衆所周知,對於一個沒有辦法在多項式複雜度的算法下完成求解的問題,咱們一般會想到一種簡單粗暴的方法——貪心blog
選擇問題的某一個狀態,而後不斷向更優的狀況靠近圖片
好比從A出發,能夠得到局部最優解B,但這顯然不是全局最優解get
顯然,這樣作的侷限性是,過於侷限在局部的一個凹部分而沒法跳出去去尋找更優的解博客
爲了解決這一問題,科學家們想到了物理的退火降溫的過程——flash
一個處於很高溫度的物體,如今要給它降溫,使物體內能降到最低。
咱們常規的思惟是,越快越好,讓它的溫度迅速地下降。
然而,實際上,過快地降溫使得物體來不及有序地收縮,難以造成結晶。而結晶態,纔是物體真正內能降到最低的形態。
正確的作法,是徐徐降溫,也就是退火,才能使得物體的每個粒子都有足夠的時間找到本身的最佳位置並緊密有序地排列。開始溫度高的時候,粒子活躍地運動並逐漸找到一個合適的狀態。在這過程當中溫度也會越降越低,溫度低下來了,那麼粒子也漸漸穩定下來,相較於之前不那麼活躍了。這時候就能夠慢慢造成最終穩定的結晶態了。
那麼,咱們可不能夠把找到最優解,與造成結晶態,這兩個過程聯繫在一塊兒呢?
因而,模擬退火誕生了。
咱們須要設定這幾個參數,模擬退火過程
再定義一些量
咱們給一個初始解\(x\),並讓它不斷變更。要模擬變更的大小隨溫度的下降而下降,咱們每次的\(\Delta x\)應該在一個大小與\(T\)成正比的值域內隨機取值。
這時候咱們就要考慮是否將當前解變爲目標解。由於咱們仍是須要貪心,因此若是\(f(x_1)<f(x)\),那麼接受目標解,\(x=x_1\)
那若是\(f(x_1)>f(x)\)呢?咱們固然要以必定機率接受它啦,這樣才能跳出局部的限制,去搜尋更優的解,彌補貪心的侷限性。那麼這個機率應該是多少呢?一樣要模擬變更的大小隨溫度的下降而下降。科學家通過理論分析,得出這個機率應該是\(e^{\Delta f \over T}\)
如此反覆選擇直到\(T\)趨近於0(能夠設一個EPS)這時候咱們認爲咱們當前的\(x\)就是最優解
用圖片來描述的話,就拿上面那個圖像尋找最優解爲例
首先通過大幅波動,當前解由A->B->C,找到了一個比較滿意的解。
但還不能知足。因爲溫度還比較大,此時接受了一些不比當前解優的目標解,C->D->E,成功地爬了上去。而溫度還在慢慢減少。
終於,發現了一個更優解F,成功跳出了那個很是寬的局部凹函數
這時候,溫度愈來愈小了,很難再次接受不比當前解優的目標解,再次翻出去。解終於漸漸趨於穩定,並最終到達了G,找到了最優解
如此看來,基於隨機的模擬退火能很大程度上提升正確率,但也不可能徹底正確。上面的例子只是隨意模擬出的一個狀況。因此要多跑幾遍,取每一次獲得的解的最優值。
衆所周知,模擬退火最麻煩的地方在調參,只有合適的參數才能在必定的時間內很大機率跑出最優解。
蒟蒻的經驗暫時還不足呢qwq,不過也隨便談談吧。
首先,根據數據範圍和精度要求,能夠基本肯定EPS的大小了,不過也須要嘗試手動微調。
比較麻煩的是溫度和變更率。首先沒必要顧慮,都開大一點,先把最優解跑出來。
而後,手動二分吧,注意每一個二分的值要多跑幾遍,由於模擬退火有偶然性,一次跑出最優解不表明大部分時候都能。
不過由於有兩個量,還不能直接二分,應該二分套二分比較合適
update:考試的時候寫提答,總結了一種方法:觀察法
一邊退火一邊輸出當前的溫度、解等信息,經過觀察大體感覺一下解的下降速率
通常來講,若是解的下降速率比較均勻,跑出來的最優解也就好一些
不均勻的話,就調整參數,將解的下降速率較快的時間段的\(\Delta T\)變大一點,速率就能減慢一點。反之同理。
洛谷P1337 【[JSOI2004]平衡點 / 吊打XXX】
模擬退火併非正解,不過是一道入手好題,由於各部分實現都很方便