c/c++环境配置
需要使用到的工具有cmake
和MinGW
,具体安装教程请自行搜索,网上有很多
step1 下载所需的安装包
点击v2.6.2.tar.gz
下载完成后解压,文件结构如图
step2 打开cmd,进入到解压后的文件夹
输入如下命令,创建build文件夹
mkdir build
cd build
使用cmake编译生成makefile
cmake -G"MinGW Makefiles" ..
编译完成后,得到makefile文件
然后,输入mimgw32-make
step3 管理员身份打开cmd,重新进入到build文件夹下
输入mingw32-make install
,可以看到,默认安装到C盘Program Files(x86)文件夹下
进入该文件夹中,发现新增了一个名为nlopt
的文件夹,打开
bin\libnlopt.dll
,include\nlopt.h
,include\nlopt.hpp
,lib\libnlopt.dll.a
就是c/c++环境下所需要的的文件
step4 测试
将libnlopt.dll
,nlopt.h
,nlopt.hpp
,libnlopt.dll.a
放在和测试文件同一文件夹下
测试文件hello.cpp代码(测试代码来自这里):
#include <stdio.h>
#include <math.h>
#include "nlopt.h"
#define INF (1.0/0.0)
double utility(unsigned n, const double *x, double *grad, void *data){
grad[0]=1.0/x[0];
grad[1]=1.0/x[1];
printf("%f, %f, %f ", x[0],x[1],log(x[0])+log(x[1]));
return log(x[0])+log(x[1]);
}
double constraint(unsigned n, const double *x, double *grad, void *data){
double *p=(double *)data;
grad[0]=*p;
grad[1]=*(p+1);
printf("Constraint: %f\n", x[0]*(*p)+x[1]*(*(p+1))-5);
return x[0]*(*p)+x[1]*(*(p+1))-5;
}
double inconstraint(unsigned n, const double *x, double *grad, void *data){
grad[0]=1;
grad[1]=-1;
return x[0]-x[1];
}
int main(int argc, char const *argv[]) {
double p[2]={1,2};
double tol=1e-8;
double lb[2]={0,0};
double ub[2]={INF,INF};
double x[2]={1,1};
double f_max=-INF;
// set up optimizer
nlopt_opt opter=nlopt_create(NLOPT_LD_SLSQP, 2);
// lower and upper bound
nlopt_set_lower_bounds(opter, lb);
nlopt_set_upper_bounds(opter, ub);
// objective function
nlopt_set_max_objective(opter, utility, NULL);
// equality constraint
nlopt_add_equality_constraint(opter, constraint, p, tol);
// inequality constraint
nlopt_add_inequality_constraint(opter, inconstraint, NULL, tol);
// stopping criterion
nlopt_set_xtol_rel(opter, tol);
nlopt_set_ftol_abs(opter, tol);
nlopt_set_force_stop(opter, tol);
// optimize
nlopt_result result=nlopt_optimize(opter, x, &f_max);
if (result)
printf("Maximum utility=%f, x=(%f,%f)\n", f_max, x[0], x[1]);
// free
nlopt_destroy(opter);
return 0;
}
命令行输入指令g++ hello.cpp libnlopt.dll -o hello
生成可执行文件;
输入./hello执行
,结果如下
注:
直接下载上图中的两个文件可以省略前三步,将dll文件链接进GCC可以省略在命令中加入libnlopt.dll
文件,具体步骤如下:
进入到mingw文件夹下,按照路径lib\gcc\x86_64-w64-mingw32\8.1.0
打开文件夹,然后将文件libnlopt.dll.a
粘贴到该目录下,输入命令g++ hello.cpp -lnlopt -o hello
,注意,要加-lnlopt
Matlab环境配置
根据上面那段英文的意思,需要将nlopt_optimize.c
编译成为可供matlab调用的MEX文件,并将结果放入Matlab路径或工作目录中,还需要将其他.m文件(主要实现常量和文档)放入与MEX文件相同的目录中。
但是,在上面前三步完成后,会生成一个matlab
文件夹,这里面包括matlab环境所需要的文件,并且nlopt_optimize.c
文件已经编译成了MEX文件,因此,直接将整个文件夹和你的测试程序放入同一路径下即可调用nlopt库。
调用matlab接口需要了解opt
结构。 所有的优化参数(维度、算法、终止标准、约束、目标函数等)都是通过给opt结构
分配字段来指定的,只需将字段分配给这个结构,然后调用nlopt_optimize(opt)
函数来执行优化。每个opt结构都需要通过opt.algorithm =algorithm
指定算法。
具体介绍请参考官网Matlab使用
测试
myfunc.m
function [val, gradient] = myfunc(x)
val = sqrt(x(2));
if (nargout > 1)
gradient = [0, 0.5 / val];
end
end
myconstraint.m
function [val, gradient] = myconstraint(x,a,b)
val = (a*x(1) + b)^3 - x(2);
if (nargout > 1)
gradient = [3*a*(a*x(1) + b)^2, -1];
end
end
test.m
opt.algorithm = NLOPT_LD_MMA;
opt.lower_bounds = [-inf, 0];
opt.min_objective = @myfunc;
opt.fc = { (@(x) myconstraint(x,2,0)), (@(x) myconstraint(x,-1,1)) };
opt.fc_tol = [1e-8, 1e-8];
opt.xtol_rel = 1e-4;
[xopt, fmin, retcode] = nlopt_optimize(opt, [1.234 5.678]);
测试结果
xopt = 0.3333 0.2963
fmin = 0.5443
retcode = 4
注:测试matlab时,myfunc.m
、myconstraint.m
、test.m
都要,运行test.m