模拟退火算法(SA)详解

article/2025/9/20 23:49:05

一.算法来源:模拟退火算法(SA)源于固体退火原理,是一种基于概率的算法。将固体加温至充分高的温度,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,分子和原子越不稳定。而徐徐冷却时粒子渐趋有序,能量减少,原子越稳定。在冷却(降温)过程中,固体在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。


二.相关知识背景

玻尔兹曼分布推导(可跳过)

假设我们有一个包含宏观粒子总数为N、环境温度为T、定容条且达到热力平衡的封闭系统。假定此处只有s_{0}s_{1}粒子是有效的,它们分别包含了n_{0}n_{1}个微粒。 其中N=n_{0}+n_{1}。总微观状态数为

W=\frac{N!}{n_{0}!n_{1}!}(1)


微观状态数(W)和熵(S)的关系在统计物理内的定义:

S=KlnW\left ( 2 \right )

其中K为普朗克常数,依据(2)式则当前系统熵为:

S=Kln\frac{N!}{n_{0}!n_{1}!}\left ( 3 \right )

若给予一定能量使1个处于s_{0}状态的粒子激发到s_{1}状态,则此时系统熵为:

S'=Kln\frac{N!}{\left (n _{0} -1\right )!\left (n _{1} +1\right )!}\left ( 4 \right )

 由(4)-(3)式得

 \Delta S=Kln\frac{n_{0}}{n_{1}+1}\rightarrow Kln\frac{n_{0}}{n_{1}}\left ( 5 \right )

熵(S)与系统从外界吸收的热量(Q)在热力学中的关系为:

\Delta S=\frac{\Delta Q}{T}=\frac{E_{1}-E_{0}}{T}\left ( 6 \right )

(5)、(6)式联立得

​​​​​​​Boltzmann factor\Rightarrow \frac{n_{0}}{n_{1}}=e^{-\frac{E_{0}-E_{1}}{KT}}


 三.模拟退火过程

想象一下如果我们现在有下面这样一个函数,现在想求函数最小值的(全局)最优解。如果采用贪心策略,那么从A点开始试探,如果函数值继续减少,那么试探过程就会继续。而当到达点B时,显然我们的探求过程就结束了。最终我们只能找打一个局部最后解B,显然不是我们想要的全局最优解C。相交于普通的贪心算法,模拟退火算法以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。

将函数值视为能量,模拟退火算法使第n次迭代状态与n+1次迭代状态进行比较。定义系统由x(n)变为x(n+1)的接受概率P为:

在这里插入图片描述

当E(n+1)>E(n)时, Metropolis接受准则使模拟退火算法具有一定爬坡能力,且这种爬坡能力会随着温度降低逐渐降低,最终趋于稳定。

用固体退火模拟组合优化问题,将内能E模拟为目标函数值f,温度T演化成控制参数t,即得到解组合优化问题的模拟退火算法:由初始解i和控制参数初值t开始,对当前解重复“产生新解→计算目标函数差→接受或舍弃”的迭代,并逐步衰减t值,算法终止时的当前解即为所得近似最优解,退火过程由冷却进度表(Cooling Schedule)控制,包括控制参数的初值t及其衰减因子Δt、每个t值时的迭代次数L和停止条件Tf。而温度的作用就是来计算转移概率P的。当温度每次下降后,转移概率也发生变化,因此在所有温度下迭代L次的结果也都是不相同的。在每个温度下迭代L次来寻找当前温度下的最优解,然后降低温度继续寻找,直到到达终止温度,即转移概率P接近于0.

四.应用示例(matlab)

求解:x+10sin(5x)+7cos(4x)在[0,9]区间最大值

clear;%范围
section_l = 0;
section_h = 9;%绘制函数图像
draw_base();%初始温度,停止温度与降温系数
tmp = 1e5;
tmp_min = 1e-3;
alpha = 0.98;%生成初始随机解
x_old = (section_h - section_l) * rand() + section_l;
x_new = x_old;
s_old = val(x_old);
s_new = s_old;text_lt = text(0, 0, 'Init');%计数器
counter = 0;%退火的主体部分,一个循环
while(tmp > tmp_min)%随机扰动delta = (rand() - 0.5) * 3;x_new = x_old + delta;%扰动的值小于一半的区间范围时,可以用这种办法防止新值超出区间范围if(x_new < section_l || x_new > section_h)x_new = x_new - 2 * delta;ends_new = val(x_new);%求差值,这里是找最大值而非最小值,所以不是s_new - s_olddE = s_old - s_new;%判断j = judge(dE, tmp);if(j)s_old = s_new;x_old = x_new;end%只有当dE < 0的情况下才降温if(dE < 0)delete(text_lt);hold on, scatter(x_old, s_old);hold on, text_lt = text(0.3, 21, ['tmp: ', num2str(tmp)]);pause(0.01);%上面是绘图的代码,下面降温tmp = tmp * alpha;elsecounter = counter + 1;end%当接受更差的解的概率太小时,若又长时间找不到更优的解,那么退出循环,结束算法if(counter > 10000)break;endendfunction [y] = val(x)y = x + 10 * sin(5 * x) + 7 * cos(4 * x);
endfunction draw_base()X = 0: 0.01:9;M = val(X);plot(X, M);
endfunction [y] = judge(dE, t)if(dE < 0)y = 1;elsed = exp(-(dE / t));if(d > rand)y = 1;elsey = 0;endend
end


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

