Yalmip建模+Cplex類求解(文末附程序、文章和算例)
一、緣由
Yalmip只能設置部分Cplex的參數,所以需要調用Cplex類。而且optimize是Yalmip提供的常用函數,但此函數的返回結果參數有限。
二、解決方法
為了能夠既利用Yalmip來建模(方便),又能調用Cplex類(功能齊全)。我們可以使用Yalmip提供的export函數來輸出model,再新建一個Cplex類實體,將model中整理好的諸如Aineq、bineq等賦值給新建的Cplex類實體。
圖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變量中的參數列表
圖 4 Cplex類實體
三、相關網站
Yalmip(Matlab)+Cplex類求解電力機組組合問題的樣例程序:http://www.scholat.com/showTeamScholar.html?id=867&changeTo=Ch&nav=5