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

article/2025/9/20 22:14:27

模拟退火算法

  • 提出问题
  • 青铜级别解法(盲目搜索)
  • 王者级别解法(启发式搜索)
  • 操作方法
    • 需要研究的地方
      • 如果这个优化问题有约束条件怎么办?
      • 这个C~t~怎么设置?
      • t的变化在编程里面怎么实现?
      • 什么时候停止搜索?
      • 怎么在A附近随机生成一个新解B?
        • 题目1:求给定函数的最大值或者最小值
        • 问题2:旅行商问题
        • 书店买书问题
        • 背包问题

提出问题

(1)求一个给定函数的最值问题
eg:求函数 y = 11 s i n x + 7 c o s ( 5 x ) y=11sinx+7cos(5x) y=11sinx+7cos(5x)在[-3,3]内的最大值
第一反应:暴力搜索?啊…这…如果有30个变量怎么办?

(2)TSP(旅行商问题)
eg:一个售货员必须访问n个城市,这n个城市是一个完全图,售货员需要恰好访问所有城市的一次,并且得到最终的城市。城市与城市之间有一个旅行费用,售货员希望旅行费用最少。
完全图:完全图是一个简单的无向图,其中每对不同的顶点之间都恰有一条边框相连。
在这里插入图片描述(3)书店买书问题(假设有m个书店,n本书,那么买书的方案有mn种)
某同学要从六家线上商城选购5本书籍B1,B2,B3,B4,B5,每本书籍在不同商家的售价及其每个商家的单次运费险如下表所示,请给该同学制定最省钱的选购方案。(注:在同一个书店买多本书也只会收取一次运费)
在这里插入图片描述(4)背包问题(如果有n件货物,那么可能性有2n种)
在这里插入图片描述

上述的这些问题,均是求某一目标函数的最值问题。(某一给定的函数、旅行的路程或费用、买书的花费、利润)
MATLAB中所求出的是最小值,在求最大值时候可以给目标函数添加符号等方法转化成求最小值问题。

青铜级别解法(盲目搜索)

1. 蒙特卡洛模拟
2. 对比穷举法

但在解空间的可能情况特别多时,这两种方法就凉凉。

王者级别解法(启发式搜索)

模拟退火算法(以一定概率接受新的解)
求函数 y = 11 s i n x + 7 c o s ( 5 x ) y=11sinx+7cos(5x) y=11sinx+7cos(5x)在[-3,3]内的最大值
旧的解:xi对应的函数值f(xi)
新的解:在xi“附近”随机寻找一个新的解xj,对应的函数值为f(xi)

  1. 如果f(xj)>f(xj),则接受新解xj
  2. 如果f(x)≤f(xi),我们不能直接拒绝xj

解决方法: 为了不直接拒绝xj,我们定义一个接受的概率p,p位于[0,1]之间,且f(xj)和f(xi)越接近,p越大。(意思就是,新解和旧解的函数值越接近,我们就越愿意接受新解。)
即p正比于 1 ∣ f ( x j ) − f ( x i ) ∣ \frac{1}{|f(x_j)-f(x_i)|} f(xj)f(xi)1,记为p∝ 1 ∣ f ( x j ) − f ( x i ) ∣ \frac{1}{|f(x_j)-f(x_i)|} f(xj)f(xi)1

接着思考:概率p位于[0,1]之间,哪个常见的函数值域是位于[0,1]之间的?
不唯一,但有一个函数形式很简单: y = e − x ( x ≥ 0 ) y=e^{-x}(x≥0) y=ex(x0),关于x单调递减:
在这里插入图片描述所以我们可以假设: p ∝ e − ∣ f ( x j ) − f ( x i ) ∣ p∝e^{-|f(x_j)-f(x_i)|} pef(xj)f(xi)

  • 接受新解的概率p越大,意味着在解空间中搜索的范围越大

原因:接受新解的概率p越大,意味着我们的搜索更容易接受不好的解,这时候就相当于增加了我们的搜索范围。

  • 假设我们将搜索过程看作一个“工序”,那么搜索前期,我们的搜索范围应该尽量的大,搜索后期我们的搜索范围应该尽量的小。

原因:在搜索前期,我们要尽可能的扩大我们的搜索范围,这样能够避免陷入局部最优解;在搜索后期我们要倾向于局部搜索。(渣男套路:前期广撒网、后期精准打击)

我们对式子 p ∝ e − ∣ f ( x j ) − f ( x i ) ∣ p∝e^{-|f(x_j)-f(x_i)|} pef(xj)f(xi)进行一个变形:
p t ∝ e − ∣ f ( x j ) − f ( x i ) ∣ × C t p_t∝e^{-|f(x_j)-f(x_i)|×C_t} ptef(xj)f(xi)×Ct

  • 其中:Ct可以看作一个和时间有关的系数,因此在搜索过程中,我们接受新解的概率p就和时间有关,显然时间越长,Ct越大

原因:搜索前期t较小,我们希望搜索的范围大,即更倾向于接受新解,那么对应的p就应该大一些,而Ct与p负相关,因此Ct应该小一点;搜索后期我们希望p较小,那么Ct应该大一点,因此我们可以得出结论:Ct关于t递增。

