Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深度学习经典算法 | 模拟退火算法详解

深度学习经典算法 | 模拟退火算法详解

作者头像
墨明棋妙27
发布于 2022-09-23 03:15:10
发布于 2022-09-23 03:15:10
1.5K02
代码可运行
举报
文章被收录于专栏:19961996
运行总次数:2
代码可运行

模拟退火算法基本思想

现代的模拟退火算法形成于20世纪80年代初,其思想源于固体的退火过程,即将固体加热至足够高的温度,再缓慢冷却。升温时,固体内部粒子随温度升高变为无序状,内能增大,而缓慢冷却时粒子又逐渐趋于有序,从理论上讲,如果冷却过程足够缓慢,那么冷却中任一温度时固体都能达到热平衡,而冷却到低温时将达到这一低温下的内能最小状态。

在这一过程中, 任一恒定温度都能达到热平衡是个重要步骤, 这一点可以用MonteCarlo算法模拟,不过其需要大量采样,工作量很大。但因为物理系统总是趋向于能量最低,而分子热运动则趋向于破坏这种低能量的状态,故而只需着重取贡献比较大的状态即可达到比较好的效果, 因而1953年Metropolis提出了这样一个重要性采样的方法, 即设从当前状态i生成新状态j.若新状态的内能小于状态i的内能(即Ej<Ei),则接受新状态j作为新的当前状态;否则,以概率

exp[(EjEi)KT]

接受状态j, 其中k为Boltzmann常数, 这就是通常所说的Metropolis准则。

1953年, Kirkpatrick把模拟退火思想与组合最优化的相似点进行类比, 将模拟退火应用到了组合最优化问题中,在把模拟退火算法应用于最优化问题时,一般可以将温度T当做控制参数,目标函数值f视为内能E,而固体在某温度T时的一个状态对应一个解

xi

。然后算法试图随着控制参数T的降低,使目标函数值f(内能E)也逐渐降低,直至趋于全局最小值(退火中低温时的最低能量状态),就像固体退火过程一样。

其他一些参数的说明

退火过程由一组初始参数, 即冷却进度表(cooling schedule) 控制, 它的核心是尽量使系统达到准平衡,以使算法在有限的时间内逼近最优解。冷却进度表包括:

  • ①控制参数的初值T。:冷却开始的温度。
  • ②控制参数T的衰减函数:因计算机能够处理的都是离散数据,因此需要把连续的降温过程离散化成降温过程中的一系列温度点,衰减函数即计算这一系列温度的表达式。
  • ③控制参数T的终值T,(停止准则)。
  • ④Markov链的长度L.:任一温度T的迭代次数。

算法基本步骤

①令T=T。,即开始退火的初始温度,随机生成一个初始解工,并计算相应的目标函数值E(x0)。

②令T等于冷却进度表中的下一个值Ti。

③根据当前

xi

,进行扰动(扰动方式可以参考后面的实例),产生一个新解

xi

、计算应的目标函数值E(

xj

),得到△E=E(

xj

)一E(

xi

)。

④若△E<0,则新解

xj

被接受,作为新的当前解;若△E>0,则新解

xj

,按概率exp(一△E/

Ti

) 接受,

Ti

为当前温度。

⑤在温度

Ti

下,重复L,次的扰动和接受过程,即执行步骤③与④。

⑥判断T是否已到达

Tj

,是,则终止算法;否,则转到步骤②继续执行。

算法实质分两层循环,在任一温度随机扰动产生新解,并计算目标函数值的变化,决定是否被接受。由于算法初始温度比较高,这样,使E增大的新解在初始时也可能被接受.因而能跳出局部极小值,然后通过缓慢地降低温度,算法就最终可能收敛到全局最优解。还有一点要说明的是,虽然在低温时接受函数已经非常小了,但仍不排除有接受更差的解的可能,因此一般都会把退火过程中碰到的最好的可行解(历史最优解)也记录下来,与终止算法前最后一个被接受解一并输出。

几点说明

为了更好地实现模拟退火算法,还需要注意以下一些方面。

状态表达

