2013-05-26 101 views
0

首先,這不是關於溫度迭代計數或自動優化調度的問題。這就是數據大小如何與冪運算的縮放關係。SA中的溫度標度

我使用的經典公式:

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

輸入到EXP功能是負的,因爲增量/ TK是正的,所以EXP結果總是小於1,隨機函數也返回一個值在0到1範圍內。

我的測試數據是在1至20範圍內,和所述增量值是低於20。我挑選一個開始溫度等於系統的初始計算溫度和線性斜坡下降到1.

爲了爲了讓SA工作,我必須調整tK。工作版本使用:

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

那麼tK的大小與δ的大小有什麼關係?我通過反覆試驗發現了比例因子,我不明白爲什麼需要它。就我的理解而言,只要delta> tK,步長和迭代次數合理,它就可以工作。在我的測試案例中,如果省去額外的秤,系統的溫度不會降低。

我看過的各種在線資源都沒有提到使用真實數據。有時候他們把波爾茲曼常數作爲一個量表,但是因爲我沒有模擬一個沒有幫助的物理粒子系統。示例(通常使用僞代碼)使用100或1000000的值。

那麼我錯過了什麼?正在擴大我必須通過反覆試驗設定的另一個價值嗎?這是因爲我不想讓這個測試用例運行,我想了解這個算法,而魔術常量意味着我不知道發生了什麼。

回答

0

古典SA有2個參數:startingTemperate和cooldownSchedule(=你稱之爲縮放)。

配置2+參數很煩人,所以in OptaPlanner's implementation,我根據timeGradiant自動計算cooldownSchedule(這是在解算器時間內從0.0增加到1.0的兩倍)。這很好。作爲起始溫度的指導方針,我使用單次移動的最大分數差異。有關更多信息,請參閱the docs