2015-02-06 42 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