【实践】Yalmip使用Knitro的一些总结

Yalmip使用Knitro的一些总结

1.软件

  Knitro 11.0.1  

  Win64(包含安装包和确定机器ID的软件):链接:https://pan.baidu.com/s/14IfxlAdo3myYiAeCGzfSQQ 密码:2k9q

  【实践】Yalmip使用Knitro的一些总结_第1张图片

图1  Knitro 11.0.1 win64 下载地址

  官网获取地址:https://www.artelys.com/en/optimization-tools/knitro/downloads

  通过学术邮箱可以申请一个月的完整版使用权。【实践】Yalmip使用Knitro的一些总结_第2张图片

图2 Knitro 的申请

  Yalmip的获取教程见https://www.cnblogs.com/landiljy/p/6776434.html

 

2.Yalmip使用Knitro中发现的错误

  • Yalmip和Knitro都安装好以后,命令行窗口输入yalmiptest,看下是否找到knitro求解器
  • Yalmip中调用knitro。见下面代码
1 options = sdpsettings('verbose',2,'solver','knitro','savesolveroutput',1);%verbose设置显示信息的程度;savesolveroutput默认为0,表示不保存求解结果,设为1表示保存求解结果。
2 sol = optimize(Constraints,F,options);%Constraints为约束;F为目标函数;options为属性。
  • 按照上面步骤设置savesolveroutput=1后,报错。
  • 然后查看了Yalmip调用Knitro求解器的函数文件,发现了问题。方法如下:
  • 按照路径F:\MATLAB2014\AddTool\YALMIP-master\solvers\callknitro.m(红色部分为软件里的路径部分),打开callknitro.m文件。
  • 可以发现图4中保存计算结果的语句中fmin语句有错(没有fmin这个变量)。图3中返回的是fval。
  • 其中这里可以参考:http://blog.sina.com.cn/s/blog_50c154510102wusb.html

图3  Yalmip调用Knitro的Matlab版本接口

【实践】Yalmip使用Knitro的一些总结_第3张图片

图4 Yalmip调用Knitro求解器的函数

 

3.Yalmip设置Knitro的参数

 

1 options = sdpsettings('verbose',2,'solver','knitro','savesolveroutput',1);%verbose设置显示信息的程度;savesolveroutput默认为0,表示不保存求解结果,设为1表示保存求解结果。
2 sol = optimize(Constraints,F,options);%Constraints为约束;F为目标函数;options为属性。

 

  • 设置Knitro参数我们可以通过设置options来实现,不过options中的Knitro的参数名称和Knitro给出的参数说明文档对不上。所以建议使用下面的设置参数的方法。

 

  1.首先找到Knitro的Matlab版本的Nlp例子,其路径为:C:\Program Files\Artelys\Knitro 11.0.1\knitromatlab,下面代码中的knitromatlab是Knitro的matlab的调用接口。

[x,fval,exitflag,output,lambda,grad,hess] = knitromatlab(@objfun,x0,A,b,Aeq,beq,lb,ub,@constfun,extendedFeatures,[],'nlp2options.opt');%红色字体是参数设置文档

  2.图5中的exampleNLP2.m文件是Knitro给的NLP的例子,其中nlp2options.opt是Knitro参数设置文档,参数设置的具体格式见图6。

  3.图6是nlp2options.opt文件里的内容。其中加了‘#’的语句,则‘#’后面的语句不执行(即蓝色框)。红色框为一个参数的设置语句(参数详见:https://www.gams.com/latest/docs/S_KNITRO.html#KNITROopttol),后半句为说明这个参数对应Yalmip中的参数名称(即图7中蓝色框部分).

  4.那么我们将nlp2options.opt文件拷贝到我们自己项目的路径下,然后修改Yalmip调用Knitro的函数文件(callknitro.m)中的内容,具体修改见下面的代码红色字体部分

1 solvertime = tic;
2 %自己加的对options的设置---start----2018.06.27
3 model.options.knitro.optionsfile = 'nlp2options.opt';  %参数设置文档
4 %自己加的对options的设置---end----
5 [xout,fval,exitflag,output,lambda] = knitromatlab_mip(funcs.objective,model.x0,model.A,full(model.b),model.Aeq,full(model.beq),model.lb,model.ub,funcs.constraints,model.xType,model.objFnType,model.cineqFnType,model.extendedFeatures,model.options.knitro,model.options.knitro.optionsfile);
6 solvertime = toc(solvertime);

 

  5.那么我们以后要修改Knitro的参数,只需要在callknitro.m文件中修改即可。

【实践】Yalmip使用Knitro的一些总结_第4张图片

 

图5  Knitro的Matlab版本的例子

【实践】Yalmip使用Knitro的一些总结_第5张图片

图6 Knitro的参数设置文档

【实践】Yalmip使用Knitro的一些总结_第6张图片

图7 Yalmip中Knitro的参数列表

 

 

4. Knitro返回的代码编号说明

  具体见:https://www.artelys.com/tools/knitro_doc/3_referenceManual/returnCodes.html#returncodes

 

5.Knitro的用户使用手册

  具体见: https://www.artelys.com/tools/knitro_doc/2_userGuide.html

 

 

 

 

你可能感兴趣的:(【实践】Yalmip使用Knitro的一些总结)