[OI] 模拟退火
模拟退火是一种适合求样本点较大的多峰函数极值的方法.
模拟退火有几个参数:初始温度(\(T_{0}\)),终止温度(\(T_{e}\))和降温参数 \(d\),具体地,模拟退火是让每次的当前温度 \(T\) 变为 \(d\times T\),直到终止,因此 \(T_{e}\) 应为一个很接近 \(0\) 的正数,\(d\) 应该为一个很接近 \(1\) 的小于 \(1\) 的正数.
模拟退火在每次会根据温度选择一个新的决策点,温度越高,选择的决策点距离当前最优决策点越远. 具体地,为了实现这一步,我们可以直接把温度乘进随机数里:
double ex=ansx+(rand()*2-RAND_MAX)*t;
double ey=ansy+(rand()*2-RAND_MAX)*t;
其中 \(ansx,ansy\) 为当前最优决策.
在找出当前决策点以后,就计算它的贡献,然后进行下一个决策点的选择:
- 假如新的决策点更优,直接选择该决策点
- 否则,有 \(e^{\frac{-\Delta w}{T}}\) 的概率选择这个新的决策(二项式分布,这一步的目的是防止它卡在局部最优解里)
第二步可以这么实现:
else if(exp(-de/t)*RAND_MAX>rand()){
ansx=ex,ansy=ey;
}
为了让模拟退火正确的概率更高,可以考虑如下几点:
- 换 srand() 纯看脸
- 多跑几遍模拟退火(推荐用 clock() 卡时间跑完,充分利用每一毫秒)
- 多调调参
UPD:Linux 环境下 clock() 的单位是微秒
JSOI2004 平衡点
本题的权值函数为系统重力势能之和,能量越低越稳定,因此权值低的为更优解.
我选择调 srand,用 CTHOIissb 在 \(233\) 进制意义下的哈希值过了,难绷
#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);
}
[OI] 模拟退火的更多相关文章
- OI骗分神器——模拟退火算法
前言&&为什么要学模拟退火 最近一下子学了一大堆省选算法,所以搞一个愉快一点的东西来让娱乐一下 其实是为了骗到更多的分,然后证明自己的RP. 说实话模拟退火是一个集物理与IT多方面知识 ...
- bzoj3680模拟退火
看题意就是一道数学物理题,带权费马点 --这怎么是数学了,这也是物理的 所以要用物理方法,比如FFF 国际著名oi选手miaom曾说 模拟退火初温可以低,但是最好烧个几千次 国际著名物理课代表+1 ...
- 关于oi
2015-12-26 今天在机房,楼上的孩子发下来一个exe,善良无知的我打开了那个exe,然后电脑就关机了.萌萌的辅导老师看到之后就不再萌萌哒,他跑到五楼训斥了那群孩子们一顿(自行脑补).出于报复, ...
- [学习笔记] 模拟退火 (Simulated Annealing)
真没想到这东西真的在考场上用到了...顺便水篇blog以示诈尸好了(逃 模拟退火算法 模拟退火是一种随机化算法, 用于求函数的极值qwq 比如给出一个问题, 我们要求最优解的值, 但是可能的方案数量极 ...
- OI生涯回忆录 2017.9.10~2018.11.11
然而并没有退役 为了这两天,也准备了一年. 高一零基础的蒟蒻,NOIP2017仅有80pts 之后看着luogu的倒计时, 300天,200天,100天,30天, 直到10天.1天. 10号,11号的 ...
- OI知识点|NOIP考点|省选考点|教程与学习笔记合集
点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...
- JSOI2004 平衡点 / 吊打XXX [模拟退火]
题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到 ...
- OI 知识体系
OI Training 知识体系结构 初级 1.1 C语言基础 1.1.1 C语言程序结构(A+B Problem) 1.1.2 变量,常量,数据类型,输入与输出 1.1.3 条件语句 1.1.4 循 ...
- OI总结
当下考的钟声叮当响起,该走了,一年半的OI竞赛就此结束 留下了很多遗憾.也拥有过一段美好的竞赛生活 结识了一群优秀的OI战友,一起进步一起开心一起忧愁,但这一切的一切都将在今晚变成过去式,CSp的好与 ...
- Note -「模拟退火」
随机化算法属于省选芝士体系 0x01 前置芝士 你只需要会 rand 就可以啦! 当然如果你想理解的更透彻也可以先看看 爬山算法 0x02 关于退火 退火是一种金属热处理工艺,指的是将金属缓慢加热到一 ...
随机推荐
- 【VMware VCF】VMware Cloud Foundation Part 05:部署 SDDC 管理域。
之前文章("VMware Cloud Foundation Part 03:准备 Excel 参数表."和"VMware Cloud Foundation Part 04 ...
- RHCA cl210 015 实例启动 超融合 热迁移 网络underlay
lab computeresources-hci setup 实例启动流程 keystone不仅做认证,且有所有组键地址 nova-conductor解耦,不允许nova-compute直接访问dat ...
- 一款基于Fluent设计风格、现代化的WPF UI控件库
前言 今天大姚给大家分享一款基于Fluent设计风格.开源(MIT License).现代化的WPF UI控件库,它提供直观的设计.主题.导航和全新的沉浸式控件,全部都是原生且无缝地集成在一起:WPF ...
- Python和RPA网页自动化-异常处理Try方法
我们在跑自动化时为了捕获和处理异常,会增加异常处理Try方法.下面来看看Python和RPA网页自动化中异常处理Try的用法 1.Python中异常处理try的用法 try: test = " ...
- [银河麒麟] Samba的安装与配置
什么是Samba以及它是干嘛的 Samba,是种用来让UNIX系列的操作系统与微软Windows操作系统的SMB/CIFS(Server Message Block/Common Internet F ...
- 【Axure RP】Axure RP 9 下载安装及汉化
本体及破解机下载: http://www.sd173.com/soft/7951.html 汉化补丁教程见: https://blog.csdn.net/weixin_74457789/article ...
- 【Java】Reflection 反射机制 01概述
Reflection 反射机制 反射允许程序在执行期间借助ReflectionAPI获取任何类的内部信息,直接操作任意对象的内部属性和方法 加载完类之后,堆内存的方法区产生了一个Class 类类型的对 ...
- 【ActiveJdbc】02
一.基本的数据库操作 数据模型层: import org.javalite.activejdbc.Model; 数据访问层: import org.javalite.activejdbc.Base; ...
- ViT:拉开Trasnformer在图像领域正式挑战CNN的序幕 | ICLR 2021 —— An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
论文地址: https://arxiv.org/abs/2010.11929 Github地址: https://github.com/google-research/vision_transform ...
- 对于围棋AI作弊的一些思考
最近看到些关于围棋AI作弊的报道有了一些思考. 相关视频链接: https://www.bilibili.com/video/BV1np411f73b/?spm_id_from=autoNext ht ...