Я использую стороннюю библиотеку Ipopt. Чтобы использовать его, я должен реализовать некоторые виртуальные функции из одного из его классов. Две виртуальные функции приведены ниже для понимания.
virtual bool get_starting_point ( double* x);
virtual bool eval_f(const Number* x, Number& obj_value);
Вот x
массив переменных и obj_value
является выражением переменных в x
, x
будет менять значение в каждой итерации.
Пример реализации:
bool TNLP::get_starting_point ( double* x)
{
x[0] =1.5;
x[1] =0.5;
return true;
}
bool TNLP::eval_f(const Number* x, Number& obj_value)
{
obj_value = x[0]*x[0] +x[1]*x[1];
return true;
}
Моя проблема:
У меня есть класс, который содержит данные и выражения, необходимые для моей проблемы.
class MyProblem: public TNLP
{
public:
MyProblem();
protected:
double* m_x= nullptr; // initial values, i.e, x[0] =1.5; x[1] =0.5;
double m_obj_value; // same as x[0]*x[0] +x[1]*x[1];
}
Теперь, наследуя от TNLP, я могу реализовывать виртуальные функции. Я должен пройти m_x
а также m_obj_value
в x
а также obj_value
в соответствующих виртуальных функциях. Я не могу просто скопировать m_x
а также m_obj_value
поскольку m_obj_value
это выражение m_x
, Как я могу эффективно реализовать виртуальные функции с данными m_x
а также m_obj_value
?
Задача ещё не решена.
Других решений пока нет …