2011-03-06 82 views
1

我正在寫一個模擬退火程序,並且在調試時遇到了一些麻煩。任何的建議都受歡迎。如何更快地調試蒙特卡羅仿真?

首先,輸出是不確定的,所以我已經運行了一百次,查看平均值和標準偏差。

但是,它需要年齡和年齡(> 30分鐘)才能完成一個測試用例。

通常,我會盡量減少輸入,但減少迭代的次數會直接降低結果的準確性,但這種方式不是完全可預測的。例如,冷卻時間表是按照迭代次數縮放的指數衰減。減少單獨運行的次數使輸出非常不可靠(我試圖追捕的一個錯誤是運行之間的巨大差異)。我知道不成熟的優化是所有邪惡的根源,當然,在程序正確之前進行優化肯定還爲時過早,但我認真考慮重寫這是一種更快的語言(Cython或C),知道我爲了提交,我們必須將其移回Python。

那麼,有沒有什麼辦法比我現在有更好的測試模擬退火算法?還是應該在測試之間進行其他工作?

信息披露:這是課程作業的作業,但我並沒有要求您幫助我進行實際的模擬。

+0

你可以做很多日誌記錄,然後手動運行,直到找到出錯的地方。 – 2011-03-06 00:54:08

+0

你可能想要分析你的代碼,看看什麼是如此之慢。並提出一些測試用例,並確保它們在嘗試複雜之前正在工作。從小開始建立。 – madmik3 2011-03-06 00:55:30

+0

我已經嘗試了日誌記錄和單元測試。看起來進入主退火循環的所有功能都是正確的,而且從記錄來看,它看起來像我正在做出我打算做出的決定。問題似乎在於我不明白產生候選人和冷卻計劃的正確策略,導致快速收斂,所以我正在測試一系列不同的策略。我已經考慮將單獨運行並行化,但是我想知道這是否值得付出努力。 – Wang 2011-03-06 01:10:38

回答

0

這裏有一些調試技巧,我從執行元啓發式算法(如模擬退火和禁忌搜索)在Drools Planner學會(Java,開源):

  1. 它支持不同environmentMode S(DEBUGREPRODUCIBLE (默認)和PRODUCTION)。在模式DEBUGREPRODUCIBLE,所有代碼使用相同的隨機實例和Random實例seed是固定的。因此,兩次運行禁忌搜索實施給出完全相同的動作,步驟和得分。模擬退火實現依賴於時間梯度,所以根據當時的CPU,可能會有細微的差異。注意:這並不能讓你免於統計運行,但它確實可以重現一次運行。
  2. 良好的可讀日誌。使用日誌級別。不要記錄太冗長。
  3. 我們的構建服務器(Hudson)保留了性能統計信息。
  4. 有一個Benchmarker工具輸出圖表,使其更容易看到算法做了什麼。所以,不要只看結果,還要看看它是如何到達那裏的。它起初可能做得很好,但之後會陷入局部最佳狀態。

Benchmarker summary

Benchmarker detail

它的東西,喜歡哪給你什麼算法中的實際發生的洞察力。

另外,請參閱我的博客文章Simulated Annealing