模拟退火学习笔记

article/2025/10/6 11:54:04

目录

  • 关于模拟退火的简言
  • 思路
  • 具体实现
  • 总结

关于模拟退火的简言

模拟退火,一种著名的神奇玄学算法,因为正确性是靠随机来保证的,所以是AC纯看rp。但是因为其思路的优越性,正确率并不低。再很多题目都不失为一种优秀的算法。甚至在有的题目中可以成为正解,比如有无限种情况,且需要求近似解的话,通常其他算法无法求出无限的情况,那么模拟退火就是唯一的办法。

思路

模拟退火的思路,就像前面说的那样,玄学。每次在当前状态的情况下,根据随机数,随机生产下一个状态,再根据一定的概率接受新的解。至于为什么会接受更劣的解呢?因为很多题目的答案可能是多峰函数。如下面这张图:

在这里插入图片描述
假如我们不接受劣解的话,一开始如果进入了左部分,很显然就找不到右部分的正解。所以我们要以一定的概率走出当前的局部最优解,去寻找全局最优解。

接下来我们进入到模拟退火的具体实现,首先,我们引入几个参数: E m a x E_{max} Emax ,当前找到的最优解 , E v E_{v} Ev ,当前找到的新解, E u E_u Eu 上一个选择的节点 Δ E \Delta E ΔE 表示当前找到的新节点与当前最优解的差即 E m a x − E v E_{max}-E_v EmaxEv 。初温 T s T_{s} Ts 当前温度 T T T ,末温 T t T_{t} Tt ,温度变动量 Δ \Delta Δ

对于每个参数的初值,我们通常将初温设为一个较大的数(如3000~4000), Δ \Delta Δ 设为一个略小于1的数(如0.997) ,末温设为一个非常接近于0的数(如1e-18)。我们每次从初温开始,每次将当前温度乘上温度变量求得当前温度( T = T s ∗ Δ T = T_s*\Delta T=TsΔ),再根据当前的温度,随机求出一个新解。

模拟退火的精髓就在于接受劣解,那我们应该如何接受这个新解呢?这时我们就要引入一个新原则Metropolis接受准则 。关于这个原则的证明,就不给出了因为太难了,我不会。我们就只分析它的结论。假设我们当前要求的是最大值,如果新解大于全局最优解,就接受这个新解。如果这个解劣于当前的最优解,那么设 Δ E = E v − E m a x \Delta E = E_v - E_{max} ΔE=EvEmax ,那么接受新解的概率就是 e x p ( Δ E T ) exp(\frac{\Delta E}{T}) exp(TΔE) ,对于这个式子的理解,首先因为 Δ E \Delta E ΔE 肯定是一个负数,所以他的差距越大,说明解越劣。接受概率也越低。而又因为负数的原因,T 越大的话 Δ E \Delta E ΔE 越大,所以接受概率也是越高的。而对于这里的exp,是一种高等数学里以自然常数e为底的指数函数。其的函数图像如下:
在这里插入图片描述
通过这张图我们可以发现,他的函数性质是单调上升+值总是为0。而这就非常符合我们的需求,值越大接受概率越高且值不为负数。

具体实现

前面口胡完了,下面就是模拟退火的具体实现。下面我们先找一道模拟退火的经典例题,P1337 [JSOI2004] 平衡点 / 吊打XXX,它的题意就是求出一个点的坐标,使得所有点达成平衡。很明显,它的可行的状态有无限多种,所以模拟退火就是不错的解法。

模拟退火的第一步,也是影响其时间复杂度与正确率最大的一步。——设置初始参数。我们需要根据题目每次判断新解的时间与题目要求的最大时间,根据这些综合出我们的初始参数。因为模拟退火是一种玄学算法,所以跑的越多肯定越优。而这一题中,显然判断一个点是否平衡,显然需要 O ( n ) O(n) O(n) 判断计算每个点的能量。所以我们可以将调参数小一点。

然后就是模拟退火的理论实现,首先我们需要每次在当前解的情况下求得一个新解,这个新解一般亲下,既要与当前解有关联,也要与当前温度有关联。说以一般随机出一个值,在原状态下处理。然后再根据上面提到的原则一定概率接受这个新解就可以了。

