idea配置Gurobi以及gurobi的使用
1、idea配置gurobi
先将安装好的gurobi导入程序中,本文用的是idea。找到安装路径,导入gurobi。
导入好后,就可以在现在的包下使用了,下面是一个简单的gurobi程序。
2、gurobi的使用
下面的例子是gurobi安装目录下的帮助文档下的。
C:\gurobi903\win64\docs quickstart_windows.pdf
我们使用gurobi求解一下模型:
模型:
maximize x + y + 2z
Subject to x + 2y + 3z <= 4
x + y >= 1
x, y , z binary //这里可以理解为x,y,z只能取0或1
step1:创建环境和模型
使用gurobi之前,第一步是通过GRBEnv创建环境,然后创建模型。
GRBEnv env = new GRBEnv(ture);
GRBModel model = new GRBModel(env); // 以上面创建的环境创建模型
step2:创建变量
/*
参数一:变量的上限
参数二:变量的下限
参数三:这里可以理解为变量在目标函数的系数
参数四:变量的类型,有01类型、连续性等
参数五:变量的名称
*/
GRBVar x = model.addVar(0.0, 1.0, 1.0, GRB.BINARY, "x");
GRBVar y = model.addVar(0.0, 1.0, 1.0, GRB.BINARY, "y");
GRBVar z = model.addVar(0.0, 1.0, 1.0, GRB.BINARY, "z");
step3:创建目标函数
/*
目标函数: x + y + 2z
1、创建一个空的线性表达式,用于存储目标函数
2、addTerm添加变量及其系数
3、setObjective
参数一为目标函数;
参数二为目标,即为最大值、最小值
*/
GRBLinExpr expr = new GRBLinExpr();
expr.addTerm(1.0, x); expr.addTerm(1.0, y); expr.addTerm(2.0, z);
model.setObjective(expr, GRB.MAXIMIZE);
step4:创建约束
/*
约束是通过函数addConstr构建的。
参数一:约束的左边
参数二:"<="
参数三:约束的右边
参数四:这个约束的名称
*/
/*
约束一:x + 2 y + 3 z <= 4
*/
expr = new GRBLinExpr();
expr.addTerm(1.0, x); expr.addTerm(2.0, y); expr.addTerm(3.0, z);
model.addConstr(expr, GRB.LESS_EQUAL, 4.0, "c0");
/*
约束二:x + y >= 1
*/
expr = new GRBLinExpr();
expr.addTerm(1.0, x); expr.addTerm(1.0, y);
model.addConstr(expr, GRB.GREATER_EQUAL, 1.0, "c1");
step5:优化模型
最后一步,优化模型并输出最后的结果。
model.optimize();
// 输出最优解下x,y,z的取值
System.out.println(x.get(GRB.StringAttr.VarName) + " " + x.get(GRB.DoubleAttr.X));
System.out.println(y.get(GRB.StringAttr.VarName) + " " + y.get(GRB.DoubleAttr.X));
System.out.println(z.get(GRB.StringAttr.VarName) + " " + z.get(GRB.DoubleAttr.X));
// 输出最优解
System.out.println("Obj: " + model.get(GRB.DoubleAttr.ObjVal));
// 回收处理环境和模型
model.dispose();
env.dispose();
最终的完整代码:
import gurobi.*;
public class MIP02 {
public static void main(String[] args) throws GRBException {
try {
// 创建空的环境
GRBEnv env = new GRBEnv(true);
env.set("logFile", "mip1.log");
env.start();
// 创建空的模型
GRBModel model = new GRBModel(env);
// 创建变量
GRBVar x = model.addVar(0.0,1.0,0.0, GRB.BINARY,"x");
GRBVar y = model.addVar(0.0,1.0,0.0, GRB.BINARY,"y");
GRBVar z = model.addVar(0.0,1.0,0.0, GRB.BINARY,"z");
// 设置目标函数,maximize x + y + 2z
GRBLinExpr expr = new GRBLinExpr();
expr.addTerm(1.0,x);expr.addTerm(1.0,y);expr.addTerm(2.0,z);
model.setObjective(expr,GRB.MAXIMIZE);
// 添加约束条件一 x + 2y + 3z <= 4
expr = new GRBLinExpr();
expr.addTerm(1.0,x);expr.addTerm(2.0,y);expr.addTerm(3.0,z);
model.addConstr(expr,GRB.LESS_EQUAL,4.0,"c0");
// 添加约束条件二 x + y >= 1
expr = new GRBLinExpr();
expr.addTerm(1.0,x);expr.addTerm(1.0,y);
model.addConstr(expr,GRB.GREATER_EQUAL,1.0,"c1");
// 优化模型
model.optimize();
System.out.println(x.get(GRB.StringAttr.VarName) + " " + x.get(GRB.DoubleAttr.X));
System.out.println(y.get(GRB.StringAttr.VarName) + " " + y.get(GRB.DoubleAttr.X));
System.out.println(z.get(GRB.StringAttr.VarName) + " " + z.get(GRB.DoubleAttr.X));
System.out.println("Obj:" + model.get(GRB.DoubleAttr.ObjVal));
// 回收处理
model.dispose();
env.dispose();
} catch (GRBException e){
System.out.println("Error code:" + e.getErrorCode() + ". " + e.getMessage());
}
}
}
参考文档:
http://www.gurobi.com/documentation/
https://blog.csdn.net/owen6314/article/details/70342275