[OI] 模拟退火
1.[OI] 树上背包问题2.[OI] 图论3.[OI] 关于最小环和负权环4.[OI] 分层图最短路5.[OI] 关于Eratosthenes筛法的优化思路6.[OI] DP7.[OI] 线段树8.[OI] 扫描线9.[OI] KMP10.[OI] 二分图11.[OI] 平衡树12.[OI] pb_ds13.[OI] Kruskal 重构树
14.[OI] 模拟退火
15.[OI] 可持久化数据结构16.[OI] Testlib17.[OI] 交互 | pipe18.[OI] 二项式期望 DP19.[OI] 整体二分20.[OI] 结构体引用类型转换21.[OI] 猫树22.[OI] 树链剖分23.Borůvka 算法24.线段树分治25.C++ 编译静态链接 (-static)模拟退火是一种适合求样本点较大的多峰函数极值的方法.
模拟退火有几个参数:初始温度(
模拟退火在每次会根据温度选择一个新的决策点,温度越高,选择的决策点距离当前最优决策点越远. 具体地,为了实现这一步,我们可以直接把温度乘进随机数里:
double ex=ansx+(rand()*2-RAND_MAX)*t;
double ey=ansy+(rand()*2-RAND_MAX)*t;
其中
在找出当前决策点以后,就计算它的贡献,然后进行下一个决策点的选择:
- 假如新的决策点更优,直接选择该决策点
- 否则,有
的概率选择这个新的决策(二项式分布,这一步的目的是防止它卡在局部最优解里)
第二步可以这么实现:
else if(exp(-de/t)*RAND_MAX>rand()){
ansx=ex,ansy=ey;
}
为了让模拟退火正确的概率更高,可以考虑如下几点:
- 换 srand() 纯看脸
- 多跑几遍模拟退火(推荐用 clock() 卡时间跑完,充分利用每一毫秒)
- 多调调参
UPD:Linux 环境下 clock() 的单位是微秒
JSOI2004 平衡点
本题的权值函数为系统重力势能之和,能量越低越稳定,因此权值低的为更优解.
我选择调 srand,用 CTHOIissb
在
#include<bits/stdc++.h>
using namespace std;
using namespace std;
int n;
struct node{
int x,y,w;
}a[2001];
double ansx,ansy,answ;
inline double energy(double x,double y){
double r=0,dx,dy;
for(int i=1;i<=n;++i){
dx=x-a[i].x;
dy=y-a[i].y;
r+=sqrt(dx*dx+dy*dy)*a[i].w;
}
return r;
}
void sa(){
double t=3000,down=0.996;
while(t>1e-15){
double ex=ansx+(rand()*2-RAND_MAX)*t;
double ey=ansy+(rand()*2-RAND_MAX)*t;
double ew=energy(ex,ey);
double de=ew-answ;
if(de<0){
ansx=ex;ansy=ey;answ=ew;
}
else if(exp(-de/t)*RAND_MAX>rand()){
ansx=ex,ansy=ey;
}
t*=down;
}
}
unsigned long long _hash(string x){
unsigned long long ans=0;
for(char i:x){
ans=ans*233+i;
}
return ans;
}
int main(){
int st=clock();
srand(_hash("CTHOIissb"));
cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i].x>>a[i].y>>a[i].w;
ansx+=a[i].x;
ansy+=a[i].y;
}
ansx/=n,ansy/=n;
answ=energy(ansx,ansy);
while(clock()-st<=1000*980) sa();
printf("%.3lf %.3lf",ansx,ansy);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!