日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模板:模拟退火

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

文章目錄

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

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

(逃)

前言

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

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

解析

流程

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

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

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

  • 如果答案變優(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函數別真就硬暴力,可以配合一些貪心
  • 調參:離不開的夢魘,我也說不清楚,但從這道題來看,降溫調的慢一些似乎是個不錯的選擇
  • 可以在同一溫度使用多次迭代嘗試更新多次(但是看多篇題解這種寫法似乎并不主流)
  • Thanks for reading!

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。