模拟退火算法全解(Simulated Annealing)文末有源码

模拟退火算法全解(Simulated Annealing

金属退火

一种金属热处理工艺:将金属缓慢加热到一定温度,保持足够时间,然后以适宜速度(一般是缓慢冷却)冷却。退火后使得金属具备一些之前没有的特性,比如:降低硬度、改善切削加工性,细化晶粒,消除组织缺陷等,具体可百度。

在这里插入图片描述

所以,整个退火过程可以分为三个过程:

  1. 升温过程:增强粒子的热运动,消除系统原先可能存在的非均匀态;
  2. 等温过程:对于与环境换热而温度不变的封闭系统,系统状态的自发变化总是朝自由能减少的方向进行,当自由能达到最小时,系统达到平衡态。
  3. 冷却过程: 使粒子热运动减弱并逐渐有序,系统能量逐渐下降,从而得到低能的晶体结构。
    再整个退火过程中,内能不断降低,最终达到最小内能(目标函数值)

算法机制

模拟退火算法起源:美国物理学家 N.Metropolis 和同仁在1953年发表研究复杂系统、计算其中能量分布的文章,他们使用蒙特卡罗模拟法计算多分子系统中分子的能量分布。这相当于是本文所探讨之问题的开始,事实上,模拟退火中常常被提到的一个名词就是Metropolis准则,后面我们还会介绍。

爬山算法

爬山算法是一种十分简单的贪婪搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。
在这里插入图片描述

比如上图中,当前解是C点,那么做一个局部搜索,它可能找到G点(注意这里是寻找最大值),,然后再从G点搜索,可能会找到D点,但是D点两侧的值都小于D点,所以它可能就认为D点为最大值,从而陷入了局部最优解。

模拟退火

模拟退火机制则在一定程度上避免陷入局部最优的情况,与爬山算法不同,在局部搜索即使找到一个比当前解差的解,也会以一定的概率跳到这个解上,从而避免了陷入局部最优。

网络上对于爬山算法和模拟退火算法有一个比喻:
爬山算法:兔子朝着比现在高的地方跳去。它找到了不远处的最高山峰。但是这座山不一定是珠穆朗玛峰。这就是爬山算法,它不能保证局部最优值就是全局最优值。(非常懒惰,一开始看到“最高的就接受了”)
模拟退火算法:兔子喝醉了。它随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,它渐渐清醒了并朝最高方向跳去。这就是模拟退火。
其实我觉得这个比喻对于理解模拟退火算法的局部最优的时候,也会以一定的概率跳出当前值,但我认为这个比喻还不能很好的说明模拟退火的细节,所以我们再接着看下边的流程。

在学习算法流程前,我们再来了解一下,算法中更新解的方式——Metropolis准则判断

Metropolis准则判断

刚才说了,对当前解加随机扰动,得到一个新的解,那要不要接受这个解呢?模拟退火算法则使用的蒙特卡洛判断准则,这也是模拟退火算法的灵魂。在这里插入图片描述
在上式中,P为接受新解的概率。比如,当前解是x_t,对应的系统能量(目标函数)为E_t,局部搜索后,产生新解x_t+1,那要不要接受这个新解呢?判断准则就是上边的这个公式。

根据上边这个公式,我们可以看出(注意此处是寻找最小值):

当新解对应的目标函数小于当前解的目标函数值的时候,一定会接受新解(接受新解的概率为1);

当新解对应的目标函数大于当前解的目标函数值的时候,则以一定的概率接受新解,你再看细点,当其他变量一定的情况下,新解对应的目标函数值超过当前解目标函数值越多,则接受这个新解的概率越小(想一想,这是不是正好符合我们的直观感觉);此外,接受新解的概率还受到降温系数k和初始温度T的影响。

模拟退火算法流程

既然叫模拟退火算法,那就模拟的退火的过程,那算法的流程应该和退火的过程相一致。
回顾一下退火过程,在降温过程中实际上是分为两个层次的:
层次一:每降到一个温度时,会涉及到一个等温过程,见第一部分;
层次二:温度不断下降,直至达到我们指定的温度

那对应的模拟退火算法也是这样的:

  1. 一开始要给定一个相对较高的初始温度T,产生一个初始解 x 0 x_0 x0(可以采用随机产生),计算对应的目标函数值 E ( x 0 ) E(x_0) Ex0

  2. 令T=kT,其中k是0-1的值,为温度下降系数

  3. 对当前解 x t x_t xt做随机扰动,在其领域内产生一个新解 x ( t + 1 ) x_(t+1) x(t+1),计算出其对应的函数值,根据上述蒙特卡洛判断准则进行判断是否接受新解;

  4. 在温度T下,迭代L次扰动和接受过程。(其实这里的L次被叫做马尔科夫链的长度)

  5. 判断是否到达终止温度,若到达,则终止,否则返回步骤2;

流程图如下:

在上述算法流程图中,外部的绿色线框则表示退火中的降温过程,内部的橙色线框则表示退火过程中的等温过程,结合最初对金属退火过程的理解是不是更好容易理解一点。

控制参数

该算法涉及到的各项控制参数和各个需要自行给定的变量如下表所示。

参数意义
T初始温度
L马尔科夫链的长度,即等温过程的迭代次数
k温度下降速率,为0-1之间的数
T 终 T_终 T算法停止温度
x 0 x_0 x0初始解

上述很多参数都是需要多次调优,得到最优的参数匹配才可的。

算法特点

  1. 初始温度和马尔科夫链长度的设置问题。理论上来说,初始温度越高,且马尔科夫链越长,算法搜索越充分,得到全局最优解的可能性越大,但这也以为这需要耗费更多的计算时间。这个可以在算法里使用控制变量法进行测试。
  2. 退火问题。温度下降速率k越小,温度下降就越快,对应的迭代次数就越少,这样就可能导致得不到全局最优解;此外,到后期温度衰减很慢,对于这一点,我们可以将温度下降系数k设置为动态的,即随着温度的下降,温度下降系数也不断降低,比如k = 0.99k,以加快后期温度下降,加快算法收敛。
  3. 扰动算子。扰动不宜过大,这样可能会错过全局最优解。
    置为动态的,即随着温度的下降,温度下降系数也不断降低,比如k = 0.99k,以加快后期温度下降,加快算法收敛。
  4. 扰动算子。扰动不宜过大,这样可能会错过全局最优解。

源码请移步微信公众号“运筹帷幄Q”,关注后回复“模拟退火”即可获得。

  • 15
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值