C++ dlib在生成非有限输出的目标函数的提供边界外搜索

C++ dlib在生成非有限输出的目标函数的提供边界外搜索,c++,dlib,C++,Dlib,我正在使用函数库进行函数优化。更具体地说,我正在使用,因为我的测试函数在[0,1]范围内有界。我对find_max_box_约束函数的理解是,它只在作为参数提供的上下限范围内搜索,但当我调用它时,会出现异常: 在抛出“dlib::error”的实例后调用terminate what():目标函数生成非有限输出 中止(堆芯转储) 我添加了一些print语句来了解发生了什么,find_max_box_约束函数调用的目标函数的值超出了我提供的边界,这是由于目标函数的性质,然后返回-nan,从而导致此异

我正在使用函数库进行函数优化。更具体地说,我正在使用,因为我的测试函数在[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)