OI騙分神器——模擬退火算法

前言&&爲何要學模擬退火

最近一會兒學了一大堆省選算法,因此搞一個愉快一點的東西來讓娛樂一下html

實際上是爲了騙到更多的分,而後證實本身的RP算法

說實話模擬退火是一個集物理IT多方面知識與一身的高級隨機化算法框架

因此更應該好好學了函數

PS:本文大部份內容參考rvalue大佬的博客,在本蒟蒻學習的過程過程當中起到了極大的幫助。學習


什麼是模擬退火&&模擬退火能夠幹什麼

模擬退火算法(Simulate Anneal,SA)是一種通用機率演算法,用來在一個大的搜尋空間內找尋命題的最優解。模擬退火是由S.Kirkpatrick, C.D.Gelatt和M.P.Vecchi在1983年所發明的。V.Černý在1985年也獨立發明此演算法。模擬退火算法是解決TSP問題的有效方法之一。優化

模擬退火的出發點是基於物理中固體物質的退火過程與通常組合優化問題之間的類似性。模擬退火算法是一種通用的優化算法,其物理退火過程由加溫過程、等溫過程、冷卻過程這三部分組成。spa

——By 百度百科htm

看的很矇蔽?其實我也是blog

其實模擬退火是一種隨機化算法,通常用於求函數的極值get

固然TSP什麼的跑起來也不在話下。

通常這個函數都是毫無規律的,廢話有規律還不上二/三分


通常的隨機化算法——登山算法

首先對於上面的函數求極值問題咱們很容易想到能夠亂搞

假設當前的最優解位置爲\(x\),設函數值爲\(F(x)\),那麼咱們能夠在必定範圍內隨機一個\(y\),若\(F(y)>F(x)\)(假如求最大值),那麼將最優解\(x\)的位置移動至\(y\)

這樣的確定會愈來愈接近最優解,不過可能會陷入一個局部最優解沒法出來

注意登山算法得出的最優解與初始解的位置以及搜尋的附近解的區域大小有關。

固然若是你尋找新方案的區間很大的話有機率跳出去, 可是太大的話又可能跳來跳去跳亂了從而找不到最優解

因此咱們應該怎麼辦呢,固然是求助於天然規律啦


關於退火的核心理論

登山法是完徹底全的貪心法,每次都鼠目寸光的選擇一個當前最優解,所以只能搜索到局部的最優值。模擬退火其實也是一種貪心算法,可是它的搜索過程引入了隨機因素。模擬退火算法以必定的機率來接受一個比當前解要差的解,所以有可能會跳出這個局部的最優解,達到全局的最優解。——By dalao's blog

搞事情,那咱們具體怎麼實現呢?

根據熱力學規律並結合計算機對離散數據的處理, 咱們定義: 若是當前溫度爲\(T\), 當前狀態與新狀態之間的能量差爲\(\Delta E\), 則發生狀態轉移的機率爲:

\[P(\Delta E)=e^{\frac{\Delta E}{kT}}\]

顯然若是\(\Delta E\)爲正的話轉移是必定會成功的, 可是對於\(\Delta E<0\)咱們則以上式中計算獲得的機率接受這個新解。

而後咱們只要維護當前溫度\(T\)便可。這裏有三個比較重要的參數:初始溫度\(T_0\)(視題目要求而定),降溫係數\(dlt\)(通常取\([0.9,0.998]\)之間的數),終止溫度\(EPS\)(視題目精度而定)

退火過程當中咱們先讓\(T=T_0\),而後進行一次轉移,以後令\(T=dltT\)

\(T<EPS\)時結束退火,並將當前解做爲最優解

看一個維基百科上的圖理解一下吧:

Pic


模擬退火的實踐核心——參數

要寫得一手好模擬退火,強大的調參能力是必不可少的。如下簡述幾個經常使用的技巧:

  1. 關於\(EPS\),這個主要視題目要求而定,通常比要求的精度多取兩位小數就夠了,主意取得太大可能會T。
  2. 關於\(dlt\),通常狀況下\(dlt\)的取值一旦減小一個數量級,時間複雜度就會增大\(10\)。所以謹慎調節\(dlt\),若是發現老是找不到最優解那麼能夠考慮更慢的降溫,即適當減少\(dlt\)
  3. 關於\(T_0\),這個和時間複雜度關係不大,不過通常狀況下\(T_0\)越大越容易跳出局部最優解。

大體框架

  1. 根據當前解以及溫度找到隨機出下一個解
  2. 計算下一個解的能量
  3. 決定是否要接受這個新的解
  4. 進行降溫

總結&&趣談隨機化算法

模擬退火在OI中是一種在最優化問題中騙分的好方法

對於一些奇奇怪怪的多元函數也能夠用這個方法來求解

同時,其它的一些隨機化算法也是有着很大的應用的,網上有一個比較有趣且形象的方法來理解它們:

  1. 兔子朝着比如今高的地方跳去。他們找到了不遠處的最高山峯。可是這座山不必定是珠穆朗瑪峯。這就是局部搜索,它不能保證局部最優值就是全局最優值。
  2. 兔子喝醉了。他隨機地跳了很長時間。這期間,它可能走向高處,也可能踏入平地。可是,他漸漸清醒了並朝最高方向跳去。這就是模擬退火。
  3. 兔子們吃了失憶藥片,並被髮射到太空,而後隨機落到了地球上的某些地方。他們不知道本身的使命是什麼。可是,若是你過幾年就殺死一部分海拔低的兔子,多產的­兔子們本身就會找到珠穆朗瑪峯。這就是遺傳算法。
  4. 兔子們知道一個兔的力量是眇小的。他們互相轉告着,哪裏的山已經找過,而且找過的每一座山他們都留下一隻兔子作記號。他們制定了下一步去哪裏尋找的策略。這­就是禁忌搜索。

一道經典的模擬退火題

題目:P1337 [JSOI2004]平衡點 / 吊打XXX&&Sol

相關文章
相關標籤/搜索