Использование и целевая функция внутри класса дает неправильные результаты - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь использовать nlopt с целевой функцией, созданной внутри класса, и я использовал решение, найденное в Указатель на функцию-функцию

Однако я нахожу очень странное поведениечто я не понимаюЯ создал простой пример для воспроизведения проблемы.

#include <math.h>
#include <iostream>
#include <vector>
#include <nlopt.hpp>

using namespace std;

class MyClass
{
private:
    double *point;
    unsigned ndim;
public:
    MyClass(double *p,unsigned n) {point =    p; ndim = n; }
    ~MyClass() { }
    double myfunc(unsigned n, const double *x, double *grad);
};

double MyClass::myfunc(unsigned n, const double *x, double *grad)
{
    if (grad)
    {
        for (int i=0;i<n;i++){
            grad[i] = 2.*(x[i]-point[i]);
        }
    }    

    double sum = 0.;
    for (int i=0;i<n;i++){
        sum += (x[i] - point[i]) * (x[i] - point[i]);
    }
// here is the critical line
    cout << "n: " << n << "  " << x[0] << " " << x[1] << " :"  << endl;      
    return sum;
}


double wrapper(unsigned n, const double* x, double* grad, void* other) 
{
    reinterpret_cast<MyClass*>(other)->myfunc(n, x, grad);
}


int main(int argc, char *argv[])
{

    double p[] = {0.3,0.6};
    unsigned n = 2;
    MyClass ejemplo(p,n);


    nlopt::opt opt(nlopt::LD_MMA, n);
    opt.set_min_objective(wrapper, &ejemplo);
    opt.set_xtol_rel(1e-4);

    vector<double> x(2);
    x[0] = 1.234; x[1] = 5.678;
    double minf;
    nlopt::result result = opt.optimize(x, minf);
    cout << "found minimum at f(" << x[0] << "," << x[1] << ") = " << minf << endl;
    return 0;
}

Если я выполняю код, все работает нормально, однако, если я прокомментирую строку

cout << "n: " << n << "  " << x[0] << " " << x[1] << " :"  << endl;    

, результат будет неправильным.Действительно, если я вместо этого напишу

cout << "n: " << n  <<  endl;     

, то я вступаю в бесконечный цикл.Или удаление последнего ":" дает неправильный результат.Кто-нибудь может мне объяснить, что происходит?

Спасибо!

Редактировать: Мне очень жаль.Я нашел ошибку.return отсутствует в функции wrapper.Задача решена.Во всяком случае, все еще очень странно, что результат зависит от линии печати.Если кто-нибудь мог объяснить ...

...