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

模拟退火有几个参数:初始温度(\(T_{0}\)),终止温度(\(T_{e}\))和降温参数 \(d\),具体地,模拟退火是让每次的当前温度 \(T\) 变为 \(d\times T\),直到终止,因此 \(T_{e}\) 应为一个很接近 \(0\) 的正数,\(d\) 应该为一个很接近 \(1\) 的小于 \(1\) 的正数.

模拟退火在每次会根据温度选择一个新的决策点,温度越高,选择的决策点距离当前最优决策点越远. 具体地,为了实现这一步,我们可以直接把温度乘进随机数里:

  1. double ex=ansx+(rand()*2-RAND_MAX)*t;
  2. double ey=ansy+(rand()*2-RAND_MAX)*t;

其中 \(ansx,ansy\) 为当前最优决策.

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

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

第二步可以这么实现:

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

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

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

UPD:Linux 环境下 clock() 的单位是微秒

JSOI2004 平衡点

本题的权值函数为系统重力势能之和,能量越低越稳定,因此权值低的为更优解.

我选择调 srand,用 CTHOIissb 在 \(233\) 进制意义下的哈希值过了,难绷

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. using namespace std;
  4. int n;
  5. struct node{
  6. int x,y,w;
  7. }a[2001];
  8. double ansx,ansy,answ;
  9. inline double energy(double x,double y){
  10. double r=0,dx,dy;
  11. for(int i=1;i<=n;++i){
  12. dx=x-a[i].x;
  13. dy=y-a[i].y;
  14. r+=sqrt(dx*dx+dy*dy)*a[i].w;
  15. }
  16. return r;
  17. }
  18. void sa(){
  19. double t=3000,down=0.996;
  20. while(t>1e-15){
  21. double ex=ansx+(rand()*2-RAND_MAX)*t;
  22. double ey=ansy+(rand()*2-RAND_MAX)*t;
  23. double ew=energy(ex,ey);
  24. double de=ew-answ;
  25. if(de<0){
  26. ansx=ex;ansy=ey;answ=ew;
  27. }
  28. else if(exp(-de/t)*RAND_MAX>rand()){
  29. ansx=ex,ansy=ey;
  30. }
  31. t*=down;
  32. }
  33. }
  34. unsigned long long _hash(string x){
  35. unsigned long long ans=0;
  36. for(char i:x){
  37. ans=ans*233+i;
  38. }
  39. return ans;
  40. }
  41. int main(){
  42. int st=clock();
  43. srand(_hash("CTHOIissb"));
  44. cin>>n;
  45. for(int i=1;i<=n;++i){
  46. cin>>a[i].x>>a[i].y>>a[i].w;
  47. ansx+=a[i].x;
  48. ansy+=a[i].y;
  49. }
  50. ansx/=n,ansy/=n;
  51. answ=energy(ansx,ansy);
  52. while(clock()-st<=1000*980) sa();
  53. printf("%.3lf %.3lf",ansx,ansy);
  54. }

[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. 配置Sprig security后Post请求无法使用

    在学习过程中发现在配置完Spring security后,Post请求失效,无法增删改数据,这里可以通过在Spring Security 的Config类中增加 也可以自定义csrf,不过目前还不是很 ...

  2. 《最新出炉》系列入门篇-Python+Playwright自动化测试-55- 上传文件 (非input控件)- 中篇

    1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.上传文件的API(非input ...

  3. 【转载】 Linux 设置CPU Performance模式

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/zaf0516/article/detail ...

  4. 在 MindSpore 中 dataset_sink_mode 的设置对算法的性能有多少影响呢???

    参考代码: https://www.cnblogs.com/devilmaycry812839668/p/14971668.html dataset_sink_mode=True  时,我们可以理解是 ...

  5. aarch64/arm_v8 环境下编译Arcade-Learning-Environment —— ale-py —— gym[atari]的安装

    aarch64架构下不支持gym[atari]安装,因此我们只能在该环境下安装gym,对于atari环境的支持则需要源码上重新编译,也就是本文给出的下面的方法: 源码下载: https://githu ...

  6. baselines算法库common/retro_wrappers.py模块分析

    retro_wrappers.py模块代码: from collections import deque import cv2 cv2.ocl.setUseOpenCL(False) from .at ...

  7. 多线程之interrupt与优雅停止一个线程

    1.背景 在实际开发中,我们可能会遇到终止某个线程的场景, 比如不断扫描数据库的发货订单时,这时候需停止扫描, 当然我们不能把程序关了,我们只希望停止扫描数据库这一个线程, 那么应该怎么办了? 这就可 ...

  8. LLM大模型部署实战指南:Ollama简化流程,OpenLLM灵活部署,LocalAI本地优化,Dify赋能应用开发

    LLM大模型部署实战指南:Ollama简化流程,OpenLLM灵活部署,LocalAI本地优化,Dify赋能应用开发 1. Ollama 部署的本地模型() Ollama 是一个开源框架,专为在本地机 ...

  9. 2023 CCPC 女生题解

    gym B. 终焉之茧 \(\star\) 显然两个维度分别做 单谷函数,起始点 \(A\) 是一个端点.一个 naive 的想法是三分目标点 \(B\),但交互次数会超.二分关于 \(B\) 对称点 ...

  10. 让你的C程序,可以自动更新版本信息

    一.软件管理 稍微上点规模的软件开发往往周期都非常长, 中间会产生很多临时版本, 这些临时版本往往会有各种各样的bug, 由于项目参与的人员众多.水平参差不齐, 软件分支众多.功能复杂, 经常会有各种 ...