模拟退火算法及常见应用

article/2025/9/20 21:57:56

模拟退火

模拟退火( S i m u l a t e d A n n e a l i n g [ S A ] Simulated ~~Annealing[SA] Simulated  Annealing[SA])的出发点是基于物理中固体物质的退火过程与一般组合优化问题之间的相似性。模拟退火算法是一种通用的优化算法,其物理退火过程由加温过程、等温过程、冷却过程这三部分组成。

模拟退火算法是基于 M o n t e − C a r l o Monte-Carlo MonteCarlo迭代求解策略的一种随机寻优算法,从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。

算法流程

每次随机出一个新解,设当前温度为 t t t、新解对应的函数值与当前最优解的差为 Δ E \Delta E ΔE。如果这个解更优即 Δ E < 0 \Delta E<0 ΔE<0则接受它为当前最优解;否则以一定的概率 e Δ E t e^{\frac{\Delta E}{t}} etΔE接受它为当前可能最优解,即随机出的概率小于 e Δ E t e^{\frac{\Delta E}{t}} etΔE

在这里插入图片描述

算法伪代码:

Status SA() {t = 初始温度;delta = 降温参数;eps = 最终停止的阈值;ans = 答案, tmp = 可能最优状态;while(t > eps) {nxt = 从当前找到的可能最优状态随机找到的一个状态;del = f(nxt) - f(ans);if (del < 0) {ans = tmp = ans;  //更新最优解和可能最优解}else if (exp(-del / t) * RAND_MAX > rand()) {  //实际上是rand()*1.0 / RAND_MAX,这里是减少浮点数计算误差tmp = nxt;   //以一定概率取得非最优解然后保存尝试}t *= delta;}return ans;
}

如何得到尽可能精确的解

  • 随机数种子设置:可以先设置一个大质数,然后随机几次随机数种子,如 s r a n d ( 100000007 ) , s r a n d ( r a n d ( ) ) srand(100000007),srand(rand()) srand(100000007),srand(rand()),注意不能 s r a n d ( t i m e ( 0 ) ) srand(time(0)) srand(time(0))

  • 初始最优解:一般取给出所有初始状态的一个平均值状态,更易得到最优解。

  • 初始温度 T T T的设置:大部分题目设置为 100 100 100都可以过,但是有的范围比较大,一般不超过这个范围的初始温度都可以尝试,自行调整。

  • 温度停止阈值 e p s eps eps的设置,一般设置到 1 e − 10 1e^{-10} 1e10左右即可,如果不行就设置到 1 e − 14 1e^{-14} 1e14(前提不超时),自行调整。

  • 降温参数 d e l t a delta delta的设置:一般来说降温参数取 [ 0.93 , 0.99 ] [0.93,0.99] [0.93,0.99]即可,如果不行就调整到 [ 0.993 , 0.999 ] [0.993,0.999] [0.993,0.999](前提不超时),自行调整。

  • 在不超时的前提下多跑几遍模拟退火,即在前面跑出最优解的基础上再去跑模拟退火。

时间复杂度

时间复杂度和上述的三个影响解的参数 T , e p s , d e l t a T,eps,delta T,eps,delta息息相关,因此得出结论:玄学复杂度。

应用一:求函数的最值

HDU-2899

现在有方程 f ( x ) = 6 ∗ x 7 + 8 ∗ x 6 + 7 ∗ x 3 + 5 ∗ x 2 − k ∗ x ( 0 ≤ x ≤ 100 ) f(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-k*x (0 \leq x \leq 100) f(x)=6x7+8x6+7x3+5x2kx(0x100),每次给出 k k k,求该函数在 [ 0 , 100 ] [0,100] [0,100]的最小值。

代码

需要注意的是,因为本题有定义域的限制,我们在随机寻找最优解的时候应该限制在定义域中。

const double T = 100;
const double delta = 0.996;
const double eps = 1e-14;
double y;double f(double x) {return 6.0 * pow(x, 7.0) + 8.0 * pow(x, 6.0) + 7.0 * pow(x, 3.0) + 5.0 * pow(x, 2.0) - y * x;
}double SA() {double t = T, ans = 50;double tmp = ans;while (t > eps) {double nxt = tmp + (rand() * 2.0 - RAND_MAX) * t;while (nxt < 0) nxt = tmp + (rand() * 2.0 - RAND_MAX) * t;double del = f(nxt) - f(ans);if (del < 0) {ans = tmp = nxt;} else if (exp(-del / t) * RAND_MAX > rand()) {tmp = nxt;}t *= delta;}return ans;
}void solve() {int T;scanf("%d", &T);while (T--) {srand(100000007);srand(rand()), srand(rand());scanf("%lf", &y);printf("%.4lf\n", f(SA()));}
}

应用二:求费马点

POJ-2420

给出平面内的 n n n个点找出费马点,即找到一个点使得该点到其他所有点的距离之和最小,输出这个最小距离。

代码

const double eps = 1e-14;
const double dinf = 1e300;
const double delta = 0.993;
const double T = 100;struct Point {double x, y;Point(double a = 0, double b = 0) : x(a), y(b) {}
} p[105];int n;
Point s;double dis(Point a, Point b) {return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}double f(Point cur) {double ans = 0;for (int i = 0; i < n; i++) {ans += dis(cur, p[i]);}return ans;
}double SA() {double t = T, ans = dinf;Point tmp = s;while (t > eps) {Point nxt(tmp.x + (rand() * 2.0 - RAND_MAX) * t, tmp.y + (rand() * 2.0 - RAND_MAX) * t);double res = f(nxt);double del = res - ans;if (del < 0) {ans = res;s = tmp = nxt;} else if (exp((ans - res) / t) * RAND_MAX > rand()) {tmp = nxt;}t *= delta;}return ans;
}void solve() {srand(100000007);srand(rand()), srand(rand());scanf("%d", &n);double sumx = 0, sumy = 0;for (int i = 0; i < n; i++) {scanf("%lf%lf", &p[i].x, &p[i].y);sumx += p[i].x, sumy += p[i].y;}s = Point(sumx / n, sumy / n);printf("%.0lf\n", SA());
}

应用三:求最小球覆盖

Gym101981D - Country Meow

给出三维坐标系的若干个点,在坐标系范围内找到一个点作为圆心,在给出的点中距离它最远的点的距离作为半径作出一个球,该球内包含了其余所有的给定点。

代码

const double T = 100000;
const double delta = 0.998;
const double eps = 1e-14;
const double dinf = 1e300;struct Point {double x, y, z;Point(double a = 0, double b = 0, double c = 0) : x(a), y(b), z(c) {}
} p[105];int n;
Point s;double dis(Point a, Point b) {return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z));
}int f(Point cur) {int ans = 0;for (int i = 1; i < n; i++) {if (dis(cur, p[i]) > dis(cur, p[ans])) {ans = i;}}return ans;
}double SA() {double t = T, ans = dinf;Point tmp = s, nxt;while (t > eps) {nxt.x = tmp.x + (rand() * 2 - RAND_MAX) * t;nxt.y = tmp.y + (rand() * 2 - RAND_MAX) * t;nxt.z = tmp.z + (rand() * 2 - RAND_MAX) * t;int k = f(nxt);double res = dis(nxt, p[k]);double del = res - ans;if (del < 0) {ans = res;s = tmp = nxt;} else if (exp(-del / t) * RAND_MAX > rand()) {tmp = nxt;}t *= delta;}return ans;
}void solve() {srand(23333333);srand(rand()), srand(rand());scanf("%d", &n);double sumx = 0, sumy = 0, sumz = 0;for (int i = 0; i < n; i++) {scanf("%lf%lf%lf", &p[i].x, &p[i].y, &p[i].z);sumx += p[i].x, sumy += p[i].y, sumz += p[i].z;}s = Point(sumx / n, sumy / n, sumz / n);printf("%.8lf\n", SA());
}

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

相关文章

模拟退火算法——理论篇

模拟退火算法&#xff08;Simulated Annealing&#xff0c;SA)是模拟物理退火求解组合问题的算法&#xff0c;核心是要理解Metropolis 采样算法&#xff0c;具有算法简单、适用范围广、可靠性高等特点。 图片来自网络 1 算法理论 模拟退火算法来源于固体退火原理&#xff0c;…

模拟退火算法参数分析

模拟退火算法参数分析 一 模拟退火算法介绍 模拟退火算法是一种寻找全局最优解的优化方法&#xff0c;核心思想就是以一定概率接收差解&#xff0c;并且这个概率会随着退火温度逐渐降低。一个比较形象的比喻是&#xff1a;一个锅底凹凸不平有很多坑的大锅&#xff0c;晃动这…

模拟退火算法(一):基础篇

模拟退火算法 提出问题青铜级别解法&#xff08;盲目搜索&#xff09;王者级别解法&#xff08;启发式搜索&#xff09;操作方法需要研究的地方如果这个优化问题有约束条件怎么办&#xff1f;这个C~t~怎么设置&#xff1f;t的变化在编程里面怎么实现&#xff1f;什么时候停止搜…

智能算法系列之模拟退火算法

本博客封面由ChatGPT DALLE 2共同创作而成。 文章目录 前言1. 算法思想2. 细节梳理2.1 超参数的选择2.2 一些trick 3. 算法实现3.1 问题场景3.2 从算法角度分析3.3 python实现 代码仓库&#xff1a;IALib[GitHub] 前言 本篇是智能算法(Python复现)专栏的第二篇文章&#xff0c…

你也能看懂的:退火算法

模拟退火算法来源于固体退火原理&#xff0c;是一种基于概率的算法&#xff0c;将固体加温至充分高&#xff0c;再让其徐徐冷却&#xff0c;加温时&#xff0c;固体内部粒子随温升变为无序状&#xff0c;内能增大&#xff0c;而徐徐冷却时粒子渐趋有序&#xff0c;在每个温度都…

优化算法-模拟退火算法

一、概念 模拟退火算法(SA)来源于固体退火原理&#xff0c;是一种基于概率的算法。 将固体加温至充分高的温度&#xff0c;再让其徐徐冷却&#xff0c;加温时&#xff0c;固体内部粒子随温升变为无序状&#xff0c;内能增大&#xff0c;分子和原子越不稳定。而徐徐冷却时粒子…

模拟退火算法的优化

优化模拟退火算法 作为现代算法的一种&#xff0c;模拟退火算法是一种用降低搜索的覆盖面积来提高运算速度的算法&#xff0c;适用于解决各种优化类问题。它利用了物理学中一个常见的原理&#xff1a;当物体具有一定的温度时&#xff0c;假设它内部含有的能量为E(I),那么物体从…

模拟退火算法的改进

模拟退火算法的物理模型 在物理退火过程中&#xff0c;当固体的温度很高时&#xff0c;内能较大&#xff0c;固体内部的粒子处于无序运动状态&#xff0c;当温度慢慢降低时&#xff0c;固体的内能减小&#xff0c;粒子的运动趋于有序&#xff0c;如果温度降低得足够慢&#xff…

模拟退火算法简单理解

模拟退火算法 算法流程图 1. 引言 模拟退火算法&#xff08;Simulate Anneal&#xff0c;SA&#xff09;是一种通用概率演算法&#xff0c;用来 在一个大的搜寻空间内找寻命题的最优解 。模拟退火是由S.Kirkpatrick, C.D.Gelatt和M.P.Vecchi在1983年所发明的。V.Čern在198…

理解模拟退火算法

目录 文章目录 目录退火原理爬山算法模拟退火模拟退火伪代码算法评价参考文献 退火原理 模拟退火算法来源于固体退火原理&#xff0c;将固体加温至充分高&#xff0c;再让其徐徐冷却。加温时&#xff0c;固体内部粒子随温升变为无序状&#xff0c;内能增大&#xff0c;而徐徐冷…

量子退火算法入门(6):初识量子退火算法的发明过程

文章目录 一、量子计算机二、模拟退火算法三、量子退火算法的物理基础1. 量子涨落替换热涨落&#xff0c;提出量子退火算法2. 绝热量子演化解决横向磁场强度缓慢变化3. D-Wave Systems公司实现物理量子退火机 总结 一、量子计算机 提示&#xff1a;量子退火机的发展简史&#…

模拟退火算法(SA)详解

一.算法来源&#xff1a;模拟退火算法(SA)源于固体退火原理&#xff0c;是一种基于概率的算法。将固体加温至充分高的温度&#xff0c;再让其徐徐冷却&#xff0c;加温时&#xff0c;固体内部粒子随温升变为无序状&#xff0c;内能增大&#xff0c;分子和原子越不稳定。而徐徐冷…

模拟退火算法介绍和实例实现

一、模拟退火算法简介 模拟退火算法(SA)来源于固体退火原理&#xff0c;是一种基于概率的算法。将固体加温至充分高的温度&#xff0c;再让其徐徐冷却&#xff0c;加温时&#xff0c;固体内部粒子随温升变为无序状&#xff0c;内能增大&#xff0c;分子和原子越不稳定。而徐徐冷…

模拟退火算法(Python)

一、模拟退火算法 1、模拟退火算法的定义 模拟退火算法是一种现代优化算法。基于蒙特卡洛迭代求解方法的随机寻优算法&#xff0c;模拟退火算法于1983 年成功地应用到组合优化领域。因固体物理退火过程与组合优化问题存在着相似性&#xff0c;模拟退火算法对固体物质的退火过…

模拟退火算法详细说明

来源&#xff1a;固体退火。一种处理工艺&#xff1a;将金属缓慢加热到一定程度&#xff0c;保持足够的时间&#xff0c;然后以适宜的速度冷却。退火后的金属具有了新的属性降低硬度等。 一、爬山算法 1.爬山算法是一种局部择优的方法&#xff0c;是一种局部贪心的最优算法。…

【算法】模拟退火

文章目录 1.模拟退火介绍1.1模拟退火的可行性1.2退火模型 2.详解退火2.1退火过程2.2各变量说明2.2.1关于接收概率 3.退火模拟求根号n的值4.洛谷POJ-2420 1.模拟退火介绍 ​ 模拟退火是模拟物理上退火方法&#xff0c;通过N次迭代&#xff08;退火&#xff09;&#xff0c;逼近…

模拟退火算法的原理+应用

本文转自https://www.cnblogs.com/ranjiewen/p/6084052.html 模拟退火算法 著名的模拟退火算法&#xff0c;它是一种基于蒙特卡洛思想设计的近似求解最优化问题的方法。 一点历史——如果你不感兴趣&#xff0c;可以跳过 美国物理学家 N.Metropolis 和同仁在1953年发表研究复杂…

优化算法——模拟退火算法

模拟退火算法原理 爬山法是一种贪婪的方法&#xff0c;对于一个优化问题&#xff0c;其大致图像(图像地址)如下图所示&#xff1a; 其目标是要找到函数的最大值&#xff0c;若初始化时&#xff0c;初始点的位置在 C C C处&#xff0c;则会寻找到附近的局部最大值 A A A点处&a…

模拟退火算法详细讲解(含实例python代码)

模拟退火算法详细讲解&#xff08;含实例python代码&#xff09; &#xff08;一&#xff09;模拟退火算法简介&#xff08;二&#xff09;模拟退火算法原理&#xff08;三&#xff09;退火过程中参数控制&#xff08;四&#xff09;算法步骤&#xff08;五&#xff09;实例分析…

模拟退火算法(SA)

一、算法简介 模拟退火算法(SA) 一种模拟物理退火过程而设计的优化算法 初始处于一个高温状态下&#xff0c;然后逐渐退火&#xff0c;在每个温度下慢慢冷却&#xff0c;最终达到物理基态&#xff08;相当于算法找到最优解&#xff09; 求解TSP问题(旅行商问题)、最值问题、全…