操作方法

我们的搜索过程(假设求最大值问题)可以用下面这个简单的流程表示:

  1. 随机生成一个解,计算解A对应的目标函数值f(A)
  2. 在A附近随机产生一个解B,计算解B对应的目标函数值f(B)、
  3. 如果f(B)>f(A),那么将解B的值给解A,然后重复上面步骤(爬山法的思想);
    如果f(B) ≤ f(A),那么我们接受B的概率为 p t = ∝ e − ∣ f ( x j ) − f ( x i ) ∣ × C t p_t=∝e^{-|f(x_j)-f(x_i)|×C_t} pt=ef(xj)f(xi)×Ct,然后我们生成一个[0,1]之间的随机数r,如果r<p,我们就将解B赋值给解A,然后重复上面的步骤;否则我们返回第2步,在原来的A附近再重新生成一个解B,然后继续下去。

需要研究的地方

如果这个优化问题有约束条件怎么办?

编写一个筛选随机数的程序就好啦。

这个Ct怎么设置?

定义初始温度T0=100,温度下降的公式为:Tt+1=αTt,α常取0.95,那么时刻t时的温度:Tt=αT0=100×0.95t.
C t = 1 T t = 1 100 × 0.9 5 t C_t=\frac{1}{T_t}=\frac{1}{100×0.95^t} Ct=Tt1=100×0.95t1,那么 p t = ∝ e − ∣ f ( x j ) − f ( x i ) ∣ 100 × 0.9 5 t p_t=∝e^{-\frac{|f(x_j)-f(x_i)|}{100×0.95^t}} pt=e100×0.95tf(xj)f(xi)
注意:这里的倒数是为了保证Ct关于t递增。
p t = ∝ e − ∣ f ( x j ) − f ( x i ) ∣ T t p_t=∝e^{-\frac{|f(x_j)-f(x_i)|}{T_t}} pt=eTtf(xj)f(xi)
Δ f = ∣ f ( B ) − f ( A ) ∣ Δf=|f(B)-f(A)| Δf=f(B)f(A)

那么p到底有多大呢?
在这里插入图片描述

  • 温度一定时,Δf越小,概率越小,即目标函数相差越小接受的可能性越大。
  • Δf一定时,温度越高,概率越大,即搜索前期温度较高时更有可能接受新解。

t的变化在编程里面怎么实现?

  • 可以看成我们迭代的次数。(采用循环)
    t表示时间,迭代第一次,迭代第二次,t从1到1000,就迭代1000次。
  • 为了保证搜索过程的彻底,在同一温度下(同一个小t),我们需要进行多次搜索(例如重复上面的流程500次);之后我们降低温度,然后再来进行新的一轮搜索。
    用编程的话是由两层循环。

什么时候停止搜索?

有很多种准则:

  1. 达到指定的迭代次数,例如迭代200次;
  2. 达到指定的温度,例如温度小于0.000001;
  3. 我们找到最优解连续M次(例如30次)迭代都没有变化。

怎么在A附近随机生成一个新解B?

题目1:求给定函数的最大值或者最小值

我们以n元函数求最值为例,来介绍新解的产生规则:
假设当前解为:(x1,x2,…,xn)
我们首先生成一组随机数(y1,y2,…,yn),其中yi服从N(0,1)
[均值为0,方差为1的正态分布]
接下来我们再计算(z1,z2,…,zn)其中 z 1 = y / y 1 2 + y 2 2 + … + y n 2 z_1=y/\sqrt{y_1^2+y_2^2+…+y_n^2} z1=y/y12y22yn2
[对随机数进行标准化]
对于每一个i∈[1,n],来产生一个新解,即进行下面操作:

  1. 计算:xinew=xi+T×zi,T是当前的温度(也可以使用xinew=xi T \sqrt{T} T ×zi);
  2. 接下来检查xinew是否位于上下界内,即是否满足lbi≤xinew≤ub这个约束:
    a.如果lbi≤xinew≤ub满足,则直接令xj=xinew即可;
    b.如果xinew<lbi,则 x j = r × l b i + ( 1 − r ) × x i n e w x_j=r×lb_i+(1-r)×x_i^{new} xj=r×lbi(1r)×xinew这里r是区间[0,1]上均匀分布的随机数;
    c.如果xinew>ubi,则 x j = r × u b i + ( 1 − r ) × x i n e w x_j=r×ub_i+(1-r)×x_i^{new} xj=r×ubi(1r)×xinew这里r是区间[0,1]上均匀分布的随机数。

b和c的处理方式就相当于数据太大或太小需要折中。
这是MATLAB内置函数的定义方法。

问题2:旅行商问题

问题的内容:给定一系列城市和每对城市之间的距离,求解访问每座城市一次并回到起点的最短回路。
三种产生新解的方法:
在这里插入图片描述

书店买书问题

在这里插入图片描述

背包问题

在这里插入图片描述


http://chatgpt.dhexx.cn/article/4E25yJx5.shtml

相关文章

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

本博客封面由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问题(旅行商问题)、最值问题、全…

模拟退火算法(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,这个命令是如何调起我们的测试代码来进行测试的呢,…