#include<bits/stdc++.h>
using namespace std;
double down=0.9995;//降温系数
double ansx,ansy,ans=100000000000000;//答案所在的位置与值
const int N=100010;
int n;
struct node{int weight,x,y;
}a[N<<1];
double find(double xx,double yy){//判断新解的答案double sum=0;for(int i=1;i<=n;i++){double chax=xx-a[i].x;double chay=yy-a[i].y;sum+=(sqrt(chax*chax+chay*chay))*a[i].weight;//计算绳子的势能//物重一定,绳子越短,重物越低,势能越小 //势能又与物重成正比 }return sum;//当前点的势能,即当前新解的答案 
}
void sa(){//sa 是 simulate_anneal 的简写//ex ey 表示新解 ,xx yy 表示上一轮的解 ans 表示当前的最优解double xx=0,yy=0;//设定一个初值,如果做多次模拟退火的话设为上一次的最优解double T=3070;//T是初温,设为这个数ddddwhile(T>1e-15){//设定末温double ex=xx+(rand()*2-RAND_MAX)*T;double ey=yy+(rand()*2-RAND_MAX)*T;//这里这么写是因为我们需要随机出负数,但rand并没有这个功能//而rand的范围是0~RAND_MAX 上面这样写就成了 -RAND_MAX~RAND_MAXdouble now_ans=find(ex,ey);//判断新解的答案double delans=now_ans-ans;//计算当前点的答案与最优解的差if(delans<0){//小于0说明答案更优ansx=ex;ansy=ey;ans=now_ans;xx=ex;yy=ey;}else if(exp(-delans/T)*RAND_MAX>rand()){//劣解根据一定概率接受xx=ex;yy=ey;}T*=down;//降温}
}
int main(){srand(time(NULL));//设定一个随机种子,其实有的时候用mt19937也是一个好选择cin>>n;for(int i=1;i<=n;i++){cin>>a[i].x>>a[i].y>>a[i].weight;}sa();printf("%.3lf %.3lf",ansx,ansy);
}

此贴完…了一半。你会发现你兴致冲冲的打完代码后一交,成功收获了WA,这就是因为模拟退火的玄学性质,这是我们就需要使用到调参,根据当前代码的所用时间,适当的调低降温参数或是提高初温等(其实值有修改降温参数才会有明显的区别)。或是可以多跑几遍模拟退火。然后经过不断的尝试与修改,我们终于收获了AC。

总结

模拟退火的本质就是一种随机玄学算法,所以就注定了它的正确性也是玄学的,所以我们在考场上在正解另有其他的情况下尽量少用,但是如果想不出正解的话,他也不失为一种优秀的骗分方式(万一你rp爆棚,碾压表算了呢)。但是在考场上就没有评测机这种东西帮你调试参数,你只能自己造数据,自己测试调参。所以一定要预留一定的时间,不要卡的太死(除非你用的是一个超级老爷机)。

完结撒花✿✿ヽ(°▽°)ノ✿这次真的完了


http://chatgpt.dhexx.cn/article/TeFa8mFQ.shtml

相关文章

模拟退火

模拟退火 1. 模拟退火原理 原理 模拟退火&#xff1a;是一种随机算法&#xff0c;用于解决最优化问题。要求求解的问题对应的函数要有连续性。模拟退火算法是模拟物理过程&#xff0c;有如下参数&#xff1a; &#xff08;1&#xff09;温度t&#xff1a;即步长。分为初始温度…

VS2017 下载离线MSDN文档

VS2017 下载离线MSDN文档 点开帮助窗口的时候发现没有添加和删除帮助内容选项。处理方法如下&#xff1a; 1.打开vs2017安装包&#xff0c;如果你找不到安装包&#xff0c;可在相应你下载vs2017的浏览器上找到下载内容&#xff0c;然后点击在文件夹中显示&#xff0c;找到安装包…

vs 2017官网下载、QT下载

QT官网下载地址&#xff1a;https://download.qt.io/archive/qt/https://download.qt.io/archive/qt/Visual Studio 2017 15.9 Release Notes | Microsoft DocsRelease notes for the latest features and improvements in Visual Studio 2017 v15.9. Plan better, code togeth…

VS2017下载更新

一&#xff1a;官网地址 https://www.visualstudio.com/zh-hans/downloads/ 二&#xff1a;下载vs下载器 比如我们将它下载放在C:\Users\baijinwen\Downloads\vs_community.exe 三&#xff1a;下载离线安装文件 我们希望将离线安装文件下载到H:\vs2017文件夹&#xff0c; …

VS2017下载安装C#版本jieba库

先去https://www.nuget.org/downloads官网下载页面下载最新的nuget&#xff0c;双击运行。 出现Nuget包管理器&#xff0c;调出控制台。 Packages页面下搜索jieba&#xff0c;点击第一个jieba.NET。 先将Dependencies下的packages下载安装好&#xff0c;如果dependencies对应的…

vs2017怎么安装python_vs2017怎么添加python

1、Python环境的搭建&#xff1a; 这里我选择的是Anaconda可以傻瓜式的帮我们将python环境搭建完毕&#xff0c;贴上Anaconda的下载地址&#xff1a;https://www.anaconda.com/download/#download 选择适合的版本下载即可&#xff0c;我这选择的Python3.6 version 64位的&#…

关于Visual Studio 2017安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法

Visual Studio 2017中的安装问题详细解决方法 1.VS2017下载地址&#xff1a; https://my.visualstudio.com/Downloads?qvisual%20studio%202017&wt.mc_idomsftvscom~older-downloads 2.这里有社区版、企业版、专业版等&#xff0c;一般选择社区版&#xff08;免费版&…

最全的VS 2017下载与安装

