SA中的温度标度

时间:2013-05-26 21:57:42

标签: simulated-annealing

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

我使用的是经典公式:

if(delta < 0 || exp(-delta/tK) > random()) { // new state }

exp函数的输入为负,因为delta / tK为正,因此exp结果总是小于1. random函数也返回0到1范围内的值。

我的测试数据在1到20的范围内,delta值低于20.我选择一个等于系统初始计算温度的起始温度,然后线性下降到1.

为了让SA工作,我必须扩展tK。工作版使用:

exp(-delta/(tK * .001)) > random()

那么tK的大小与三角洲的大小有什么关系?我通过反复试验找到了缩放因子,我不明白为什么需要它。据我所知,只要delta> tK和步长以及迭代次数是合理的,它应该工作。在我的测试案例中,如果我省略额外的比例,系统的温度不会降低。

我看过的各种在线资源都没有说明使用真实数据。有时它们包括玻尔兹曼常数作为比例,但因为我没有模拟物理粒子系统没有帮助。示例(通常使用伪代码)使用100或1000000之类的值。

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

1 个答案:

答案 0 :(得分:0)

Classical SA有2个参数:startingTemperate和cooldownSchedule(=你称之为缩放)。

配置2+参数很烦人,所以in OptaPlanner's implementation,我会根据timeGradiant自动计算cooldownSchedule(在求解器时间内,它是从0.0到1.0的两倍)。这很好用。作为startingTemperature的指导原则,我使用单次移动的最大得分差异。有关详细信息,请参阅the docs