模拟退火

模拟退火是一种玄学的随机算法。当问题的方案数量极大(甚至趋近于无穷)而且并不是一个单峰函数的时候,用模拟退火求解。

模拟转移的过程

退火指的是一种金属热处理工艺,将金属缓慢加热到一定的温度,保持足够的时间然后以十一速度冷却,降低硬度。由于退火的规律引入了很多随机的因素,得到最优解的概率会大大增加。

如果新状态的解更优则修改答案,否则以一定概率接受新状态。

设当前温度为TTT,新状态和已知状态(由已知状态通过随机的方式得到)之间的能量差为ΔE\Delta EΔE 。(能量差总大于0)则修改最优解的概率为

P(ΔE)={1新状态更优e−ΔET新状态更劣{\large P(\Delta E)=\left\{\begin{matrix} 1~~~~~~~~~~~~~~~~~新状态更优 \\ e^{- \frac{\Delta E}{T} ~~~~~~~~~~~~~~~~~{\large 新状态更劣} } \end{matrix}\right. }P(ΔE)={1                 新状态更优e−TΔE​                 新状态更劣​

模拟降温的过程

设:初始温度T0T_0T0​,降温系数ddd,终止温度TkT_kTk​。

其中,T0T_0T0​是大正数,一般和数据范围有关。TkT_kTk​是一个接近000的正数

ddd是一个非常接近111但是小于111的正数。(根据我的做题经验,一般上需要不停的调ddd的大小进行控温,和机械公敌兰博的红温一样,一般上是0.9960.9960.996或者0.970.970.97)。这有关于查询的精度,有时候ddd的精度决定这题的分数,所以很重要。

首先让温度T=T0T=T_0T=T0​,然后按照上述步骤进行一次转移尝试。

再让T=d∗TT=d*TT=d∗T。如果T≤TkT\le T_kT≤Tk​,则模拟退火的过程结束。

为了使解更精确,我们通常不采用当前解作为答案,而是在模拟退火过程中维护遇到的所有最优解的值。通常可见到一道题跑了好几遍模拟退火。

//伪代码 -littlefools 2022.4.26
simulate_anneal(){随机一个初始点;for(double T=10000;T>1e-4;T=T*0.997){在当前点周围随机一个点;delta=function(new)-function(now);if() 跳到新点;  }
}

如何控时?

为了不让我们跑了好多遍的模拟退火变成TLETLETLE丢掉所有的分数,我们必须进行控时。在C++中有一个clock()clock()clock()函数,可以返回程序的运行时间。

while((double)clock()/CLOCKS_PER_SEC<MAX_TIME) simulate_anneal();

这样子就会一直跑模拟退火直到它的用时即将超出时间限制。一般都是1s1s1s,至于能不能找到就看RPRPRP了。

如何等概率操作?

double rand(double l,double r){return (double)rand()/RAND_MAX*(r-l)+l;//rand()/RAND_MAX 是在0-1范围内取一个概率。//*(r-l)+l 则可以得到[l,r]区间内等概率的一个点。
}

例题:[JSOI2004]费马点

有nnn个重物,每个重物系在一条足够长的绳子上。每条绳子自上而下穿过桌面上的洞,然后系在一起。图中XXX处就是公共的绳结。假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到地上),且忽略所有的摩擦。问绳结X最终平衡于何处。

文件的第一行为一个正整数n(1≤n≤1000)n(1≤n≤1000)n(1≤n≤1000),表示重物和洞的数目。接下来的nnn行,每行是333个整数:Xi.Yi.WiXi.Yi.WiXi.Yi.Wi,分别表示第iii个洞的坐标以及第iii个重物的重量。(−10000≤x,y≤10000,0<w≤1000-10000≤x,y≤10000, 0<w≤1000−10000≤x,y≤10000,0<w≤1000 ) 。输出最终平衡状态的(x,y)(x,y)(x,y)坐标。保留两位小数。

#include <bits/stdc++.h>
using namespace std;
int n,x[1000000],y[1000000],w[1000000];
double ansx,ansy,answ;
double energy(double xx,double yy){double r=0,ddx,ddy;for (int i=1;i<=n;i++){ddx=xx-x[i]; ddy=yy-y[i];r+=sqrt(ddx*ddx+ddy*ddy)*w[i];}return r;
}
void anneal(){for (double t=3000;t>1e-15;t*=0.997){//大于一个极小值double dx=ansx+(rand()*2-RAND_MAX)*t,dy=ansy+(rand()*2-RAND_MAX)*t;double ew=energy(dx,dy),delta=ew-answ;if (delta<0){ansx=dx;ansy=dy;answ=ew;} //此答案更优else if(exp(-delta/t)*RAND_MAX>rand()){ansx=dx;ansy=dy;}//否则以一定概率接受t*=0.996;//徐徐降温}
}
int main() {cin>>n;for (int i=1;i<=n;i++){scanf("%d%d%d",&x[i],&y[i],&w[i]);ansx+=x[i];ansy+=y[i];}ansx/=n;ansy/=n;answ=energy(ansx,ansy);for(int i=1;i<=5;i++) anneal();//需要跑多次模拟退火确定答案。printf("%.3lf %.3lf\n",ansx,ansy);return 0;
}

【总结】模拟退火算法(随机化)相关推荐

  1. 手把手教会你模拟退火算法

    今天终于用模拟退火过了一道题:CodeVS: P1344. 有 N ( <=20 ) 台 PC 放在机房内,现在要求由你选定一台 PC,用共 N-1 条网线从这台机器开始一台接一台地依次连接他们 ...

  2. matlab智能算法之模拟退火算法

    智能算法之模拟退火算法 1.起源 2.物理退火流程 2.1 加温过程 2.2 等温过程 2.3 冷却过程 2.4 组合优化与物理退化 3.原理 3.1 算法核心迭代 3.2 具体流程 4.案例 4.1 ...

  3. # 知识点学习——模拟退火算法

    模拟退火算法 打算补一下上一把牛客比赛的K题Solar Energy,需要模拟退火知识点的储备.打算速通以后出出看K题. 参考资料 感谢在网上分享学习心得的各位同学. 模拟退火学习笔记1 模拟退火学习 ...

  4. MATLAB模拟退火算法求解超市物流配送选址问题实例

    模拟退火算法编程问题实例: MATLAB模拟退火算法求解超市物流配送选址问题实例 在范围为(0,0)到(100,100)的矩形区域内,散布着40个连锁超市,各个连锁超市的坐标及需求量见表1.要求在该矩 ...

  5. 模拟退huo算法的特点_兄弟,退火吗?—— 初窥模拟退火算法

    模拟退火算法(Simulated annealing, SA)是一种基于蒙特卡罗(Monte Carlo)思想设计的,常用于在较大的解空间中搜索近似全局最优解的优化算法.本文将从模拟退火算法的历史.形 ...

  6. 2018-4-8模拟退火算法

    阅读资料来源: <智能优化算法以及matlab实现>第七章 [图文]智能优化算法_数学建模_王成章_模拟退火法_2011_百度文库 https://wenku.baidu.com/view ...

  7. HDU2899(二分查找+or+模拟退火算法)

    这道题其实是利用函数求导,判断求导后的函数是否大于零或者小于零,等于零情况,从而判断原函数的单调性,代入X求出函数的最小值. 模拟退火算法: 方法一:二分 #include<stdio.h> ...

  8. 【算法】模拟退火算法解决TSP问题的matlab实现

    [算法]模拟退火算法解决TSP问题的matlab实现 参考文章: (1)[算法]模拟退火算法解决TSP问题的matlab实现 (2)https://www.cnblogs.com/wenyehoush ...

  9. 机器学习(MACHINE LEARNING)MATLAB模拟退火算法【SA】

    文章目录 1 什么是智能优化算法 2 常用的智能优化算法 3 智能优化算法的特点 4 模拟退火算法 4.1 简介 4.1 工具箱(SA) 1 什么是智能优化算法 智能优化算法又称现代启发式算法,是一种 ...

  10. 大白话解析模拟退火算法

    一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解. ...

最新文章

  1. java三段式if_Java几种常用的断言风格你怎么选?
  2. Nibiru Open Day,OZO 遇见 DigiArtist 国际数字艺术展
  3. 将字符串转换为DateTime
  4. Git创建repository,以及clone,提交一个repository
  5. 何谓成功的软件架构设计
  6. 用过http api 发送邮件
  7. 小白 C 入门并发疯学习路线(书单)
  8. 文件传输工具WinSCP下载安装教程
  9. 网卡驱动程序igb和ixgbe
  10. 【财经期刊FM-Radio|2021年01月27日】
  11. 01、滤波器设计——LC滤波器设计
  12. PID调节之积分(I)调节
  13. java程序替换字符串里的中文括号为英文括号
  14. 几何分布的期望公式的推导
  15. 软件测试与软件开发的关系是怎样的?
  16. 将项目提交到码云时,异常: remote: [31mIncorrect username or password ( access token )[0m
  17. 【OpenCV 学习笔记】—— 基于拉普拉斯金字塔的图像融合原理以及C++实现【或许是全网最通俗易懂的讲解】
  18. GitModel数学建模 —— 动手学数理统计
  19. 企业网盘是高成本服务,低价网盘很难满足企业需求
  20. 无盘系统及服务器,无盘系统服务器的配置

热门文章

  1. 在html中常用于定义求婚,关于求婚的英文句子中英双译
  2. NEJ控件开发手册(转载)
  3. 华为升级android 8,即将升级Android 7.0,华为Mate 8用户有福了!
  4. 漫谈程序员系列 3D打印能打印出程序猿吗
  5. OSPF hello 数据包间隔
  6. layui table动态追加(删除)一行,并进行原始数据渲染
  7. vue页面实现语音播报
  8. 2022年Android Studio详细下载,安装使用教程
  9. django(10)
  10. python中nonetype object has no_为什么会出现这个?'NoneType' object has no attribute 'contet...