上文已经提到过,SA算法中优化问题的一个解模拟了(或说可以想象为)退火过程中固体内部的一种粒子分布情况。这里状态表达即指实际问题的解(即状态)如何以一种合适的数学形式被表达出来,它应当适用于SA的求解、又能充分表达实际问题,这需要仔细地设计。可以参考遗传算法和禁忌搜索中编码的相关内容。常见的表达方式有:背包问题和指派问题的0-1编码, TSP问题和调度问题的自然数编码:还有用于连续函数优化的实数编码等。

新解的产生

新解产生机制的基本要求是能够尽量遍及解空间的各个区域,这样、在某一恒定温度不断产生新解时,就可能跳出当前区域的极小以搜索其他区域,这是模拟退火算法能够进行广域搜索的一个重要条件。

收敛的一般性条件

收敛到全局最优的一般性条件是:

  • ①初始温度足够高:
  • ②热平衡时间足够长;
  • ③终止温度足够低;
  • ④降温过程足够缓慢。但上述条件在应用中很难同时满足。

参数的选择

(1)控制参数T的初值T。

求解全局优化问题的随机搜索算法一般都采用大范围的粗略搜索与局部的精细搜索相结合的搜索策略。只有在初始的大范围搜索阶段找到全局最优解所在的区域,才能逐渐缩小搜索的范围.最终求出全局最优解。模拟退火算法是通过控制参数T的初值T。和其衰减变化过程来实现大范围的粗略搜索和局部精细搜索。

一般来说,只有足够大的T。才能满足算法要求(但对不同的问题“足够大”的含义也不同,有的可能T。=100就可以,有的则要1010)。在问题规模较大时,过小的T。往往导致算法难以跳出局部陷阱而达不到全局最优。但为了减少计算量,T。不宜取得过大,而应与其他参数折中选取。

(2)控制参数T的衰减函数

衰减函数可以有多种形式,一个常用的衰减函数是

其中.a是一个常数,可以取为0.5~0.99,它的取值决定了降温的过程。小的衰减量可能导致算法进程迭代次数的增加,从而使算法进程接受更多的变换,访问更多的邻域,搜索更大范围的解空间,返回更好的最终解。同时由于在

值上已经达到准平衡,则在

时只需少量的变换就可达到准平衡。这样就可选取较短长度的Markov链来减少算法时间。

(3) Markov链长度

Markov链长度的选取原则是:在控制参数T的衰减函数已选定的前提下,

应能使在控制参数T的每一取值上达到准平衡。从经验上来说,对简单的情况可以令

=100n,n为问题规模。

算法停止准则:对Metropolis准则中的接受函数

分析可知,在T比较大的高温情况下,指数上的分母比较大,而这是一个负指数,所以整个接受函数可能会趋于1,即比当前解x,更差的新解工,也可能被接受,因此就有可能跳出局部极小而进行广域搜索,去搜索解空间的其他区域;而随着冷却的进行,T减小到一个比较小的值时,接受函数分母小了,整体也小了,即难以接受比当前解更差的解,也就是不太容易跳出当前的区域。如果在高温时,已经进行了充分的广域搜索,找到了可能存在最好解的区域,而在低温再进行足够的局部搜索,则可能最终找到全局最优了。因此,一般T,应设为一个足够小的正数,比如0.01~5,但这只是一个粗糙的经验,更精细的设置及其他的终止准则可以查阅文献。

Python实现

函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt
import random

