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
這似乎給出了一些好的結果。現在我知道我只是拿出了函數的百分比誤差,並將它與它已經冷卻了多少。因此,所有事情都被規範化並且在零與一之間界定。系統冷卻時,您需要的誤差百分比更低。我想現在雖然它不是真正的模擬退火。