前言
本文将介绍使用Cplex进行简单的线性规划求解,包括Cplex中两种常用的建模方式,即按行建模和按列建模。实际上还有一种按非零元素建模,本文暂时不涉及。编程环境是VS2019+Cplex12100,环境配置可参考博客:环境配置
按行添加
代码
#include<ilcplex/ilocplex.h>
ILOSTLBEGIN
/*
数学模型
Maximize x1+x2
s.t. x1+2x2<=10 (1)
x1-x2<=3 (2)
*/
int main()
{
IloEnv env;//环境
IloModel model(env);//模型
IloNumVarArray var(env);//变量
IloRangeArray con(env);//约束
var.add(IloNumVar(env, 0, IloInfinity, ILOINT));//添加变量(大于0,整型)
var.add(IloNumVar(env, 0, IloInfinity, ILOINT));//添加变量(大于0,整型)
IloObjective obj = IloMaximize(env, var[0] + var[1]);//目标函数(极大化)
con.add(var[0] + 2 * var[1] <= 10);//约束(1)
con.add(var[0] - var[1] <= 3);//约束(2)
model.add(obj);//将目标导入模型
model.add(con);//将约束导入模型
IloCplex cplex(model);//将模型导入求解器
cplex.solve();//求解
env.out() << cplex.getObjValue() << endl;//输出目标值
for (int i = 0; i < var.getSize(); i++)env.out() << cplex.getValue(var[i]) << "\t";//输出变量值
env.out() << endl;
env.end();
system("pause");
}
结果
按列添加
代码
#include<ilcplex/ilocplex.h>
ILOSTLBEGIN
/*
数学模型
Maximize x1+x2
s.t. x1+2x2<=10 (1)
x1-x2<=3 (2)
*/
int main()
{
IloEnv env;//环境
IloModel model(env);//模型
IloNumVarArray var(env);//变量
IloRangeArray con(env);//约束
con.add(IloRange(env, -IloInfinity, 10));//约束1边界条件
con.add(IloRange(env, -IloInfinity, 3));//约束3边界条件
IloObjective obj = IloMaximize(env);//目标函数
var.add(IloNumVar(obj(1) + con[0](1) + con[1](1), 0, IloInfinity, ILOINT));//添加x1列
var.add(IloNumVar(obj(1) + con[0](2) + con[1](-1), 0, IloInfinity, ILOINT));//添加x2列
model.add(obj);//将目标导入模型
model.add(con);//将约束导入模型
IloCplex cplex(model);//将模型导入求解器
cplex.solve();//求解
cplex.exportModel("test.lp");//将模型导出,命名为test.lp
env.out() << cplex.getObjValue() << endl;//输出目标值
for (int i = 0; i < var.getSize(); i++)env.out() << cplex.getValue(var[i]) << "\t";//输出变量值
env.out() << endl;
env.end();
system("pause");
}
结果
总结
可以看到按行添加和按列添加得到的结果是一致的,我们添加的是同一个模型。