【总结】模拟退火算法(随机化)
模拟退火
模拟退火是一种玄学的随机算法。当问题的方案数量极大(甚至趋近于无穷)而且并不是一个单峰函数的时候,用模拟退火求解。
模拟转移的过程
退火指的是一种金属热处理工艺,将金属缓慢加热到一定的温度,保持足够的时间然后以十一速度冷却,降低硬度。由于退火的规律引入了很多随机的因素,得到最优解的概率会大大增加。
如果新状态的解更优则修改答案,否则以一定概率接受新状态。
设当前温度为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;
}
【总结】模拟退火算法(随机化)相关推荐
- 手把手教会你模拟退火算法
今天终于用模拟退火过了一道题:CodeVS: P1344. 有 N ( <=20 ) 台 PC 放在机房内,现在要求由你选定一台 PC,用共 N-1 条网线从这台机器开始一台接一台地依次连接他们 ...
- matlab智能算法之模拟退火算法
智能算法之模拟退火算法 1.起源 2.物理退火流程 2.1 加温过程 2.2 等温过程 2.3 冷却过程 2.4 组合优化与物理退化 3.原理 3.1 算法核心迭代 3.2 具体流程 4.案例 4.1 ...
- # 知识点学习——模拟退火算法
模拟退火算法 打算补一下上一把牛客比赛的K题Solar Energy,需要模拟退火知识点的储备.打算速通以后出出看K题. 参考资料 感谢在网上分享学习心得的各位同学. 模拟退火学习笔记1 模拟退火学习 ...
- MATLAB模拟退火算法求解超市物流配送选址问题实例
模拟退火算法编程问题实例: MATLAB模拟退火算法求解超市物流配送选址问题实例 在范围为(0,0)到(100,100)的矩形区域内,散布着40个连锁超市,各个连锁超市的坐标及需求量见表1.要求在该矩 ...
- 模拟退huo算法的特点_兄弟,退火吗?—— 初窥模拟退火算法
模拟退火算法(Simulated annealing, SA)是一种基于蒙特卡罗(Monte Carlo)思想设计的,常用于在较大的解空间中搜索近似全局最优解的优化算法.本文将从模拟退火算法的历史.形 ...
- 2018-4-8模拟退火算法
阅读资料来源: <智能优化算法以及matlab实现>第七章 [图文]智能优化算法_数学建模_王成章_模拟退火法_2011_百度文库 https://wenku.baidu.com/view ...
- HDU2899(二分查找+or+模拟退火算法)
这道题其实是利用函数求导,判断求导后的函数是否大于零或者小于零,等于零情况,从而判断原函数的单调性,代入X求出函数的最小值. 模拟退火算法: 方法一:二分 #include<stdio.h> ...
- 【算法】模拟退火算法解决TSP问题的matlab实现
[算法]模拟退火算法解决TSP问题的matlab实现 参考文章: (1)[算法]模拟退火算法解决TSP问题的matlab实现 (2)https://www.cnblogs.com/wenyehoush ...
- 机器学习(MACHINE LEARNING)MATLAB模拟退火算法【SA】
文章目录 1 什么是智能优化算法 2 常用的智能优化算法 3 智能优化算法的特点 4 模拟退火算法 4.1 简介 4.1 工具箱(SA) 1 什么是智能优化算法 智能优化算法又称现代启发式算法,是一种 ...
- 大白话解析模拟退火算法
一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解. ...
最新文章
- java三段式if_Java几种常用的断言风格你怎么选?
- Nibiru Open Day,OZO 遇见 DigiArtist 国际数字艺术展
- 将字符串转换为DateTime
- Git创建repository,以及clone,提交一个repository
- 何谓成功的软件架构设计
- 用过http api 发送邮件
- 小白 C 入门并发疯学习路线(书单)
- 文件传输工具WinSCP下载安装教程
- 网卡驱动程序igb和ixgbe
- 【财经期刊FM-Radio|2021年01月27日】
- 01、滤波器设计——LC滤波器设计
- PID调节之积分(I)调节
- java程序替换字符串里的中文括号为英文括号
- 几何分布的期望公式的推导
- 软件测试与软件开发的关系是怎样的?
- 将项目提交到码云时,异常: remote: [31mIncorrect username or password ( access token )[0m
- 【OpenCV 学习笔记】—— 基于拉普拉斯金字塔的图像融合原理以及C++实现【或许是全网最通俗易懂的讲解】
- GitModel数学建模 —— 动手学数理统计
- 企业网盘是高成本服务,低价网盘很难满足企业需求
- 无盘系统及服务器,无盘系统服务器的配置
热门文章
- 在html中常用于定义求婚,关于求婚的英文句子中英双译
- NEJ控件开发手册(转载)
- 华为升级android 8,即将升级Android 7.0,华为Mate 8用户有福了!
- 漫谈程序员系列 3D打印能打印出程序猿吗
- OSPF hello 数据包间隔
- layui table动态追加(删除)一行,并进行原始数据渲染
- vue页面实现语音播报
- 2022年Android Studio详细下载,安装使用教程
- django(10)
- python中nonetype object has no_为什么会出现这个?'NoneType' object has no attribute 'contet...