#Visual Studio 2017下载与安装 Microsoft Visual Studio&#xff08;以下简称VS&#xff09;&#xff0c;是微软公司开发的一系列工具包产品&#xff0c;满足多种语言开发&#xff0c;包括&#xff1a;C、C、C#、F#等&#xff0c;适用于微软支持的所有平台。 目前VS更新到2019…

VS2017离线下载及安装方式

vs2017下载 目前微软官网提供Visual Studio 2017在线安装版本&#xff0c;对于离线安装只提供说明。 Visual Studio 2017官网提供四个版本&#xff0c;这里个人学习&#xff0c;所以选择社区版的&#xff0c;下面说的也是社区版的安装步骤。 一、离线下载器下载 在微软官网h…

vs2017如何下载?

visual studio2017的下载与安装 visual studio是一款非常强大的软件。相信大家都知道vs是什么了,我就不在这里介绍了。 不过,大家可能会在visual studio的下载上遇到瓶颈,没关系,我们一步一步来吧! 首先,进入下面的网址: https://visualstudio.microsoft.com/vs/whatsn…

关于Google身份验证器、基于时间的一次性密码 (TOTP)算法的初步了解

一、Google Authenticator 1、概述 Google Authenticator是基于双因素身份验证 ( 2FA ) 的应用程序&#xff0c;有助于识别用户身份并确认用户声称自己是谁以及他是否真的是这个人。 当您启用两步验证&#xff08;也称为双重身份验证&#xff09;时&#xff0c;您会为您的帐户…

深度学习--十折交叉验证

用scikit-learn来评价模型质量&#xff0c;为了更好地挑拣出结果的差异&#xff0c;采用了十折交叉验证&#xff08;10-fold cross validation&#xff09;方法。 本程序在输入层和第一个隐含层之间加入20%Dropout 采用十折交叉验证的方法进行测试。 # dropout in the input …

tensorflow2 交叉验证

交叉验证在fit()函数的参数里边&#xff0c;完整参数传送 https://blog.csdn.net/Forrest97/article/details/106635664 fit()里边相关交叉验证的参数 validation_datatest&#xff0c;就是自己划分好的测试集validation_steps&#xff0c; 验证样本总数 Total validation S…

验证的方法

一、概述 在开展验证时有一整套的工具箱&#xff0c;根据设计的特点选用不同的验证方法&#xff0c;最终取得满意的效果。实际的验证工作中&#xff0c;需要通过多种语言、方法、工具实现验证&#xff0c;比如仿真验证会协同形式验证一同来完善功能覆盖率&#xff0c;也有可能…

两步验证: 使用Python接入Google Authentiator

Google Authenticator 文章目录 Google Authenticator简介原理HOTPTOTP 实现生成密钥计算时间片HMAC-SHA1运算生成二维码校验 使用参考资料 简介 用户常常会在不同的网站使用相同的密码&#xff0c;一但一个网站账户的密码泄露&#xff0c;就会危及到其它使用相同密码的账户。…

用Abp实现两步验证(Two-Factor Authentication,2FA)登录(三):免登录验证

文章目录 原理修改请求报文配置JwtBearerOptions生成Token校验Token修改认证EndPoint修改前端登录登出 最终效果项目地址 免登录验证是用户在首次两步验证通过后&#xff0c;在常用的设备&#xff08;浏览器&#xff09;中&#xff0c;在一定时间内不需要再次输入验证码直接登录…

两步教你在Vue中设置登录验证拦截!

Hello&#xff0c;你好呀&#xff0c;我是灰小猿&#xff0c;一个超会写bug的程序猿&#xff01; 今天在做vue和springboot交互的一个项目的时候&#xff0c;想要基于前端实现一些只有登录验证之后才能访问某些页面的操作&#xff0c;所以在这里总结一下实现该功能的一个解决方…

HTTPS实战之单向验证和双向验证

&#xff08;全文太长&#xff0c;太懒不想看&#xff0c;-_-b 那就直接拉到底部看总结 &#xff09; 前面的文章中&#xff0c;提到了&#xff0c;https是在TCP协议与http之间加了一个控制安全传输的SSL协议&#xff0c;也就是说&#xff0c;直接运行在TCP之上的HTTP是普通的…

验证基础-验证方法

目录 动态仿真 静态检查 虚拟模型 硬件加速 效能验证 UVM简介 验证的方法主要分为六种&#xff1a; ※ 动态仿真&#xff08;dynamic simulation&#xff09; ※ 静态检查&#xff08;formal check&#xff09; ※ 虚拟模型&#xff08;virtual prototype&#xff09; ※…

用Abp实现两步验证(Two-Factor Authentication,2FA)登录(一):认证模块

文章目录 原理用户验证码校验模块双因素认证模块改写登录项目地址 在之前的博文 用Abp实现短信验证码免密登录&#xff08;一&#xff09;&#xff1a;短信校验模块 一文中&#xff0c;我们实现了用户验证码校验模块&#xff0c;今天来拓展这个模块&#xff0c;使Abp用户系统支…