如果贪心是一只兔子不断往目标跳去,那模拟退火就是一只喝醉的兔子不停乱跳
SA 算法的基本思想是用马尔可夫链的形式进行随机搜索,它不仅接受改善目标函数的变化,而且还能保留一些不理想的变化。
对于改善目标函数的变化直接转移
对于不理想的变化,发生转移的概率为
其中为当前温度,为玻尔兹曼常数,为了方便计算可设
需要设定的参数为初温,末温,和降温系数
适当的温度至关重要
若过大,几乎所有转移都会被接受
若过小,几乎所有不理想的转移均无法被接受,算法将会变为贪心,容易陷入局部最优解
此外,优秀的状态产生函数和状态评估函数将会提高SA的效率最好是能面向数据编程
放一张Wiki的动图
有了SA这题就好写了
状态生产函数采用随机交换两个元素
状态评估函数采用动态规划
设为前i 个分成j 组的最小
调参调了很久