C++ dlib在生成非有限输出的目标函数的提供边界外搜索
我正在使用函数库进行函数优化。更具体地说,我正在使用,因为我的测试函数在[0,1]范围内有界。我对find_max_box_约束函数的理解是,它只在作为参数提供的上下限范围内搜索,但当我调用它时,会出现异常: 在抛出“dlib::error”的实例后调用terminate what():目标函数生成非有限输出 中止(堆芯转储) 我添加了一些print语句来了解发生了什么,find_max_box_约束函数调用的目标函数的值超出了我提供的边界,这是由于目标函数的性质,然后返回-nan,从而导致此异常 代码如下:C++ dlib在生成非有限输出的目标函数的提供边界外搜索,c++,dlib,C++,Dlib,我正在使用函数库进行函数优化。更具体地说,我正在使用,因为我的测试函数在[0,1]范围内有界。我对find_max_box_约束函数的理解是,它只在作为参数提供的上下限范围内搜索,但当我调用它时,会出现异常: 在抛出“dlib::error”的实例后调用terminate what():目标函数生成非有限输出 中止(堆芯转储) 我添加了一些print语句来了解发生了什么,find_max_box_约束函数调用的目标函数的值超出了我提供的边界,这是由于目标函数的性质,然后返回-nan,从而导致此异
typedef dlib::matrix<double, 0, 1> column_vector;
class BFGS
{
public:
BFGS(Benchmark* benchmark) :
benchmark { benchmark }
{
int dim { benchmark->getDimensions() };
lbounds.set_size(d, 1);
ubounds.set_size(d, 1);
for (int i { 0 }; i < d; ++i)
{
lbounds(i, 0) = benchmark->getLbound(i);
ubounds(i, 0) = benchmark->getUbound(i);
}
}
void maxSearch(Individual& individual);
private:
Benchmark* benchmark;
column_vector lbounds;
column_vector ubounds;
};
我发现find_max_box_constrated()正在调用值为-1.0000e-5的目标函数,导致目标函数返回-nan,因为-1.0000e-5^(3/4)是nan
我的问题是,我是否误解了find\u max\u box\u constrated()的工作原理?为什么它调用我的目标函数超出了我给出的界限?我已经为此挣扎了几个小时,我快发疯了。谢谢
void BFGS::maxSearch(Individual& individual)
{
column_vector solution;
vector<double> vec { individual.data() };
solution.set_size(vec.size(), 1);
for (size_t i { 0 }; i < vec.size(); ++i)
solution(i, 0) = vec[i];
FunctionWrapper fn(benchmark, this);
dlib::find_max_box_constrained(
dlib::bfgs_search_strategy(),
dlib::objective_delta_stop_strategy(1e-5).be_verbose(),
fn,
dlib::derivative(fn),
solution,
lbounds,
ubounds
);
for (size_t i { 0 }; i < vec.size(); ++i)
vec[i] = solution(i, 0);
individual.setData(vec);
}
long double uneven_decreasing_maxima(const double *x)
{
tFitness tmp1 = -2*log(2)*((x[0]-0.08)/0.854)*((x[0]-0.08)/0.854);
tFitness tmp2 = sin( 5*M_PI*(pow(x[0],3.0/4.0)-0.05) );
cout << "x = " << x[0] << " tmp1 = " << tmp1 << " tmp2 = " << tmp2 << " Result = " << res << '\n';
return res;
}
iteration: 0 objective: -2.485977e-02
x = 0.000000e+00 tmp1 = -1.216521e-02 tmp2 = -7.071068e-01 Result = 1.234886e-01
x = 0.000000e+00 tmp1 = -1.216521e-02 tmp2 = -7.071068e-01 Result = 1.234886e-01
x = 1.000000e-05 tmp1 = -1.216217e-02 tmp2 = -7.051289e-01 Result = 1.214308e-01
x = -1.000000e-05 tmp1 = -1.216825e-02 tmp2 = -nan Result = -nan
terminate called after throwing an instance of 'dlib::error'
what(): The objective function generated non-finite outputs
Aborted (core dumped)