2015-02-06 74 views
0

我對實現模擬退火很感興趣,而我的電流給出了錯誤的輸出。我相信我對它的理解是有缺陷的。有人可以幫助解釋這個實現是如何錯誤的嗎? dist是我的條件概率數組。C++中的模擬退火實現

int idx=0; 
double value = dist[0]; 
for (int ix = 1; ix < ITERS ; ixx){ 
    double temp = (1/500)*((1/ix)- (1/ITERS)); 
    for(int m = 0; m < input.rows()-1; m++){ 
     double p = transitionProbability(dist[m], dist[m+1],temp); 
     if (p > unifRand()) { 
      if (dist[m+1] < value) 
       value = dist[m+1]; 
       idx = m+1;  
      } 
     else { 
     idx = m; 
     } 
    } 
} 



double inline transitionProbability(double d0, double d1,double T) { 

if (d0 > d1) 
    { return 1; } 

else 
    { return (exp(d0 - d1)/T); } 
} 
+1

對於某些特定的輸入,*期望*和*實際*輸出是什麼?你有沒有試過在調試器中運行,並逐行逐行查看發生了什麼? – 2015-02-06 13:13:42

回答

1

這會我更容易地回答你的問題,如果你還可以描述你正在試圖解決什麼優化問題,什麼是你的數據結構。

例如,「input.rows」在你的實現中引用了什麼?

SA的基本思路是,在每次迭代:

  • 使當前的解決方案
  • 的隨機修改計算出新的解決方案
  • 將其設置爲當前解決方案的成本(爲下迭代)如果它被接受(使用轉換概率函數,看起來是正確的)
+0

我想優化圖像中曲線的檢測,其中input.rows表示連續像素的數量 – Carnez 2015-02-06 13:30:45

+0

我不清楚在代碼中如何表示解決方案,如何計算給出的解決方案,以及您做出的修改。 這個鏈接可能會幫助你,如果你不習慣這種類型的方法:http://katrinaeg.com/simulated-annealing.html – borisd 2015-02-06 13:33:25

+0

成本已經計算在dist數組中,所以我有一個條件概率矩陣 – Carnez 2015-02-06 13:40:30