你也能看懂的:退火算法

article/2025/9/20 22:58:53

模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小,即在局部最优解能概率性地跳出并最终趋于全局最优。参考了金属冶炼的退火过程。


模拟退火的流程

假设一个人在一群山峰中的某一个位置,他想要找一个最低点,只需要一直往比自己位置低的方向走,直到周围的地势都比自己所处的位置高就行了,这就是梯度下降法,如果想找最高点反着来就行了。但是这样面对的问题就是不一定能找到整片山峰中的最低点,如果他运气好位于最低的一座山上就没问题,但他大概率不会处于这个位置,只能找到某一座山的最低点,即局部最优解

而模拟退火算法就是有一定的概率跳到另外一座山上,而且是在新解的值比当前解的值差的情况下,如果新解比当前解情况好可以当成普通梯度下降法

具体过程:

  1. 随机生成一个初始值,并产生一个初始位移,求出系统因此而产生的能量变化 Δ E k \Delta E_k ΔEk
  2. Δ E k ≤ 0 \Delta E_k\leq0 ΔEk0 则位移生效并继续产生位移再判断;若 Δ E k > 0 \Delta E_k>0 ΔEk>0 则以值为 P k P_k Pk 的概率来判断是否生效
    P k P_k Pk 公式,式中 T 为温度: P k = 1 1 + e − Δ E k / T P_k=\frac{1}{1+e^{-\Delta E_k/T}} Pk=1+eΔEk/T1
  3. 转第 1 步继续执行,直到达到平衡状态为止

流程图:
在这里插入图片描述


案例解读

求目标函数在约束下的最小值
f ( x ) = x 1 2 + x 2 2 + 8 约 束 : x 1 2 − x 2 > 0 − x 1 − x 2 2 + 2 = 0 f(x)=x_1^2+x_2^2+8 \\ 约束: x_1^2-x_2>0 \quad \quad -x_1-x_2^2+2=0 f(x)=x12+x22+8x12x2>0x1x22+2=0

下面代码采用 MatLab,把同一个文件中的代码分几段解读

初始化
sol_new2 = 1; %初始解,即 x2 的新值
sol_new1 = 2-sol_new2^2; %x1 的新值
sol_current1 = sol_new1; %x1 当前值
sol_best1 = sol_new1; %x1 最优值
sol_current2 = sol_new2; %x2 当前值
sol_best2 = sol_new2; %x2 最优值
E_current = inf; %E 当前值初始为无穷大
E_best = inf; %E 最优值初始为无穷大rand('state', sum(clock)); %初始化随机数发生器
t = 90; %初始温度
tf = 89.9; %结束温度
a = 0.99; %温度下降比例

初始化之后就可以随机生成位移并判断,降温时新温度 t = t ∗ a t=t*a t=ta

生成新值
while t >= tf %结束条件,以温度判断for r = 1:500 %退火次数%产生随机扰动,生成新解sol_new2 = sol_new2+rand*0.2;sol_new1 = 2-sol_new2^2;%检查是否满足约束条件if sol_new1^2-sol_new2 >= 0 && -sol_new1-sol_new2^2+2==0 && sol_new1>=0 &&sol_new2>=0elsesol_new2 = rand*2;sol_new1 = 2-sol_new2^2;continue;end

首先满足默认约束条件,再考虑值的范围,要把所有约束都写上

结束条件不仅要判断退火次数,还要判断温度是否足够

退火过程
        %退火过程E_new = sol_new1^2+sol_new2^2+8; %目标函数if E_new < E_current %接受准则E_current = E_new;sol_current1 = sol_new1;sol_current2 = sol_new2;if E_new < E_best%把冷却过程中最好的解保存下来E_best = E_new;sol_best1 = sol_new1;sol_best2 = sol_new2;endelseif rand < exp(-(E_new-E_current)/t) %代价函数差E_current = E_new;sol_current1 = sol_new1;sol_current2 = sol_new2;elsesol_new1 = sol_current1;sol_new2 = sol_current2;endendplot(r,E_best, '*')hold onendt = t*a; %降温
end

上述代码就是按照模拟退火的过程进行的,下一步如果是值更优则采纳,如果更差则判断是否跳动,再继续产生新值来判断,如此重复进行,直至满足条件

展示结果

如图:
在这里插入图片描述
可以看到在 200 多次后,值已经非常接近最优值,每次的情况都不太一样,次数不能太小

打印最优值:

disp('最优解为:')
disp(sol_best1)
disp(sol_best2)
disp('目标表达式的最小值等于:')
disp(E_best)

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

相关文章

优化算法-模拟退火算法

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

模拟退火算法(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提供的一…