现代优化算法:模拟退火

本文主要内容摘自《数学建模算法与应用》以及网上各类博客

模拟退火算法

算法简介

       模拟退火算法得益于材料的统计力学的研究成果。统计力学表明材料中粒子的不同结构对应于粒子的不同能量水平。在高温条件下,粒子的能量较高,可以自由运动和重新排列。在低温条件下,粒子能量较低。如果从高温开始,非常缓慢的降温(这个过程被称为退火),粒子就可以在每个温度下达到热平衡。当系统完全被冷却时,最终形成处于低能状态的晶体。

如果用粒子的能量定义材料的状态,Metropolis算法用一个简单的数学模型描述了退火过程。假设材料在状态i之下的能量为E(i),那么材料在温度T时从状态i进入状态j就遵循如下规律:

(1)如果E(j)≤E(i),接收该状态被转换。

(2)如果E(j)>E(i),则状态转换以一定概率被接受,并且可以证明这个概率为:e^[(E(i)-E(j))/(KT)],其中K为物理学中的玻尔兹曼常数,T为材料温度。

我们考虑一个例子从而更抽象的理解这一过程(图片来源于https://www.cnblogs.com/flashhu/p/8884132.html

假如我们需要从这个毫无规律的函数中找到函数的最低点。众所周知,对于一个无法在多项式复杂度的算法下完成求解过程的问题,我们通常会去寻找一种贪心算法,使得不断的向更优的情况靠近。

       比如上图从A点出发,基于贪心策略,我们往往能够找到局部最优解B点,但很显然,这并不是全局最优解。这类方法的局限性在于找到的局部最优解,但是假设其并不是全局最优解的话,这类算法并不能跳出来去寻找更优的解。

       我们回顾下之前介绍的模拟退火的原理,可以发现,即使现在找到了局部最优解,我们仍然有一定概率跳出去寻找更优的解。并且可以证明,在重复执行模拟退火足够多次数的情况下,我们往往能够找到全局最优解。

重要参数

在模拟退火算法中,重要的几个参数有:

T:温度;△T:温度变化率,每次温度等于上一次温度乘上△T,实际应用时一般取0.95~0.99;x:当前选择的解;

△x:解变动值;x1:当前的目标解,x1=x+△x;△f:当前解的函数值与目标函数值之差,等于f(x)-f(x1)。

实现过程

       我们给一个初始解x,并让它不断变动。要模拟变动的大小随温度的降低而降低,我们每次的△x应该在一个大小与T成正比的值域内随机取值。这时候我们就要考虑是否将当前解变为目标解。因为我们还是需要贪心,如果f(x1)<f(x),那么接受目标解,并令x=x1,如果f(x1)>f(x)时,我们需要以一定概率接受它,这样才能跳出局部的限制,去搜寻更优的解,弥补贪心的局限性。这个概率即为之前介绍算法所说的:e^(△f/T),K=1。不断重复以上过程,知道T趋近于0,这时候我们认为当前的x就是最优解。

注意

(1)理论上,降温过程要足够缓慢,要使得在每一温度下达到热平衡。但在计算机实现中,如果降温速度过缓,所得到的解的性能会较为令人满意,但是算法会太慢,相对于简单的搜索算法不具有明显优势。如果降温速度过快,很可能最终得不到全局最优解。因此使用时要综合考虑解的性能和算法速度,在两者之间采取一种折衷。

(2)要确定在每一温度下状态转换的结束准则。实际操作可以考虑当连续 m 次的转换过程没有使状态发生变化时结束该温度下的状态转换。最终温度的确定可以提前定为一个较小的值Tm ,或连续几个温度下转换过程没有使状态发生变化算法就结束。

(3)选择初始温度和确定某个可行解的邻域的方法也要恰当。

实例

洛谷P1337 [JSOI2004]平衡点 / 吊打XXX

持续更新....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值