首先,这不是关于温度迭代计数或自动优化调度的问题。这就是数据量级与指数缩放的关系。
我正在使用经典公式:
if(delta < 0 || exp(-delta/tK) > random()) { // new state }
exp 函数的输入是负数,因为 delta/tK 是正数,所以 exp 结果总是小于 1。random 函数还返回 0 到 1 范围内的值。
我的测试数据在 1 到 20 的范围内,增量值低于 20。我选择一个等于系统初始计算温度的起始温度,然后线性下降到 1。
为了让 SA 工作,我必须扩展 tK。工作版本使用:
exp(-delta/(tK * .001)) > random()
那么 tK 的大小与 delta 的大小有什么关系呢?我通过反复试验找到了比例因子,但我不明白为什么需要它。据我了解,只要 delta > tK 并且步长和迭代次数是合理的,它应该可以工作。在我的测试用例中,如果我省略了额外的刻度,系统的温度不会降低。
我看过的各种在线资源都没有提到使用真实数据。有时它们包括玻尔兹曼常数作为尺度,但因为我没有模拟一个没有帮助的物理粒子系统。示例(通常使用伪代码)使用 100 或 1000000 等值。
那么我错过了什么?是否缩放另一个我必须通过反复试验设置的值?这让我很烦,因为我不只是想让这个测试用例运行,我想了解算法,而魔法常数意味着我不知道发生了什么。