Yalmip使用Knitro的一些總結
1.軟件
Knitro 11.0.1
Win64(包含安裝包和確定機器ID的軟件):鏈接:https://pan.baidu.com/s/14IfxlAdo3myYiAeCGzfSQQ 密碼:2k9q
圖1 Knitro 11.0.1 win64 下載地址
官網獲取地址:https://www.artelys.com/en/optimization-tools/knitro/downloads
通過學術郵箱可以申請一個月的完整版使用權。
圖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版本接口
圖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文件中修改即可。
圖5 Knitro的Matlab版本的例子
圖6 Knitro的參數設置文檔
圖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