参考博客:
2、
3、编译:
先输入nlopt优化库所在盘: E:
再输入:cd E:\nlopt 回车 ,进入了该文件夹。
输入:lib /def:libnlopt-0.def 回车,即可在nlopt文件夹下发现
4、最后将新生成的.dll文件复制到VS2010的安装目录下,VC\bin 中
5、新建工程,项目属性配置
6、测试程序
#include<nlopt.h>
#include<nlopt.hpp>
typedef struct
{
double a, b;
}my_constraint_data;
// 约束函数
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 count = 0;
double myfunc(unsigned n, const double *x, double *grad, void *my_func_data)
{
++count;
if (grad)
{
grad[0] = 0.0;
grad[1] = 0.5 / sqrt(x[1]);
}
return sqrt(x[1]);
}
int main()
{
double lb[2] = { -HUGE_VAL, 0 };
nlopt_opt opt;
opt = nlopt_create(NLOPT_LD_MMA, 2); // 变量个数
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 }; // 初始猜测
double minf;
if (nlopt_optimize(opt, x, &minf) < 0)
{
printf("nlopt faild!\n");
}
else
{
printf("found minimum after %d evaluations\n",count);
printf("found minimum at f(%g,%g)=%g\n", x[0], x[1], minf);
}
nlopt_destroy(opt);
system("pause");
return 0;
}