『實踐』Yalmip建模+Cplex類求解

Yalmip建模+Cplex類求解

1、原因

    Yalmip只能設置部分Cplex的參數,因此須要調用Cplex類。並且optimize是Yalmip提供的經常使用函數,但此函數的返回結果參數有限。html

圖1  Yalmip網站對於Cplex求解器的說明git

 

2、解決方法

  爲了可以既利用Yalmip來建模(方便),又能調用Cplex類(功能齊全)。咱們可使用Yalmip提供的export函數來輸出model,再新建一個Cplex類實體,將model中整理好的諸如Aineq、bineq等賦值給新建的Cplex類實體。github

圖2  F爲目標函數,h爲約束,ops爲options。函數

  下面舉個具體例子,model存儲着Yalmip創建的模型,cplex_milp爲Cplex類實體,能夠對其設置各類參數屬性。Cplex的參數列表地址優化

  ps:model中的矩陣中的變量排序沒法知道。網站

 1 %yalmip設置  2 options = sdpsettings('solver' ,'cplex');  3 options.showprogress = 1;%1爲設置顯示yalmip如今在作什麼  4 options.verbose = 2;%設置顯示信息程度,1爲適度顯示,2爲徹底顯示。  5 
 6 [model,recoverymodel,diagnostic,internalmodel] = export(Constraints,Objective,options);%輸出Yalmip模型  7 %定義一個Cplex類實體  8 cplex_milp = Cplex('Milp for HTC');  9 cplex_milp.Model.sense = 'minimize'; 10 cplex_milp.Model.obj = model.f; 11 cplex_milp.Model.lb = model.lb; 12 cplex_milp.Model.ub = model.ub; 13 cplex_milp.Model.A = [model.Aineq;model.Aeq]; 14 cplex_milp.Model.lhs = [-Inf.*ones(size(model.bineq,1),1);model.beq]; 15 cplex_milp.Model.rhs = [model.bineq;model.beq]; 16 cplex_milp.Model.ctype = model.ctype';
20 cplex_milp.Param.mip.tolerances.mipgap.Cur = zk.solver_error;%相對MIP間隔容差,(精度) 21 cplex_milp.Param.threads.Cur = 1;%設置將由任何 CPLEX 並行優化器調用的並行線程的缺省數量。1爲單線程 22 cplex_milp.Param.mip.display = 1;%決定在混合整數優化期間cplex報告到屏幕的內容。默認爲2. 23 cplex_milp.Param.timelimit = 15;%設置對優化器的調用的最長時間(以秒爲單位) 24 cplex_milp.writeModel('hmilp.lp');%輸出數學模型 25 cplex_milp.solve();

圖3 上面代碼中的model變量中的參數列表spa

圖 4   Cplex類實體線程

3、相關網站

  https://www.ibm.com/support/knowledgecenter/zh/SSSA5P_12.7.0/ilog.odms.cplex.help/refmatlabcplex/html/classCplex.htmlcode

  https://www.ibm.com/support/knowledgecenter/zh/SSSA5P_12.7.0/ilog.odms.cplex.help/CPLEX/Parameters/topics/introListAlpha.htmlhtm

  https://yalmip.github.io/command/export/

相關文章
相關標籤/搜索