class SA(object):

    def __init__(self, interval, tab='min', T_max=10000, T_min=1, iterMax=1000, rate=0.95):
        self.interval = interval                                    # 给定状态空间 - 即待求解空间
        self.T_max = T_max                                          # 初始退火温度 - 温度上限
        self.T_min = T_min                                          # 截止退火温度 - 温度下限
        self.iterMax = iterMax                                      # 定温内部迭代次数
        self.rate = rate                                            # 退火降温速度
        #############################################################
        self.x_seed = random.uniform(interval[0], interval[1])      # 解空间内的种子
        self.tab = tab.strip()                                      # 求解最大值还是最小值的标签: 'min' - 最小值;'max' - 最大值
        #############################################################
        self.solve()                                                # 完成主体的求解过程
        self.display()                                              # 数据可视化展示

    def solve(self):
        temp = 'deal_' + self.tab                                   # 采用反射方法提取对应的函数
        if hasattr(self, temp):
            deal = getattr(self, temp)
        else:
            exit('>>>tab标签传参有误:"min"|"max"<<<')
        x1 = self.x_seed
        T = self.T_max
        while T >= self.T_min:
            for i in range(self.iterMax):
                f1 = self.func(x1)
                delta_x = random.random() * 2 - 1
                if x1 + delta_x >= self.interval[0] and x1 + delta_x <= self.interval[1]:   # 将随机解束缚在给定状态空间内
                    x2 = x1 + delta_x
                else:
                    x2 = x1 - delta_x
                f2 = self.func(x2)
                delta_f = f2 - f1
                x1 = deal(x1, x2, delta_f, T)
            T *= self.rate
        self.x_solu = x1                                            # 提取最终退火解

    def func(self, x):                                              # 状态产生函数 - 即待求解函数
        value = np.sin(x**2) * (x**2 - 5*x)
        return value

    def p_min(self, delta, T):                                      # 计算最小值时,容忍解的状态迁移概率
        probability = np.exp(-delta/T)
        return probability

    def p_max(self, delta, T):
        probability = np.exp(delta/T)                               # 计算最大值时,容忍解的状态迁移概率
        return probability

    def deal_min(self, x1, x2, delta, T):
        if delta < 0:                                               # 更优解
            return x2
        else:                                                       # 容忍解
            P = self.p_min(delta, T)
            if P > random.random(): return x2
            else: return x1

    def deal_max(self, x1, x2, delta, T):
        if delta > 0:                                               # 更优解
            return x2
        else:                                                       # 容忍解
            P = self.p_max(delta, T)
            if P > random.random(): return x2
            else: return x1

    def display(self):
        print('seed: {}\nsolution: {}'.format(self.x_seed, self.x_solu))
        plt.figure(figsize=(6, 4))
        x = np.linspace(self.interval[0], self.interval[1], 300)
        y = self.func(x)
        plt.plot(x, y, 'g-', label='function')
        plt.plot(self.x_seed, self.func(self.x_seed), 'bo', label='seed')
        plt.plot(self.x_solu, self.func(self.x_solu), 'r*', label='solution')
        plt.title('solution = {}'.format(self.x_solu))
        plt.xlabel('x')
        plt.ylabel('y')
        plt.legend()
        plt.savefig('SA.png', dpi=500)
        plt.show()
        plt.close()


if __name__ == '__main__':
    SA([-5, 5], 'max')

结果展示

参考文献

《matlab在数学建模中的应用》

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 计算机视觉CV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
模拟退火算法小谈
为了解决局部最优解问题, 1983年,Kirkpatrick等提出了模拟退火算法(SA)能有效的解决局部最优解问题。我们知道在分子和原子的世界中,能量越大,意味着分子和原子越不稳定,当能量越低时,原子越稳定。
云深无际
2021/04/14
1.4K0
模拟退火算法小谈
数学建模--智能算法之模拟退火算法
模拟退火算法(Simulated Annealing,SA)是一种基于物理退火原理的元启发式优化算法,广泛应用于数学建模中的各种优化问题。其基本思想是通过模拟固体在高温下逐渐冷却的过程,来寻找全局最优解或近似最优解。
用户11315985
2024/10/16
4160
数学建模--智能算法之模拟退火算法
模拟退火算法从原理到实战【基础篇】
  模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。根据Metropolis准则,粒子在温度T时趋于平衡的概率为e-ΔE/(kT),其中E为温度T时的内能,ΔE为其改变量,k为Boltzmann常数。用固体退火模拟组合优化问题,将内能E模拟为目标函数值f,温度T演化成控制参数t,即得到解组合优化问题的模拟退火算法:由初始解i和控制参数初值t开始,对当前解重
