模拟退火是一种适合求样本点较大的多峰函数极值的方法.

模拟退火有几个参数:初始温度(\(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\) 为当前最优决策.

在找出当前决策点以后,就计算它的贡献,然后进行下一个决策点的选择:

  1. 假如新的决策点更优,直接选择该决策点
  2. 否则,有 \(e^{\frac{-\Delta w}{T}}\) 的概率选择这个新的决策(二项式分布,这一步的目的是防止它卡在局部最优解里)

第二步可以这么实现:

else if(exp(-de/t)*RAND_MAX>rand()){
ansx=ex,ansy=ey;
}

为了让模拟退火正确的概率更高,可以考虑如下几点:

  1. 换 srand() 纯看脸
  2. 多跑几遍模拟退火(推荐用 clock() 卡时间跑完,充分利用每一毫秒)
  3. 多调调参

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] 模拟退火的更多相关文章

  1. OI骗分神器——模拟退火算法

    前言&&为什么要学模拟退火 最近一下子学了一大堆省选算法,所以搞一个愉快一点的东西来让娱乐一下 其实是为了骗到更多的分,然后证明自己的RP. 说实话模拟退火是一个集物理与IT多方面知识 ...

  2. bzoj3680模拟退火

    看题意就是一道数学物理题,带权费马点   --这怎么是数学了,这也是物理的 所以要用物理方法,比如FFF 国际著名oi选手miaom曾说 模拟退火初温可以低,但是最好烧个几千次 国际著名物理课代表+1 ...

  3. 关于oi

    2015-12-26 今天在机房,楼上的孩子发下来一个exe,善良无知的我打开了那个exe,然后电脑就关机了.萌萌的辅导老师看到之后就不再萌萌哒,他跑到五楼训斥了那群孩子们一顿(自行脑补).出于报复, ...

  4. [学习笔记] 模拟退火 (Simulated Annealing)

    真没想到这东西真的在考场上用到了...顺便水篇blog以示诈尸好了(逃 模拟退火算法 模拟退火是一种随机化算法, 用于求函数的极值qwq 比如给出一个问题, 我们要求最优解的值, 但是可能的方案数量极 ...

  5. OI生涯回忆录 2017.9.10~2018.11.11

    然而并没有退役 为了这两天,也准备了一年. 高一零基础的蒟蒻,NOIP2017仅有80pts 之后看着luogu的倒计时, 300天,200天,100天,30天, 直到10天.1天. 10号,11号的 ...

  6. OI知识点|NOIP考点|省选考点|教程与学习笔记合集

    点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...

  7. JSOI2004 平衡点 / 吊打XXX [模拟退火]

    题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到 ...

  8. OI 知识体系

    OI Training 知识体系结构 初级 1.1 C语言基础 1.1.1 C语言程序结构(A+B Problem) 1.1.2 变量,常量,数据类型,输入与输出 1.1.3 条件语句 1.1.4 循 ...

  9. OI总结

    当下考的钟声叮当响起,该走了,一年半的OI竞赛就此结束 留下了很多遗憾.也拥有过一段美好的竞赛生活 结识了一群优秀的OI战友,一起进步一起开心一起忧愁,但这一切的一切都将在今晚变成过去式,CSp的好与 ...

  10. Note -「模拟退火」

    随机化算法属于省选芝士体系 0x01 前置芝士 你只需要会 rand 就可以啦! 当然如果你想理解的更透彻也可以先看看 爬山算法 0x02 关于退火 退火是一种金属热处理工艺,指的是将金属缓慢加热到一 ...

随机推荐

  1. Django model 层之Models与Mysql数据库小结

    Django model 层之Models与Mysql数据库小结 by:授客 QQ:1033553122 测试环境: Python版本:python-3.4.0.amd64 下载地址:https:// ...

  2. LeetCode455.分发饼干

    LeetCode题目链接:https://leetcode.cn/problems/assign-cookies/description/ 题目叙述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干 ...

  3. RPC接口测试(六)RPC协议解析(重要!重要!重要!)

    RPC协议解析 RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.简言之,RPC使得程 ...

  4. 对比python学julia(第二章)--(第二节)勾股树—分形之美

    2.1.问题描述 二话不说,先上图: 图一.勾股定理图形                                                          图二.勾股树         ...

  5. 【SpringMVC】IDEA 不识别webapp的解决办法

    参考地址: https://blog.csdn.net/omrleft123/article/details/70237205

  6. python之理解super及MRO列表 ( 示例版 )

    例子   1: class A0: def pri(self): super().pri() print("A0") class A1(A0): def pri(self): su ...

  7. 并行化强化学习 —— 初探 —— 并行reinforce算法的尝试 (上篇:强化学习在多仿真环境下单步交互并行化设计的可行性)

    强化学习由于难收敛所以训练周期较长,同时由于强化学习在训练过程中起训练数据一般都为实时生成的,因此在训练的同时算法还需要生成待训练的数据,强化学习算法的基本架构可以视作下图:(取自:深度学习中使用Te ...

  8. reinforcement learning常用的游戏环境,gym框架使用的标准Atari游戏集合

    reinforcement learning常用的游戏环境,gym框架使用的标准Atari游戏集合.*.bin文件为Atari2600游戏的常用游戏环境的模拟文件,也称为roms文件. 文件地址: h ...

  9. 关于英语的语言规范问题——美式英语、英式英语和中式英语(Chinese English)到底哪个才是正宗 —— 中式英语才是英语世界的未来

    因为日常生成生活中总是会使用英语进行阅读.写作.学习和交流表达,由于小的时候是学传统正宗英语(英式英语),后来长大后因为美国实力强又开始学这个时候的正宗英语(美式英语),但是由于个人的能力问题(农村娃 ...

  10. Redis源码安装(Linux环境)

    下载源码: wget https://download.redis.io/redis-stable.tar.gz 解压: tar -xzvf redis-stable.tar.gz 编译&安装 ...