模拟退火
本文提到的某些概念仅是个人的理解,并不意味着严格或主流的定义
算法简述
模拟退火是经典的乱搞搜索之一,用来找出系统的较优甚至最优状态,其主要思想是给予系统一定的“初始温度”,逐渐“降温”,直到降至“合适温度”,在此过程中用随机化的方法使系统找到一个合适的状态。
模拟退火源自于物理上的退火,举两个例子:
1、在炼钢时,需要将高温的钢材冷却至常温,也就是退火,但是退火不能过快,否则会导致钢材品质下降,而如果慢慢退火,则能得到优质钢材,这是因为,在越高的温度下,分子的运动越活泼,缓慢的退火能给予分子充足的时间与活力去寻找一个合适的位置,并逐渐趋于稳定,而快速的退火则得不到充足的机会去调整自身状态。
2、在生物领域,我们可以在高温下使DNA分子失活,氢键断裂出现两个DNA单链,这时候缓慢退火,DNA分子则会重新合并,而快速的退火,最终得到的仍然是两个DNA单链,道理跟上一个例子相同,缓慢的退火使得DNA分子有充足的时间去配对或解除配对,最终恢复原状。
在计算机领域,我们可以模拟上述过程,去解决一些问题(这类问题使用非随机的算法往往得不到多项式时间复杂度)。
具体实现
参照上诉两则例子与流行资料,我们可以总结出下列通用过程:
0、设置系统的初始状态(往往是随机混乱的,也可使用贪心去得到一个较优初始状态,但在个别情况下这是不必要甚至不可取的)
1、设定一个初始温度 T = Tm
2、调整状态一次,调整的幅度与关于T单调递减如果状态比原来更优则采取,并保存,否则以 exp(-Δans/T) 的概率采取
3、降温, T = T * delta,如果T > eps 则重复 1 - 2 过程,否则跳出
4、将得到的当前最优解作为初始状态,多次重复 1 - 3
5、得到理想的解
解释上述几个参数:
1、Tm,初始温度,常量,这个值越大,退火需要时间越长,但也会导致系统活性过大。
2、T,实时温度,变量,影响的当前系统的活性(调整幅度以及接受当前较差解的概率)。
2、eps,最终跳出的温度,常量,也就是说,当 T < eps,退火结束。
4、delta,与降温速度相关的参数,常量,主流采取了一个小于且接近 1 的数字,每次 T *= delta。 不过,是否可以使用的一个较大的数字,使得每次 T -= delta,本人目前还不清楚。
5、ans 与 Δans,变量,ans 是对当前系统的一个混乱程度的评分(即解越差 ans 越高),Δans 则是在接受较差解后评分变化量,显然 Δans >= 0,在 exp(-Δans/T) 中,Δans 越接近 0 ,或 T 越大,函数值越接近 1。
关于常量参数的设置
刚才我们解释了五个参数的作用,其中变量是跟着常量的设置与系统状态走的,我们不能直接管控,但是在三个常量的设置上则多少需要花点心思了。
很明显的是,Tm(x) 与优秀程度(y)所成的函数是趋于平缓的,其导数趋近于 0 。 在不太严谨的意义下,我们可以认为 Tm 存在一个最适值,如果 Tm 大于了他的最适值,那么在他降温到最适值之前,系统始终是非常混乱的,因为在大于 Tm 最适值的温度下,系统总是接受任何一个调整,无论好坏。所以我们认为,在达到最适值之前的努力意义甚微,而且浪费了一定时间。 影响 Tm 最适值的有系统的复杂度 以及 delta 的设置。
delta 一般设置为0.997 到 0.999, 事实上这要跟着 Tm 与系统复杂度走。
eps 的设置不太重要,通常为 1e-15 或者更小,他与 Tm 不太一样,毕竟,eps 如果设置的小一点,万一能在最后忽然找到最优解呢
几个题目
进阶一:Coloring
进阶二:[HAOI2006]均分数据
最终极:[NOI2010]成长快乐 这道题洛谷的SPJ估计有问题,但是暂时没在其他OJ上找到,读者自己把 checker 下载下来本地评过了就好了。
题解什么的之后再说吧。
原文地址:https://www.cnblogs.com/cjrsacred/p/9136446.html