模拟退火(Simulate Anneal)算法

算法介绍

模拟退火算法(Simulate Anneal,SA)是一种通用概率演算法,用来在一个大的搜寻空间内找寻命题的最优解。美国物理学家 N.Metropolis 和同仁在1953年发表研究复杂系统、计算其中能量分布的文章,他们使用蒙特卡罗模拟法计算多分子系统中分子的能量分布。
模拟退火的出发点是基于物理中固体物质的退火过程与一般组合优化问题之间的相似性。模拟退火算法是一种通用的优化算法,其物理退火过程由加温过程、等温过程、冷却过程这三部分组成。


启发来源

在热力学上,退火(annealing)现象指物体逐渐降温的物理现象,温度愈低,物体的能量状态会低;够低后,液体开始冷凝与结晶,在结晶状态时,系统的能量状态最低。大自然在缓慢降温(亦即,退火)时,可“找到”最低能量状态:结晶。但是,如果过程过急过快,快速降温(亦称「淬炼」,quenching)时,会导致不是最低能态的非晶形。
如下图所示,首先(左图)物体处于非晶体状态。我们将固体加温至充分高(中图),再让其徐徐冷却,也就退火(右图)。加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小(此时物体以晶体形态呈现)。
sa-1
似乎,大自然知道慢工出细活:缓缓降温,使得物体分子在每一温度时,能够有足够时间找到安顿位置,则逐渐地,到最后可得到最低能态,系统最安稳。


爬山算法

爬山算法是一种Greegy算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。
pashan
如上图:从A开始迭代搜索解空间,寻找最优解,但是该算法采用的是贪心策略,所以当搜索到B点时,发现再往后小幅度移动搜索时,不能得到比B点更好的结果了,至此停止了搜索,陷入到局部最优解的问题中。


模拟退火

介绍了以上的爬山算法,这种贪心算法往往得到的解并不是解空间中的全局最优解,如何有效的避免陷入局部最优解中,模拟退火算法应运而生。
其实模拟退火算法也是一种Greedy算法,但是在搜索最优解过程中,加入了随机的因素,一定的概率接受一个比当前解要差的解,故此,存在一定的概率跳出局部最优解,从而找到真正的全局最优解。

  • 算法流程
    • 由一个产生函数从当前的解空间 { x 1 , x 2 , x 3 , . . . , x n } \{x_1, x_2, x_3, ..., x_n\} { x1,x2,x3,...,xn}中产生一个新解(一般采用随机方法生成新解,比如交换顺序等)。
    • 使用目标函数 f ( x ) f(x) f(x),计算出新解对应的目标值 f ( x n e w ) f(x_{new}) f(xnew)
    • 判断新解是否可以采纳,变成当前的解。采纳采用的准则——Metropolis准则:
      p =
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于模拟退火算法的实现需要根据具体问题进行调整,因此下面只提供一个基本框架,需要根据具体问题进行修改。 ``` public class SimulatedAnnealing { // 定义初始温度、终止温度、冷却速率等参数 private double initialTemperature; private double finalTemperature; private double coolingRate; // 定义当前温度和当前状态 private double currentTemperature; private State currentState; public SimulatedAnnealing(double initialTemperature, double finalTemperature, double coolingRate) { this.initialTemperature = initialTemperature; this.finalTemperature = finalTemperature; this.coolingRate = coolingRate; } // 计算能量差 private double getEnergyDifference(State newState) { // 根据具体问题计算能量差 // 例如,如果是TSP问题,则计算新路径长度与旧路径长度的差值 // 如果是函数优化问题,则计算新函数值与旧函数值的差值 } // 判断是否接受新状态 private boolean acceptNewState(State newState) { double delta = getEnergyDifference(newState); if (delta < 0) { return true; // 新状态能量更低,直接接受 } else { double probability = Math.exp(-delta / currentTemperature); return Math.random() < probability; // 根据概率接受新状态 } } // 生成邻近状态 private State generateNewState() { // 根据具体问题生成邻近状态 } // 执行模拟退火算法 public State simulate(State initialState) { currentState = initialState; currentTemperature = initialTemperature; while (currentTemperature > finalTemperature) { State newState = generateNewState(); if (acceptNewState(newState)) { currentState = newState; } currentTemperature *= coolingRate; } return currentState; } } ``` 其中,`State`表示当前状态,需要根据具体问题进行定义。`generateNewState()`方法需要根据具体问题生成邻近状态。`getEnergyDifference()`方法需要根据具体问题计算能量差。在`acceptNewState()`方法中,需要根据Boltzmann分布计算接受概率。在`simulate()`方法中,需要循环执行退火过程,直到温度降至终止温度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值