2016-04-28 89 views
0

更新

我會找到全局最小值,繪圖顯示這個函數有許多局部最小值。模擬退火的實現;如何提高性能?

f[x_] = 0.5 x^2 + Cos[Pi x] 2 Sin[Pi x] + Cos[Pi x] + 2 Sin[Pi x]; 
plt1 = Plot[f[x], {x, -5, 5}, PlotStyle -> RGBColor[1, 0, 0],Frame -> True] 

根據文件(http://ww.w.sliponline.org/Publications/Conferences/24/c24.pdf),我將實現SA算法,但性能非常緩慢。

fTmp = fBest = xBest = xTmp = 999.0; 
k = 0; 
LIMIT = 10^6; 
tTmp = tInit = 300; 
Alpha = 0.999999999; 

For [tTmp = tTmp * Alpha;, k < LIMIT, k++, 
    xTmp = RandomReal[{-5, 5}]; 
    fTmp = f[xTmp]; 
    If [fTmp < fBest, fBest = fTmp; xBest = xTmp, 
    PRA = N[Min[{1, Exp[-(fTmp - fBest)/tTmp]}]]; 
    R = RandomReal[{0.0, 1.0}]; 
    If [R < PRA, fBest = fTmp; xBest = xTmp; k++,]; 
    ]; 
tTmp = tTmp * Alpha; 
]; 
Print[xBest] 
Print[fBest] 

-0.390741 
-2.10428 

是否有可能提高模擬退火的性能和精度?請隨時發表評論,謝謝。

回答

0

爲了提高精度,有幾件事情可以做:

  1. 改變算法的參數。在類似問題上使用SA的研究論文將描述他們對參數的選擇。或者,您可以針對您的問題的參數運行自己的元優化。有關不同類型的示例,請參閱https://en.wikipedia.org/wiki/Hyperparameter_optimization
  2. 執行多個優化步驟。在這種情況下,您可以重新運行該算法,在新運行的第一次運行中使用最佳解決方案,等等。您甚至可以使用不同的算法來搜索最佳解決方案。在您的具體情況下,您接近最佳解決方案,因此對您的解決方案進行強力搜索可能會產生更好的結果。

通過不使用10^6次迭代的固定循環可以提高性能。相反,使用連續方案之間的差值小於某個指定的公差。

您還可以利用您的系統可能具有的多個內核運行具有不同初始值的算法實例。雖然這不會直接提高性能,但在同一時間段內可能會獲得更多的相同資源。如果這還不夠,我會建議嘗試一些其他全局優化算法,如遺傳算法。

+0

你能給我一個很好的例子嗎?我在哪裏可以找到有關此主題的網站或博客的示例? –

+0

我已經添加了一些額外的信息給答案。我注意到你正在使用固定循環而不是動態停止標準。就研究論文的例子而言,我無法獲得大學給予學生的論文。如果你這樣做,只是谷歌模擬退火,看看有什麼學術文章出現,並閱讀了幾個有例子。他們可以解釋他們選擇的參數或者顯示他們如何優化他們。 – BobbyJ

+0

非常感謝。 –