zoukankan      html  css  js  c++  java
  • 模拟退火学习总结

    模拟退火简述

    模拟退火适用的问题通常是一些求最优解的问题

    比如,把问题抽象地看成一个长成这样的毫无规律的函数,而最优解就是函数的最低点

    众所周知,对于一个没有办法在多项式复杂度的算法下完成求解的问题,我们通常会想到一种简单粗暴的方法——贪心

    选择问题的某一个状态,然后不断向更优的情况靠近

    比如从A出发,可以获得局部最优解B,但这显然不是全局最优解

    显然,这样做的局限性是,过于局限在局部的一个凹部分而无法跳出去去寻找更优的解

     原理

    为了解决这一问题,科学家们想到了物理的退火降温的过程——

    一个处于很高温度的物体,现在要给它降温,使物体内能降到最低。

    我们常规的思维是,越快越好,让它的温度迅速地降低。

    然而,实际上,过快地降温使得物体来不及有序地收缩,难以形成结晶。而结晶态,才是物体真正内能降到最低的形态。

    正确的做法,是徐徐降温,也就是退火,才能使得物体的每一个粒子都有足够的时间找到自己的最佳位置并紧密有序地排列。开始温度高的时候,粒子活跃地运动并逐渐找到一个合适的状态。在这过程中温度也会越降越低,温度低下来了,那么粒子也渐渐稳定下来,相较于以前不那么活跃了。这时候就可以慢慢形成最终稳定的结晶态了。

    那么,我们可不可以把找到最优解,与形成结晶态,这两个过程联系在一起呢?

    于是,模拟退火诞生了。

    百度百科词条

    模拟退火算法(Simulate Anneal,SA)是一种通用概率演算法,用来在一个大的搜寻空间内找寻命题的最优解。模拟退火是由S.Kirkpatrick, C.D.Gelatt和M.P.Vecchi在1983年所发明的。V.Černý在1985年也独立发明此演算法。模拟退火算法是解决TSP问题的有效方法之一。

    模拟退火的出发点是基于物理中固体物质的退火过程与一般组合优化问题之间的相似性。模拟退火算法是一种通用的优化算法,其物理退火过程由加温过程、等温过程、冷却过程这三部分组成。

    模拟退火的原理也和金属退火的原理近似:将热力学的理论套用到统计学上,将搜寻空间内每一点想像成空气内的分子;分子的能量,就是它本身的动能;而搜寻空间内的每一点,也像空气分子一样带有“能量”,以表示该点对命题的合适程度。演算法先以搜寻空间内一个任意点作起始:每一步先选择一个“邻居”,然后再计算从现有位置到达“邻居”的概率。

    实现过程

    我们需要设定这几个参数,模拟退火过程

    1. T——温度
    2. ΔT——温度变化率,每次温度等于上一次温度乘上ΔT,实际应用时一般取0.950.99,模拟徐徐降温

    再定义一些量

    1. x——当前选择的解
    2. Δx——解变动值
    3. x1——当前的目标解,等于x+Δx
    4. Δf——当前解的函数值与目标解函数值之差,等于f(x)f(x1)

    我们给一个初始解x,并让它不断变动。要模拟变动的大小随温度的降低而降低,我们每次的Δx应该在一个大小与TT成正比的值域内随机取值。

    这时候我们就要考虑是否将当前解变为目标解。因为我们还是需要贪心,所以如果f(x1)<f(x),那么接受目标解,x=x1

    那如果f(x1)>f(x)呢?我们当然要以一定概率接受它啦,这样才能跳出局部的限制,去搜寻更优的解,弥补贪心的局限性。那么这个概率应该是多少呢?同样要模拟变动的大小随温度的降低而降低。科学家经过理论分析,得出这个概率应该是exp(ΔE/T)

    如此反复选择直到T趋近于0(可以设一个EPS)这时候我们认为我们当前的x就是最优解

    用图片来描述的话,就拿上面那个图像寻找最优解为例

    首先经过大幅波动,当前解由A->B->C,找到了一个比较满意的解。

    但还不能满足。由于温度还比较大,此时接受了一些不比当前解优的目标解,C->D->E,成功地爬了上去。而温度还在慢慢减小。

    终于,发现了一个更优解F,成功跳出了那个非常宽的局部凹函数

    这时候,温度越来越小了,很难再次接受不比当前解优的目标解,再次翻出去。解终于渐渐趋于稳定,并最终到达了G,找到了最优解

    如此看来,基于随机的模拟退火能很大程度上提高正确率,但也不可能完全正确。上面的例子只是随意模拟出的一个情况。所以要多跑几遍,取每一次得到的解的最优值。

    大致过程如下:

     

     可以看出,随着温度的降低,解逐渐稳定下来,并逐渐集中在最优解附近。

    接受劣解的概率

    这里用到Metropolis准则。简单说来,假设我们的目标是求最小值,如果 E与 E0​的差,也就是 ΔE小于 0,我们就接受当前解,因为它优于之前的最优解嘛。而如果 ΔE大于 0,也就是我们遇到了一个更劣的解,我们也要以一定的概率来接受它,因为我们要找的一个多峰函数的全局最小值,因此就不能局限于一个局部的凹函数。而这个概率是exp(ΔE/T)

     我个人对于这个概率的理解是这样的:对于 ΔE,如果它较大,即我们遇到了一个劣得多的解,那我们接受它的概率就相对较小,因为 -ΔE较小嘛;而如果 ΔE较小,即我们遇到了一个较劣的解,我们接受它的概率就较大,因为 −ΔE较大。对于 T,随着时间的增加, T变得越来越小,因此我们把 −ΔE除以T,这样接受的概率就随着温度的降低而越来越小,因为 −ΔE是一个负数嘛。而对于整个式子,当 T较大的时候,我们会接受大部分的解,当 T较小的时候,我们就只会接受 ΔE较小的解。

    Metropolis算法证明

    假设材料在状态之下的能量为E(i),那么材料在温度 T 时从状态 i 进入状态 j 遵循如下规律:

    • 如果 E(i) ≤ E(j),则接受该状态被转换。

    • 如果 E(i) > E(j),则状态转换以如下概率被接受:

     

    其中, 是玻尔兹曼常数, T 是材料温度。    

    在特定温度下,经过充分的转换以后,材料达到热平衡。这个时候材料处于状态i的概率满足玻尔兹曼分布:

     

    其中, X 表示材料当前状态的随机变量, S 表示状态空间集合。

    那么,当温度非常高时,

    其中,|S| 表示集合 S 中状态的数量。

    这表示,在温度无限大的情况下,所有状态的出现概率相同。

    而当温度下降到很低时,设:

     那么:

    其中:

     

      E2 为仅次于 Emin 的最低能量状态,所以:

     

    也就是说:

    当温度降到极低时,材料进入最小能量状态的概率为1!

    因此,如果我们运用退火思想放在优化问题上,在降温过程中问题的解进行充分地“热交换”,即进行充分地重新排列,同样可以帮助我们寻找最优解,理论上也会具有达到全局最优解的性能

    分块模拟退火

    我们发现,有时候模拟退火是不适用的,比如这种情况:

     

    此时函数的峰特别多,所以我们要用分块模拟退火的做法。

    大致算法是:将其分为几块,然后对每块跑一遍SA,最后再合并答案。

    这里块的数量不是

    而是一个比较小的数,要根据不同的题用不同的大小

  • 相关阅读:
    未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker
    .net remoting 尝试
    上传图片时获取所传图片大小
    图象处理算法(二)
    对CollapablePanel控件的改进
    一个简单的网页计数器
    ValidateBox控件使用Ajax改进
    图象处理算法(四)
    常用技巧(一)
    在Asp.Net里使用自定义映射进行重定向
  • 原文地址:https://www.cnblogs.com/e-e-thinker/p/13780242.html
Copyright © 2011-2022 走看看