浅谈模拟退火
核心思想
模拟退火十分好写,它的核心思想就是:
每一次降温都可以从当前状态转移到另一种相近状态(没有严格定义,可以自己想产生相近解的方法)
如果那个相近状态的答案更优,当然转移到那种状态!
但如果更劣,也需要一定的概率转移到那种状态(防止陷入局部最优解)
那个概率就是:
\[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]宝藏