Angel_Kitty
2018/04/08
3.3K0
模拟退火算法从原理到实战【基础篇】
模拟退火算法(SAA)C语言与MATLAB实现
在介绍模拟退火算法之前,先介绍一下爬山法。爬山法是一种贪心算法。其目标是要找到函数的最大值,若初始化时,初始点的位置在C处,则会寻找到附近的局部最大值A点处,由于A点出是一个局部最大值点,故对于爬山法来讲,该算法无法跳出局部最大值点。若初始点选择在D处,根据爬山法,则会找到全部最大值点B。这一点也说明了这样基于贪婪的爬山法是否能够取得全局最优解与初始值的选取由很大的关系。
里克贝斯
2021/05/21
1.6K0
模拟退火算法(SAA)C语言与MATLAB实现
基于模拟退火算法(SA)的TSP(Python实现)
基于模拟退火算法(Simulated Annealing, SA)的TSP(Traveling Salesman Problem,旅行商问题),我们涉及一种用于解决TSP的启发式优化方法。TSP是一个经典的组合优化问题,旨在寻找一条最短路径,使得旅行商可以访问每个城市恰好一次并返回起点城市。
不去幼儿园
2024/12/03
1510
基于模拟退火算法(SA)的TSP(Python实现)
模拟退火算法最常见知识点详解与原理简介控制策略
一、模拟退火算法简介与原理 重点详细内容知识点总结 1. 模拟退火算法简介 模拟退火算法(Simulated Annealing, SA)是一种基于物理退火过程设计的全局优化算法。它最早由N. Metropolis等人在1953年提出,后来由S. Kirkpatrick等人在1983年成功引入组合优化领域。该算法通过模拟固体退火过程中的温度下降和粒子状态变化,在解空间中随机搜索目标函数的全局最优解。 2. 模拟退火算法的原理 模拟退火算法的思想来源于固体退火原理。在固体退火过程中,固体被加热到高温状态,内部粒子随温度升高变得无序,内能增大。然后逐渐冷却,粒子逐渐有序化,在每个温度下达到平衡态,最终在常温时达到基态,内能减为最小。模拟退火算法将这一过程应用于优化问题,通过赋予搜索过程一种时变且最终趋于零的概率突跳性,从而有效避免陷入局部极小并最终趋于全局最优。 3. Metropolis准则 Metropolis准则是模拟退火算法中的核心准则。它决定了粒子在温度T时从一个状态转移到另一个状态的接受概率。如果新状态的内能小于当前状态的内能,则无条件接受新状态;如果新状态的内能大于当前状态的内能,则以一定的概率exp(-ΔE/kT)接受新状态,其中ΔE为新状态与当前状态的内能差,k为Boltzmann常数,T为当前温度。
啦啦javy
2024/10/17
2980
【数学建模】模拟退火算法介绍及实现
模拟退火法的核心原理:当材料从状态i进入状态j时,若E(j)<=E(i),状态会被转移(E(i)=E(j));若为其他情况,状态会以小概率被转移。也就是说,模拟退火法是一个不断寻找新解和缓慢降温交替的过程。具体实现:
树枝990
2020/08/20
1.4K0
【数学建模】模拟退火算法介绍及实现
模拟退火算法
爬山算法的思想就是一个劲的找最优解,如果接下来的任何状态都比当前状态差,那么就停止
attack
2018/04/28
1.6K3
模拟退火算法
浅析模拟退火算法
前面几篇主要是解释仿生群体行为的启发式算法,而本文所述模拟退火算法则是一种通用的概率优化算法(虽然求解用到概率手段,但是得到的解往往是全局最优或次优的解),以下通过一些浅显的剖析来突出该算法的特点。其实谈到这个算法个人比较亲切,这是算是在原理上和我专业最接近的一个优化算法,它的原理主要是来自固体退火原理,其主要过程是将固体加温至充分高,再让其以一定的速度缓慢冷却。
用户7506105
2021/08/09
8070
退火算法Python编程
模拟退火算法借鉴了统计物理学的思想,是一种简单、通用的启发式优化算法,并在理论上具有概率性全局优化性能,因而在科研和工程中得到了广泛的应用。
花落花相惜
2021/11/25
1.2K0
模拟退火算法优化指派问题
之前二狗已经分别介绍过了,如何用模拟退火算法和遗传算法,进行背包问题的求解。其实背包问题是可以看成是一个可以看成是一个比较特殊的,有线性约束的,0-1规划问题。在数学中还有很多其他特殊的问题,比如指派问题。指派问题可以看成是更特殊的多个背包问题(很多个背包求优,每个背包只能装一样物品)。基本指派问题一般可以描述为有n个任务n个人。要求为n个任务分配给指定的人来完成。并且在这种基本情况下,人和任务需要是一一对应的关系。不能有重复,不能出现两个人做同一个任务,或者一个人同时做两个任务的情况。(这些情况也属于指派问题的范畴,但属于更加复杂的情况,今天就不做讲解)。指派问题已经有了明确可解的算法,也就是我们大家都知道的匈牙利算法。同样的,这个问题也可以使用模拟退火来解决。今天我们就使用模拟退火算法来为大家演示,如何在指派问题进行优化?
巴山学长
2019/07/15
1.4K0
模拟退火算法优化指派问题
【算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题
有若干个城市,任何两个城市之间的距离都是确定的,现要求一旅行商从某城市出发必须经过每一个城市且只在一个城市逗留一次,最后回到出发的城市,问如何事先确定一条最短的线路已保证其旅行的费用最少?
短短的路走走停停
2019/05/13
4.5K0
【算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题
01背包问题的模拟退火算法
话说王二狗家里着火了,现在他要把家里头值钱的东西一次性搬出去。但是他体力有限,最多只能扛得动36千克的东西。现在他家里的物品价值如下14;27;42;18;33;24;55;36;28;46;87;29。其中每件物品对应的重量如下3;6;8;4;7;5;12;8;5;7;17;5。
巴山学长
2019/07/15
2K0
01背包问题的模拟退火算法
优化算法——模拟退火算法
爬山法是一种贪婪的方法,对于一个优化问题,其大致图像(图像地址)如下图所示:
felixzhao
2019/02/13
1.4K0
旅行商问题的近似最优解(局部搜索、模拟退火、遗传算法)
TSP问题(Traveling Salesman Problem)是一个组合优化问题。该问题可以被证明具有NPC计算复杂性。
凝神长老
2021/04/16
1.1K0
旅行商问题的近似最优解(局部搜索、模拟退火、遗传算法)
解读最优化算法之模拟退火
模拟退火算法 ( simulated anneal , SA) 求解最优化问题常用的算法,今天应用 SA 解决一元多次函数最小值的例子解释 SA 算法。
double
2018/07/31
9900
模拟退火算法是什么?模拟退火算法的优点
在日常的生活当中,大家会遇见关于函数的问题,模拟退火算法就算是启发性算法的一种,下面我们对于模拟退火算法有一个简单的介绍。
用户8739990
2021/07/16
3.3K0
模拟退火算法是什么?模拟退火算法的优点
模拟退火(SA)算法求解Max-Minsum Dispersion Problem(附代码及详细注释)
先来看一个小故事,转自(链接:http://blog.csdn.net/fudan_abc/article/details/2052642),假如老板要你解决一个问题,你绞尽脑汁还是想不出来,叫天天不应,叫地地不灵,这时你走进老板办公室,可以采取3种策略:
短短的路走走停停
2021/02/03
1.5K0
模拟退火(SA)算法求解Max-Minsum Dispersion Problem(附代码及详细注释)
优化算法之模拟退火算法的matlab实现【数学建模】
在寻找最优解的过程中,我们常常想到最简单,最直接的办法是能不能把所有解全部求出,然后再从这些解中寻找最好的那一个。
巴山学长
2021/05/31
2.4K0
优化算法之模拟退火算法的matlab实现【数学建模】
Boltzmann机详解
我们知道,Hopfield神经网络拥有联想记忆的能力,这也是对生物神经网络的一种模拟。但是,Hopfield神经网络也和BP神经网络一样,有一个致命的缺陷:只能找到局部最优解,而无法沿着梯度上升的方向在全局的角度寻求全局最优解。 为了解决这个问题,1983年,Kirkpatrick等提出了模拟退火算法(SA)能有效的解决局部最优解问题。‘退火’是物理学术语,指对物体加温在冷却的过程。模拟退火算法来源于晶体冷却的过程,如果固体不处于最低能量状态,给固体加热再冷却,随着温度缓慢下降,固体中的原子按照一定形状排列,形成高密度、低能量的有规则晶体,对应于算法中的全局最优解。模拟退火算法包含两个部分即Metropolis算法和退火过程。Metropolis算法就是如何在局部最优解的情况下让其跳出来,是退火的基础。1953年Metropolis提出重要性采样方法,即以概率来接受新状态,而不是使用完全确定的规则,称为Metropolis准则,计算量较低。
全栈程序员站长
2022/09/14
1K0
Boltzmann机详解
相关推荐
模拟退火算法小谈
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验