模拟退火
模拟退火
模拟退火(,缩写作SA)是一种逼近给定函数全局最优的通用概率演算法,具体来说,它是一种元启发算法,常用来在一定时间内,寻找在一个很大搜寻空间中的近似全局最优解。在有大量局部最优解时,模拟退火算法可以找到全局最优解。
模拟退火常用于搜索空间离散的情形(如旅行推销员问题、布尔可满足性问题、蛋白质结构预测、作业车间调度问题等)。对于在固定时间内找到近似全局最优优先于找到精确局部最优的问题,模拟退货算法可能优于梯度下降法或分支顶界等精确方法。
模拟退火算法解决的问题包含多元目标函数与若干约束。实践中,约束可作为目标函数的一部分进行惩罚。
Pincus (1970)、Khachaturyan et al (1979, 1981)、Kirkpatrick、Gelatt及Vecchi (1983)、Cerny (1985)等人先后提出过类似技术。现在的“模拟退火”算法在1983年为S. Kirkpatrick, C. D. Gelatt和M. P. Vecchi解决旅行推销员问题所发明,V. Černý也在1985年独立发明此演算法。
模拟退火算法中的慢冷却是指在探索解空间的过程中,接受较差解的概率会缓慢下降。接受较差解可以更广泛地搜索全局最优解。总的来说,模拟退火算法的工作原理如下:温度从初始值逐渐降低到0,每个时间步长内,算法随机选择一个与当前解接近的解,并根据与温度相关的概率选择更优的。搜索过程中,这概率会趋近于1。
可通过求解概率密度函数的动力方程或随机采样法进行模拟。这种方法是N. Metropolis et al. (1953)发表的梅特罗波利斯-黑斯廷斯算法的改进版,是一种生成热力学系统样本状态的蒙特卡罗方法。
简介.
“模拟退火”来自冶金学术语退火,是将材料加热后再经特定速率冷却的技术,目的是增大晶粒的体积,并且减少晶格中的缺陷,以改变材料的物理性质。材料中的原子原来会停留在使内能有局部最小值的位置,加热使能量变大,原子会离开原来位置,而随机在其他位置中移动。退火冷却时速度较慢,使得原子有较多可能可以找到内能比原先更低的位置。
模拟退火的原理也和金属退火的原理近似:我们将热力学的理论套用到统计学上,将搜寻空间内每一点想像成空气内的分子;分子的能量,就是它本身的动能;而搜寻空间内的每一点,也像空气分子一样带有“能量”,以表示该点对命题的合适程度。演算法先以搜寻空间内一个任意点作起始:每一步先选择一个“邻居”,然后再计算从现有位置到达“邻居”的概率。
可以证明,模拟退火算法所得解依概率收敛到全局最优解。
模拟退火法可用于精确算法失效的高难度计算优化问题,虽然通常只能获得全局最优的近似,但对很多实际问题已经足够。
描述.
物理系统的热力学状态"s",以及要最小化的函数formula_1(类似于系统当前状态下的内能)。目标是将系统从任意初始状态带到内能尽可能小的状态。
基本迭代.
模拟退火启发式在每一步都会考虑当前状态"s"的某邻态formula_2,并以概率决定是否移动到状态formula_2。概率最终引导系统进入低能状态。这步骤一般会重复进行,直到系统达到满足需求的状态,或达到预设的计算量。
状态的邻域.
解的优化包括计算问题状态的邻域,即由保守改变现状态产生的新状态。例如,在旅行推销员问题中,状态是待访问城市的排列,状态的邻域是交换任意两城市产生的排列集合。良定义的到邻态的方法称为移动,不同移动会产生不同的邻态集。
爬山算法之类启发法逐个寻找更好的邻态来移动,并在无更好邻态时停止,显然这很容易陷入局部最优。元启发算法利用解的邻域作为探索解空间的一种方式,虽然更喜欢较好的邻态,但也接受较差的邻态,以免陷入局部最优。若运行时间够长,则可以找到全局最优。
接受概率.
从现状态"s"转移到候选的新状态formula_4的概率由接受概率函数(acceptance probability function)formula_5确定,其取决于两状态的能量formula_6,以及称作温度的全局时变参数"T"。转移到能量更小的状态的概率更大。概率函数"P"在formula_7时也是正的,这可以防止算法陷入局部最优。
"T"趋近于0时,若formula_8,概率formula_5也要趋近于0或某正值。对足够小的"T",系统会越来越倾向于“下山”(向低能值移动)而避免“上山”。formula_10时,程序将简化为贪心算法,只进行下山转移。
在模拟退火的原始描述中,formula_11时概率formula_12,即无论温度如何,程序找到下山的方法时总会下山。许多模拟退火算法的描述和实现仍将此条件作为方法定义的一部分,但这条件实际上并非必须。
"P"函数通常是这样选择的:当差值formula_13增加时,接受较小上山转移的概率就会比较大的更大。不过,在满足上述要求的前提下,这要求并非绝对必要。
鉴于这些特性,温度"T"在控制系统状态"s"演化方面起到关键作用,因为它对系统能量变化非常敏感。确切地说,"T"的大小决定着"s"演化敏感的“粒度”。
退火历程.
算法名称与灵感要求嵌入一个与温度有关的有趣特征。开始时,温度"T"被设为一个较大值(或无穷大),按用户指定的退火历程,每次迭代降温,但必须在一定时间预算内结束为formula_10。这样,预计系统最初会在搜索空间中包含良好解的广阔区域内游荡,忽略能量函数的微小特征;然后,向能量更低的区域漂移,最后根据梯度下降法启发式向下移动。
对任意给定的有限问题,随着退火历程延长,模拟退火算法以全局最优解终止的概率趋近于1。但这理论结果并不很有用,因为确保显著成功概率的耗时通常大于暴力搜索整个解空间的耗时。
伪代码.
寻找能量 formula_1 最低的状态 formula_16
s := s0; e := E(s) // 设定目前状态为s0,其能量E (s0)
k := 0 // 评估次数k
while k emin // 若还有时间(评估次数k还不到kmax)且结果还不够好(能量e不够低)则:
sn := neighbour(s) // 随机选取一邻近状态sn
en := E(sn) // sn的能量为E (sn)
if random() * 自适应模拟退火
延伸阅读.