2016-02-28 73 views
1

我正在爲一個任意的非線性高階方程求解器求解。我想找到最低限度。我遇到的問題是如何規範化概率分佈函數。我不想整合所有變量(加上我也可以通過蠻力發現最小值,如果我這樣做的話)。這是我的代碼。我怎樣才能規範化指數項。模擬退火,如何標準化概率分佈

template<typename Real, int N, typename Funct> 
    Vector<Real, N> simulated_anneling_solver(Funct f, const Vector<Real, N>& lower_bound, const Vector<Real, N>& upper_bound, int t_start) 
    { 
     static int called_count = 0; 
     std::default_random_engine eng; 
     eng.seed(time(0) * ++called_count); 

     Vector<Real, N> x; 
     for(int i = 0; i < N; i++) 
      x[i] = (upper_bound[i] + lower_bound[i]) * (Real)0.5; 
     Real v = f(x); 
     for(int t = t_start; t > 0; t--) 
     { 
      Vector<Real, N> next_x; 
      Real cooled_percent = (Real)t/t_start; 
      for(int i = 0; i < N; i++) 
      { 
       Real dimw = upper_bound[i] - lower_bound[i]; 
       do 
       { 
        next_x[i] = std::normal_distribution<Real>(x[i], dimw * cooled_percent)(eng); 
       } 
       while(next_x[i] < lower_bound[i] || next_x[i] > upper_bound[i]); 
      } 

      Real next_v = f(next_x); 

      if(next_v <= v || expx((next_v - v)/t) > std::uniform_real_distribution<float>(0.0f, 1.0f)(eng)) 
      { 
       v = next_v; 
       x = next_x; 
      } 
     } 

     return x; 
    } 

} 

PS。我試圖改變expx((next_v - v)/t) > std::uniform_real_distribution<float>(0.0f, 1.0f)(eng)(next_v - v)/v < cooled_percent這似乎給出了一些好的結果。現在我知道我只是拿出了函數的百分比誤差,並將它與它已經冷卻了多少。因此,所有事情都被規範化並且在零與一之間界定。系統冷卻時,您需要的誤差百分比更低。我想現在雖然它不是真正的模擬退火。

回答

0

在模擬退火沒有必要進行歸一化,因爲在程序的if語句應該是這樣:

if(next_v < v || 
    expx((v-next_v)/t) > std::uniform_real_distribution<float>(0.0f, 1.0f)(eng)) 
{ 
    v = next_v; 
    x = next_x; 
} 

其中expx總是產生在(0,1]值