模擬退火大概原理就是將熱力學裡面金屬退火的原理放在了統計學意義中。
其在電腦科學中的應用也是很可觀的---處理一些無法用多項式時間複雜度解決的np問題。對於一些最優化問題,往往我們可以轉化為乙個神奇的函式(引數不限),比如像這樣
如果這個函式滿足單峰性,我們往往可以直接套用三分來處理,但是都說了這如果是乙個奇怪的函式,有很多個峰怎麼辦呢?
有乙個神奇的貪心演算法叫做爬山。每次隨機乙個delta值,並且每次值隨機範圍越變越小,看一下變化這個delta值之後的值是否更好,更好就爬山爬過去。
這個演算法很容易陷入乙個區間內的極優值,而無法到底最終的最優值。
那麼退火來了!物理學得差就不講物理上的原理了orz.首先我們設定乙個初始溫度,初始點,降溫係數和最終溫度,初始溫度要保證覆蓋完可能是最優點的範圍,降溫係數略比1小一點。
之後我們每次從當前點位置進行隨機新位置,並且這個隨機的範圍與當前溫度$t$正相關,之後看一下那個位置的函式對應的值$f(new)$,與當前位置$f(old)$相比可以得到差值$\delta = f(now) - f(old)$ 比如我們要求函式最小值,那麼當前位置轉移過去的概率為
$\begin
1, & \
e^, &
\end
$這個如果$\delta<0$應該都能理解,關於大於0,是根據metropolis接受準則來的。感性理解就好,這樣就可以以一定概率接受乙個更差解,並且最終的概率是收斂的,因此這個演算法是真實可行的。退火係數設為略小於1的正數,大概0.98再往上取。最後為了保證答案質量可以等溫度降完之後再在答案點附近多隨幾下。如果要保證時間,可以用用蒙特卡羅卡時。
隨機數種子取多少?嘿嘿嘿嘿嘿
[jsoi2004]平衡點
正解是半平面交切割凸包?orz直接裸上模擬退火orz
#include#include#include#include#include#include#includetypedef double db;
const db jw = 0.98;//降溫係數
const db eps = 1e-3;//精度誤差以及最後的終止溫度
using namespace std;
struct nodz[1005];
nod ans,now; db minans = 1e100;
int n;
db calc(nod o)
if(reseps)
t = t*jw;
}//為保證最終答案質量在答案點附近多隨幾次
for(int i=1;i<=1000;i++)
}int main()
ans.x/=n; ans.y/=n;
sa(20000);
printf("%.3f %.3f",ans.x,ans.y);
}
亂搞 Evensgn 的債務
時間限制 1 sec 記憶體限制 128 mb evensgn 有一群好朋友,他們經常互相借錢。假如說有三個好朋友 a,b,c。a 欠 b 20 元,b 欠 c 20 元,總債務規模為 20 20 40 元。evensgn 是個追求簡約 的人,他覺得這樣的債務太繁雜了。他認為,上面的債務可以完全等價...
模擬 亂搞 AOJ 10 目標柏林
description 1945年初,蘇軍和英美聯軍已從東西兩面攻入德國國境。4月初,在蘇軍和英美聯軍的夾擊下,德軍只能龜縮在以柏林為中心的德國東部的狹長地帶,成了甕中之鱉。但希特拉困獸猶鬥,一方面發出摧毀一切設施,實行 焦土 政策的指令 另一方面下令把德國分為南北兩個行政區,各自作戰,他自己則固守...
3770 瘋狂的限制 亂搞
從左到右列舉子串的右區間,同時維護每個位置作為子串的左區間時能滿足的限制條件個數,將滿足條件個數在 l,r 的左區間統計入答案即可。設當前列舉的右區間為i,位置x作為左區間時滿足的限制條件個數為a x 現在將右區間改為i 1,如何維護a 首先a i 1 可以o k 判斷。對於某個限定條件c x l ...