日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

模板:模拟退火

發(fā)布時間:2023/12/3 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模板:模拟退火 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 解析
    • 流程
    • 示例代碼
    • trick

所謂模擬退火,就是通過代碼模擬退火

(逃)

前言

終于學了這個神奇的騙分算法
幾次在大賽中都發(fā)現(xiàn)這算法是真的有學的必要
FFC可能真的要想想自己的題目對OI界的導向作用了
但學完以后還是感覺挺有意思的,無腦艸題也很香

似乎絕大多數(shù)教程都會在這個地方貼一個百度百科在物理學上對退火的定義
但我并不想貼
因為個人感覺這個算法雖然說是模擬但感覺完全不需要知道任何關于退火的知識…
模擬退火,其實可以理解成模擬降溫

解析

流程

其實模擬退火代碼框架很簡單
總體如下:

void SA(){//設置初溫//生成一個較優(yōu)的初始解,并計算初始答案 while(T>1e-10){//生成次優(yōu)解,計算答案優(yōu)劣變化(能量變化量)if(/*接受新的解*/){//更新當前解 }T*=t;//降溫} }

就這么短
其中,計算答案優(yōu)劣變化和初始答案通常會外包一個 calc 函數(shù),也是許多時候決定一個退火算法優(yōu)劣的關鍵
至于是否接受當前解,分情況來討論:
設答案變化量為 xxx,當前求答案最小值 (降溫)

  • 如果答案變優(yōu)(x<0x<0x<0),直接更新當前解
  • 否則(x≥0x\ge 0x0),接受新解的概率為:e?xTe^{\frac{-x}{T}}eT?x?
  • 定性來看,這個東西是和諧的,答案變差的越多,我們接受的概率就越小

    示例代碼

    P1337 [JSOI2004]平衡點 / 吊打XXX

    #include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=1050; const double eps=1e-12; inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; }int n; double x[N],y[N],w[N]; double T,t,X,Y; void SA(){T=1e5,t=0.95;for(int i=1;i<=n;i++) X+=x[i],Y+=y[i];X/=n;Y/=n;while(T>1e-5){double fx(0),fy(0);for(int i=1;i<=n;i++){double dx=x[i]-X,dy=y[i]-Y;if(abs(dx)<1e-15&&abs(dy)<1e-15) continue;double per=1.0/sqrt(dx*dx+dy*dy);fx+=w[i]*dx*per;fy+=w[i]*dy*per;}X+=fx*T;Y+=fy*T;T*=t;}printf("%.3lf %.3lf\n",X,Y); } signed main() { #ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout); #endifn=read();for(int i=1;i<=n;i++){x[i]=read();y[i]=read();w[i]=read();}SA();return 0; } /**/

    trick

  • 卡時:模擬退火的時間限制總是多多益善,可以說,任何時候你都沒有理由不給退火卡時(模擬退火可以WA,但絕對不能T,注意算好時間!!!
  • calc函數(shù)別真就硬暴力,可以配合一些貪心
  • 調參:離不開的夢魘,我也說不清楚,但從這道題來看,降溫調的慢一些似乎是個不錯的選擇
  • 可以在同一溫度使用多次迭代嘗試更新多次(但是看多篇題解這種寫法似乎并不主流)
  • Thanks for reading!

    總結

    以上是生活随笔為你收集整理的模板:模拟退火的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。