模拟退火

news/2024/9/23 3:16:34/文章来源:https://www.cnblogs.com/alloverzyt/p/18332298

模拟退火

必须要单独开一个专题来讲模拟退火了。

看到身边很多同学写的模退都是不标准的,步长没有随温度的降低而减小,只能叫随机爬山。

系统的学习模退是跟着 Acwing 的 yxc,他写的模退给人一看就有一种豁然开朗,神清气爽的感觉,让你惊叹天下竟然还有如此精妙的算法。

是的,优雅的模退写出来就是令人心旷神怡,而不是某些同学暴力算法的代言,像一坨屎山一样。


image

一谈起模退,我脑中就回想起这幅经典的动图,如他的定义一般精妙:

而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。

可以发现波动程度逐渐变小,最后趋于稳定。

例题:星星还是树

其实就是费马点。

核心代码:

void simulate_anneal(){pdd cur(rand(0,1e4),rand(0,1e4));// 初始点(当前点)for (double t = 1e4; t > 1e-4; t *= 0.95){// 初始温度,终止温度,温度 * 衰减系数pdd rand_point(rand(cur.x - t,cur.x + t),rand(cur.y - t,cur.y + t));double delta = calc(rand_point) - calc(cur);if (exp(-delta / t) > rand(0,1)) cur = rand_point; // 满足条件则跳到新点}
}

关于 rand 函数

yxc 老师很巧妙的处理的直接使用rand()值域过小的问题。

double random(double l,double r){return (double) rand() / RAND_MAX * (r - l) + l;
}

当然我们有性能更好的 mt19937 也完全可以使用

mt19937 rnd(random_device{}());
int random(int l,int r){return rnd()%(r-l+1)+l;
}

关于 exp 函数

image

众所周知,模拟退火很重要的一个特点就是对于不优的解也以一定概率接受,防止陷入局部最优解的深坑中,定义 \(delt=contmeprorary-ans\) ,如果 \(ans\) 的值越小越优,那么以 \(exp(-delt/T)\) 的概率接受该解,注意如果 \(delt\) 为负数,则该函数值一定大于 \(1\) ,意味着一定接受。为整数则以一定概率接受。

关于 clock 函数

众做周知,我们在时间允许的情况下我们希望进行经可能多的模拟退火次数以保证答案的正确性,clock()/CLOCK_PER_CEC 可以帮我们解决这个问题。

for(;(double)clock()/CLOCK_PER_SEC;){fire();
}

完结撒花✿✿ヽ(°▽°)ノ✿

void fire(){double T=1e9,d=0.997;int x=rnd();ans=min(ans,check(x));while(T>1){//	cout<<x<<endl;int nx=x+random(-T,T);long long temp=check(nx);double delt=temp-ans;if(exp((double)-delt/T)*T>random(0,T)){x=nx;}ans=min(temp,ans);T*=d;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/774057.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

成为Apache SeaTunnel贡献者的N种方式

如何参与开源贡献参与开源贡献的常见方法有多种:1)参与解答 在社区中, 帮助使用过程中遇到困难的人,帮他们解释框架的用法也算是一种贡献。 2)文档贡献 帮助框架来完善文档,比如说将英文文档翻译为中文,纠正文档里面的错误单词,这 是很多人参与开源贡献的第一步。 3)代…

构建个性化财务数据看板,免费可视化工具来助力

财务月度数据,作为企业经营的晴雨表,其重要性不言而喻。然而,面对海量、复杂的数据,如何快速提炼关键信息,形成直观易懂的洞察报告,成为了众多企业面临的挑战。随着技术的不断进步,可视化工具正逐步成为财务数据分析领域的得力助手,帮助企业轻松构建财务月度数据看板,…

企业级Scrum敏捷开发培训:推动团队高效运作

“企业级Scrum敏捷开发培训:推动团队高效运作”​ 在当今快速变化的商业环境中,企业必须不断创新和快速响应市场需求,以保持竞争优势。Scrum敏捷开发方法作为一种高效的项目管理框架,已被全球众多企业采用,用于提高团队协作和交付速度。为了帮助企业更好地理解和应用Scrum…

关于VMware workstation添加本地物理磁盘时候提示“未能为设备XX加载分区,权限不足,无法访问文件”的解决办法

前言:玩虚拟机这么久了,原先一直是直接初始化虚拟机的时候按照流程新建虚拟机硬盘,但是正常情况下虚拟机硬盘与物理机硬盘是隔离开的,无法直接相互访问 正常情况下 是安装vm tools来进行相互间文件传输,或者将物理磁盘上的文件拷贝到U盘,当插上U盘的时候选择连接到对应的…

记一个kvm虚拟器迁移后无法启动故障

参考 https://www.cnblogs.com/joshua317/p/18061002故障现象 kvm虚拟机从一台主机迁移至另外一台主机后启动失败 报错信息如下# Type "journalctl" to view system logs.使用命令查看错误信息 # Failed to mount /sysroot原因分析 CentOS系统启动时出现Failed to mo…

Win11系统C盘拒绝访问或打不开怎么办???

在使用Win11系统的时候,有用户可能会遇到C盘拒绝访问或者无法打开的情况,因此可能会感到困惑和无助。而这通常是由于权限设置问题或者其他系统错误导致的。不过,不必过于担心,因为这种情况通常可以通过一些简单的步骤来解决,一起来看看吧。C盘拒绝访问或打不开的解决方法方…

P9746 「KDOI-06-S」合并序列

mx练习赛搬的,虽然数据不咋样,但是一步步的优化思路确实值得一记。 P9746 合并序列 题目大意: 给你 \(n(1\le n \le 500)\) 个数 \(a_1,a_2,\ldots a_n\)(\(a_i < 512\))。每次可以选一个3元组 \((i,j,k)\),满足 \(i<j<k\),并且 \(a_i\oplus a_j\oplus a_k=0…

Day 23 - 模拟赛

百万富翁的第二次实验 题目描述 马克吐温有一本非常著名的小说《百万英镑》,这本小说中主角最后归还了百万英镑给两位富翁。但结果就是两位富翁依然有无穷的问题需要进行社会实验,于是,他们打算进行第二次社会实验。那就是不同财富值的人在一场舞会上会发生什么事情。为了满…

LeetCode 756. Pyramid Transition Matrix

原题链接在这里:https://leetcode.com/problems/pyramid-transition-matrix/description/ 题目: You are stacking blocks to form a pyramid. Each block has a color, which is represented by a single letter. Each row of blocks contains one less block than the row …

两个燃点,引爆在线教育平台数智化

人人都能消费数据,事事都能数据驱动,正在成为火花思维数智化升级下的日常,这也与火山引擎推出的企业数智化升级新模式不谋而合。关注 字节跳动数据平台公众号,回复“火花思维”,获取高清方案设计及产品资料 2017年,专注于少儿逻辑思维的在线教育品牌火花思维正式成立,依…

一个简单的遍历需求

今天开发一个前端遍历展示的接口,被前端怼了看图需求很简单多行展示 每行多个,可显示更多,每行可左右滑动为了图省事简单组装一下直接返回回去了,方便是真的方便,前端生气也是真的生气,可以简单对这个横向、纵向接口压缩一下横向空间上,可以取分页,前端自己传,无论是懒…

分享一个MySQL数据库表结构导出word文档最方便的方法

原文链接:https://blog.csdn.net/typ1805/article/details/83658708 1、使用的是MySQL-Front工具,这个工具使用非常方便,尤其是导出数据的时候,几百万的数据一两分钟就导完了,推荐使用。 MySQL-Front下载(只有3.93M):https://mysql-front.en.softonic.com/ 注:新版本和…