我們先來考慮生活中的乙個實際問題:
當你在燒一壺水,燒開以後想使其分別達到兩種狀態:①使水的溫度迅速降低;②使水的能量最低;
對於第①種情況,顯然我們直接將水迅速降溫即可,但是對於這種迅速的降溫確不能保證②。要使水的能量最低,我們需要對水進行徐徐地進行降溫,使水在每個溫度的能量都趨於穩定,才能使最終水的能量達到最低狀態。(具體原因感興趣的可以自行查閱)
而這裡的「模擬退火」也是從這裡引申過來的:
對於某些我們不能一步確定最優解的問題,我們可以模擬這種徐徐退火的方法慢慢地去逼近乙個最優解。
舉個最簡單地栗子,比如我們需要求多個點的費馬點(到所有點的距離之和最小的點),這個問題並沒有上面確定性的演算法(據我所知)。我們利用模擬退火可以得到如下的計算過程:
我們取某一點a(任取),假設得到的距離和為s1,做乙個位移到b(得到的解為s2),,對於這次移動,如果移動後的解比原來的更優(s2這裡我們有乙個神奇的概率p=exp((s1-s2)/t)(metropoils演算法),我們以概率接受這個「更劣」的解(為了找到可能的全域性最優解)。
這樣的一種求解的方式就基本上是模擬退火的雛形了。
取乙個起點a(得到初值s1),初始溫度t(需要可以取到最優解),每次退火的比例(小於1且接近1的值delta)
while(t>eps)
模擬退火演算法的正確性受到多個方面的影響,比如初始溫度t,退火的速度(delta)等等。由於其中的一種隨機的取「劣」的機制,求解過程就可能將最優解捨棄了,最終得到的解可能不是最優解。
但是對於實際的io應用中,只要寫得基本上標準的話一般還是不會有太大的問題(出題人良心的話2333)。並且做了幾個題之後我發現我們並不用取那個更「劣」的解,也能得到最優解(這也是我為什麼看別人**的時候發現許多人都沒有判斷概率)。但是這可能僅限於我們的io應用中,對於實際的工程專案中,這個判斷還是必不可少的。
當我們wa了的時候通常可以嘗試將退火速度減慢(增大delta)。
反之當我們tle了的時候,我們可以加快退火的速度(減小delta)。
然而《比較大的delta>並不能保證比《比較小的delta>得到的解更優(?)。
就是感覺很玄學的演算法。
1、poj-2420-a star not a tree?(求費馬點):
題目鏈結&&解題報告
2、洛谷-p1337 [jsoi2004]平衡點 / 吊打***(類似於求費馬點):
題目鏈結&&解題報告
3、gym-101158j-cover the polygon with your disk(模擬退火+圓與多邊形的交):
題目鏈結&&解題報告
一直都不會寫這些總結性的東西,這篇寫得也可以說是很亂了,以後可能再改改吧。
寫出來主要是對自己知識點掌握程度的自檢(順便刷一波訪問量~(笑))。
select函式詳解及其在I O復用模型中的應用
一.select函式詳解 include include int select int maxfdp1,fd set readset,fd set writeset,fd set excptset,const strcut timeval timeout 返回 准有就緒的檔案描述數量,若超時則返回0...
藍芽5簡介以及其在物聯網中的作用
正如我們所看到的,藍芽5.0引入了一些可應用於廣泛潛在的物聯網功能。但是,有幾個幾個關鍵要點需要注意。藍芽5是什麼?如果你擁有一輛汽車或一部智慧型手機,你很可能會在生活中至少使用過一次藍芽。藍芽無處不在 揚聲器 無線耳機 汽車 可穿戴裝置 醫療裝置 甚至鞋子 藍芽裝置有兩種 一種稱為經典藍芽 用於無...
隱馬爾可夫模型及其在分詞中的簡單應用
隱馬爾可夫模型是乙個五元組 s 狀態集合 即所有可能的狀態s1,s2,sn所組成的集合。o 觀察序列 即實際存在的乙個狀態的有向序列,如狀態o1,o2,on,注意狀態是存在順序的。b 每種狀態出現的概率分布。初始的狀態分布 hmm模型有三個主要用途,沒有例子可能比較難於理解,分詞示例 1.引數學習 ...