Я испытываю серьезные проблемы при попытке использовать библиотеку nlopt (http://ab-initio.mit.edu/wiki/index.php/NLopt_Tutorial) в приложении Windows Forms. Я создал следующее пространство имен, которое отлично работает в консольном приложении.
#include "math.h"#include "nlopt.h"
namespace test
{
typedef struct {
double a, b;
} my_constraint_data;
double myfunc(unsigned n, const double *x, double *grad, void *my_func_data)
{
if (grad) {
grad[0] = 0.0;
grad[1] = 0.5 / sqrt(x[1]);
}
return sqrt(x[1]);
}
double myconstraint(unsigned n, const double *x, double *grad, void *data)
{
my_constraint_data *d = (my_constraint_data *) data;
double a = d->a, b = d->b;
if (grad) {
grad[0] = 3 * a * (a*x[0] + b) * (a*x[0] + b);
grad[1] = -1.0;
}
return ((a*x[0] + b) * (a*x[0] + b) * (a*x[0] + b) - x[1]);
}
int comp()
{
double lb[2] = { -HUGE_VAL, 0 }; /* lower bounds */
nlopt_opt opt;
opt = nlopt_create(NLOPT_LD_MMA, 2); /* algorithm and dimensionality */
nlopt_set_lower_bounds(opt, lb);
nlopt_set_min_objective(opt, myfunc, NULL);
my_constraint_data data[2] = { {2,0}, {-1,1} };
nlopt_add_inequality_constraint(opt, myconstraint, &data[0], 1e-8);
nlopt_add_inequality_constraint(opt, myconstraint, &data[1], 1e-8);
nlopt_set_xtol_rel(opt, 1e-4);
double x[2] = { 1.234, 5.678 }; /* some initial guess */
double minf; /* the minimum objective value, upon return */
int a=nlopt_optimize(opt, x, &minf) ;
return 1;
}
}
Оптимизирует простую нелинейную задачу минимизации с ограничениями. Проблема возникает, когда я пытаюсь использовать это пространство имен в приложении Windows Form. Я постоянно получаю необработанное исключение в myfunc, который видит «x» как пустой указатель по какой-то причине и поэтому вызывает ошибку при попытке доступа к его местоположению. Я считаю, что проблема как-то вызвана тем фактом, что формы Windows использует CLR, но я не знаю, решаемо это или нет. Я использую Visual Studio 2008, и тестовые программы — это простой консольный проект (который работает нормально) и проект Windows Forms (который вызывает вышеупомянутые ошибки).
Мой тестовый код основан на учебнике для C по предоставленной ссылке. Я хотя и попробовал версию C ++, которая снова прекрасно работает в консольном приложении, но дает ошибку отладочного утверждения в приложении Windows Forms.
Итак, я думаю, мои вопросы: у меня есть работающее приложение Windows Forms, и я хотел бы использовать NLOpt. Есть ли способ сделать эту работу?
Задача ещё не решена.
Других решений пока нет …