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

模拟退火有几个参数:初始温度(\(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. 题解:P10329 [UESTCPC 2024] Add

    Add 题意 将序列进行一系列的操作,输出对 \(a_{1}\) 的期望值. 题目中操作说的比较明了,再次就不特殊声明了. 思路 据题意所知,每一个 \(n\) 应该对应了一个固定的答案. 于是我就想 ...

  2. 【教程】运行所选代码生成器时出错:“无法解析依赖项。"EntityFramework 6.4.4" 与 ' EntityFramework.zh-Hans 6.2.0 约束:EntityFramework(=6.2.0)'不兼容。"

    添加包含视图的控制器 执行以上添加"包含视图的MVC5控制器(使用Entity Framework)时报错 解决方案 在解决方案资源管理器中找到packages.config 注释掉Enti ...

  3. Linux 安装LibreOffice及常见问题解决

    Linux 安装LibreOffice及常见问题解决 一 .在官网下载对应的压缩包 官网地址:https://www.libreoffice.org/download/download/ 选择Linu ...

  4. 【Vue】Re13 CLI(Command Line Interface)

    一.What is CLI Command Line Interface 命令行接口 但是说是命令行界面,在官方又被称为脚手架 一个单词三个意思,所以令人困惑 但是根据实际意义用途来说就是帮助开发者更 ...

  5. 代码随想录Day3

    203.移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 . 示例 1: 输入:head = [1 ...

  6. 元学习的经典文献:S. Thrun - 1998 - LEARNING TO LEARN: INTRODUCTION AND OVERVIEW

    地址: https://link.springer.com/chapter/10.1007/978-1-4615-5529-2_1

  7. 两个 RTX2070 super 显卡 可不可以通过 nvlink交换机 进行P2P通信 呢? (答案: 可以)

    以前转载了一篇文章:    https://www.cnblogs.com/devilmaycry812839668/p/12370685.html 对于里面的结果总感觉有所怀疑,于是斥巨资购入两个 ...

  8. 零基础学习人工智能—Python—Pytorch学习(二)

    前言 数学的学习跟数学的计算是要分开的,现在回头再去看大学的高数和线性代数,如果只是学习的话,其实一门课程3天,也就学完了. 学校的课程之所以上那么久,其实是为了考试,也就是为计算准备的.计算有意义的 ...

  9. JNA使用入门

    JNA即Java Native Access. 官方主页 代码仓库 官方样例 maven中心仓库主页 官方文档 Getting Started Functional Description. Mapp ...

  10. 解决Perforce lua文件utf-8 with bom

    设置typemap,将lua文件定义为unicode