0

首先,这不是关于温度迭代计数或自动优化调度的问题。这就是数据量级与指数缩放的关系。

我正在使用经典公式:

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 等值。

那么我错过了什么?是否缩放另一个我必须通过反复试验设置的值?这让我很烦,因为我不只是想让这个测试用例运行,我想了解算法,而魔法常数意味着我不知道发生了什么。

4

1 回答 1

0

经典 SA 有 2 个参数:startingTemperate 和 cooldownSchedule(= 你所说的缩放)。

配置 2+ 个参数很烦人,所以在 OptaPlanner 的实现中,我会根据 timeGradiant 自动计算 cooldownSchedule(在求解器时间内从 0.0 到 1.0 的两倍)。这很好用。作为起始温度的指导,我使用单次移动的最大得分差异。有关更多信息,请参阅文档

于 2013-05-27T09:34:03.327 回答