Gurobi:使用Java+Gurobi建立一个小数学模型
现在基本上都流行python+gurobi,java+cplex进行建模。但是由于java相较于python还是具有显著的速度优势,于是,我还是尝试了一下使用java来调用gurobi进行模型求解。
其实,操作都很简单,只是一些语句的区别,在此记录。
按变量进行建模
首先,引入gurobi包,并建立一个model。
import gurobi.*;
...
GRBEnv env = new GRBEnv();
GRBModel model = new GRBModel(env);
然后,先像模型中加入变量,语句为:
model.addVar(lb, ub, obj, type, "x");
GRBVar[] x = new GRBVar[xNumber];
for (int i = 0; i < xNumber; i++) {
x[i] = model.addVar(0.0,Double.MAX_VALUE,1.0, GRB.CONTINUOUS, "x"_i));
}
定义约束:
model.addConstr(lhsExpr, sense, rhsExpr, name);
GRBLinExpr expr = new GRBLinExpr();
expr.addTerm(1.0, x[0]);
expr.addTerm(1.0, x[1]);
model.addConstr(expr, GRB.LESS_EQUAL, 1.0, "cons1");
最后求解即可
model.optimize();
按列进行建模
按列建模的方法也与按变量建模相似。只不过,我们将先进行约束相关的操作,最后再将变量加入到模型中。
首先,我们定义存放决策变量和约束的list。
//定义决策变量
ArrayList<GRBVar> x = new ArrayList<>();
//定义约束
GRBConstr[] cons = new GRBConstr[cons1Number];
接着,设置约束上下界。相关语句为:
model.addRange(expr, lb, ub, name);
注意!这里如果是等式需要设为两个约束,否则为一个空的expr设两个界会出一bug。
for (int i = 0; i < cons1Number; i++) {
GRBLinExpr expr = new GRBLinExpr();
cons[i] = model.addRange(expr,0.0,Double.MAX_VALUE, "cons" + i );
}
然后,我们开始加入变量,即将列加入模型中:
GRBColumn column = new GRBColumn();
column.addTerm(1.0, cons[0]);
//将该列对应的变量加入model,并将该变量对应存到x中方便取用
x.add(model.addVar(0.0, Double.MAX_VALUE, 1.0, GRB.CONTINUOUS, column,"x"));
最后,求解model即可。
模型的求解结果
是否有解:
masterPro.get(GRB.IntAttr.Status) == 2
目标函数值:
masterPro.get(GRB.DoubleAttr.ObjVal);
变量值:
x.get(i).get(GRB.DoubleAttr.X);
获取对偶变量的值:
double[] pi = model.get(GRB.DoubleAttr.Pi, cons);