核心思想
模拟退火十分好写,它的核心思想就是:
每一次降温都可以从当前状态转移到另一种相近状态(没有严格定义,可以自己想产生相近解的方法)
如果那个相近状态的答案更优,当然转移到那种状态!
但如果更劣,也需要一定的概率转移到那种状态(防止陷入局部最优解)
那个概率就是:
[P=e^{frac{nowVal-nextVal}{T}}
]
这里的T就是当前温度,Val是对应状态的答案
要注意(frac{nowVal-nextVal}{T})是一个负值,因此必定有(0<P<1)
可以看出,当那种相近状态越劣((nowVal-nextVal)越小),就有越小的概率转移到那种状态
而当前温度越低,也是越稳定的
(这里针对的是答案越小越优的题目)
参数设置
模拟退火是一个十分依赖参数的随机化算法,大致有以下几个参数
①初始温度(startT)
②温度变化率(deltaT)
③温度下限(lowT)
④随机种子(seed)
初始温度大致可以设在100~10000,防止一开始活跃性太高,陷入太劣的解
温度变化率宜设置在0.99~0.999
温度下限可以很小,大概在1e-15~1e-10之间
至于(seed)...
大致流程
综上,模拟退火的大致流程就是:
①初始化温度
②产生相近状态
③利用上述方法判断是否转移,并同时改变记录的答案值
④降温,goto ②
直到温度低于下限结束
最后说一下,四个参数的调整对算法效率影响很大,可以自己做题体会一下
例题
提供几道例题练手
[JSOI2004]平衡点
[NOIp提高组2017]宝藏