尝试在 Windows 窗体应用程序中使用 nlopt 库 (http://ab-initio.mit.edu/wiki/index.php/NLopt_Tutorial) 时遇到严重问题。我创建了以下命名空间,它在控制台应用程序中完美运行。
#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 窗体应用程序中使用此命名空间时,就会出现问题。我经常在 myfunc 中遇到未处理的异常,由于某种原因将“x”视为空指针,因此在尝试访问其位置时会导致错误。我相信这个问题是由 Windows 窗体使用 CLR 的事实引起的,但我不知道它是否可以解决。我正在使用 Visual Studio 2008,测试程序是简单的控制台项目(工作正常)和 Windows 窗体项目(导致上述错误)。我的测试代码基于提供的链接中的 C 教程。我虽然尝试了 C++ 版本,它在控制台应用程序中再次正常工作,但在 Windows 窗体应用程序中给出了调试断言失败错误。
所以我想我的问题是:我有工作的 Windows 窗体应用程序,我想使用 NLOpt。有没有办法使这项工作?