Я пытаюсь использовать 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
.Задача решена.Во всяком случае, все еще очень странно, что результат зависит от линии печати.Если кто-нибудь мог объяснить ...