Java调用cplex求解通用规划模型(包括整型和非整型线性规划),一个简单的模型例子如下
利用求解Java调用cplex,进行求解代码如下:
import ilog.concert.IloException;
import ilog.concert.IloNumVar;
import ilog.cplex.IloCplex;
public class LP1 {
public static void main(String[] args) {
try {
IloCplex cplex = new IloCplex(); // creat a model
//double[] lb = {0.0, 0.0, 0.0,0.0};
//double[] ub = {Double.MAX_VALUE, 1,1,1};
//IloNumVar[] x = cplex.numVarArray(4, lb, ub);//也是一种定义变量的方式
//Define the variables one-by-one,这种方法更方便整型和非整变量定义
IloNumVar[] x = new IloNumVar[4];
x[0] = cplex.numVar(0.0, Double.MAX_VALUE, "x0");//这个是连续型变量
x[1] = cplex.intVar(0, 1, "x1");//定义三个整型变量
x[2] = cplex.intVar(0, 1, "x2");
x[3] = cplex.intVar(0, 1, "x3");
double[] objvals = {2, -3, -2,-3};//目标函数的系数定义
cplex.addMinimize(cplex.scalProd(x, objvals));//目标函数是求最小值,最大值修改成addMaximize即可
double[] coeff1 = {-1.0, -1.0, -1.0,-1.0};//逐一增加约束的系数,这是第一个,都标准化约束如=<样式
double[] coeff2 = {10, 5, 3,4};
cplex.addLe(cplex.scalProd(x, coeff1), -2);//约束右边常数值
cplex.addLe(cplex.scalProd(x, coeff2), 10);
if (cplex.solve()) {
cplex.output().println("Solution status = " + cplex.getStatus());//输出目标值
cplex.output().println("Solution value = " + cplex.getObjValue());
double[] val = cplex.getValues(x);
for (int j = 0; j < val.length; j++) {
cplex.output().println("x" + (j+1) + " = " + val[j]);//输出变量取值
}
}
cplex.end();
} catch (IloException e) {
System.err.println("Concert exception caught: " + e);
}
}
}
最后计算结果如下:
综上,这个方法的优点:比较简单,可扩展性比较高,适用于不同的规划问题(包括连续型,整型变量),缺点:当约束/变量/目标函数比较庞大/复杂时,这种方法可能效率较低。
参考:https://blog.csdn.net/robert_chen1988/article/details/78678289,https://blog.csdn.net/rechardchen123/article/details/79275950(谢谢前辈的贡献)。