相关文章

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

一、模拟退火算法简介 模拟退火算法(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问题(旅行商问题)、最值问题、全…

模拟退火算法(Simulated Annealing,SA)

这是一篇关于模拟退火算法的总结博客&#xff0c;包括算法思想&#xff0c;算法步骤&#xff0c;Python实现&#xff0c;MATLAB实现&#xff0c;算法进阶等。 目录 1 算法思想2 算法步骤3 SA解函数最小值&#xff08;python实现&#xff09;4 SA解旅行商问题&#xff08;MATLA…

退火算法(Annealing)简介与详解

模拟退火算法&#xff08;Simulated Annealing&#xff0c;SA&#xff09; 秒懂爬山算法&#xff08;Hill Climbing&#xff09;退火算法 详解算法来源数学推导来源&#xff1a;metropolis准则&#xff08;蒙特卡洛准则&#xff09; 算法流程算法优劣例题 秒懂 爬山算法&#…

Instrumentation框架分析及其使用

本文旨在从Android系统源码出发,简单梳理Instrumentation框架的行为及逻辑结构,供有兴趣的同学一起学习 从am instrument谈起 am instrument命令的执行 我们知道,命令行运行Android测试的命令是adb shell am instrument,这个命令是如何调起我们的测试代码来进行测试的呢,…

android.app.instrumentation解析

已经在Android SDK中学习了很多关于JUnit的内容&#xff0c;但是感觉一直有几个问题没有解决&#xff08;不知道大家是否有同样的感受&#xff09;JUnit的测试都自动化的&#xff0c;完全是不需要任何操作的&#xff0c;有2个问题我一直都还没有找到答案&#xff0c;这2个问题如…

Java探针 Instrumentation

背景&#xff1a;假如我们想打印出某些系统->某些类->某些方法的执行耗时&#xff0c;方式有很多&#xff0c;但是想要无侵入的做到这一点&#xff0c;只有Java探针一种方式。这也是很多调用链系统依赖的技术基础。 什么是Java探针 通俗来讲&#xff0c;就是Java提供的一…

opentelemetry-java-instrumentation翻译

原文地址&#xff1a;原文 OpenTelemetry Instrumentation for Java 这个项目提供了一个Java agent JAR&#xff0c;这个jar可以attached to任何Java8的应用上&#xff0c;动态地注入&#xff08;inject&#xff09;字节码从大量的流行库和框架&#xff08;popular libraries …

Instrument

使用Instruments 里面的Automation&#xff0c;可以对iOS进行自动化测试。 参考这篇文章&#xff1a;http://www.codeproject.com/KB/iPhone/UI_Automation_Testing.aspx 我用的是xcode4.2。 在这里下载修改好的项目&#xff0c;xcode4.2下用的&#xff1a;http://download.csd…

android Instrumentation

Android提供了一系列强大的测试工具&#xff0c;它针对Android的环境&#xff0c;扩展了业内标准的JUnit测试框架。尽管你可以使用JUnit测试Android工程&#xff0c;但Android工具允许你为应用程序的各个方面进行更为复杂的测试&#xff0c;包括单元层面及框架层面。 Android测…

Instrumentation 应用简介

引用&#xff1a; java-instrumentation 引用&#xff1a;Instrumentation 新功能 简介 java Instrumentation指的是可以用独立于应用程序之外的代理&#xff08;agent&#xff09;程序来监测和协助运行在JVM上的应用程序。这种监测和协助包括但不限于获取JVM运行时状态&#…

AndroidStudio单元测试——instrumentation

前言&#xff1a;这几天老大要我搞代码自动测试&#xff0c;eclispe的已经解决了&#xff0c;可他们都是用android studio&#xff0c;所以要在android studio 上重新试验&#xff0c;这个有难度啊&#xff0c;android studio国内资料极少&#xff0c;更不要说单元测试了。goog…

Android Instrumentation 简介

Instrumentation 简介 APIs && Source code 官方APIs地址(需要翻墙)Source code Instrumentation 特点 该框架基于JUnit&#xff0c;因此既可以直接使用Junit 进行测试&#xff0c;也可以使用Instrumentation 来测试Android 组件其为Android 应用的每种组件提供了测…

冲突域和广播域?

如何理解冲突域和广播域&#xff1f; 冲突域&#xff1a; 【定义】在同一个冲突域中的每一个节点都能收到所有被发送的帧。简单的说就是同一时间内只能有一台设备发送信息的范围。 【分层】基于OSI的第一层物理层 【设备】第二层设备能隔离冲突域&#xff0c;比如Switch。交…