根据Gurobi自带的Mip1案例去编写的。
代码
import gurobi.*;
import static gurobi.GRB.GREATER_EQUAL;
import static gurobi.GRB.LESS_EQUAL;
/*
maximize x + y + 2 z
subject to x + 2 y + 3 z <= 4
x + y >= 1
x, y, z binary
*/
/**
* @Author:superNova
* @ClassName:Mip1
* @Description:example from gurobi itself(Mip1)
* @Date:2022/09/02/21:01
* @Email:shiyudawei@qq.com
* @Blog:https://blog.csdn.net/shiyudawei?spm=1018.2226.3001.5343
*/
public class Mip1 {
public static void main(String[] args) {
try {
//创建环境
GRBEnv grbEnv = new GRBEnv("grbEnv");
GRBModel grbModel = new GRBModel(grbEnv);
//创建变量
GRBVar x = grbModel.addVar(0,1,0,GRB.BINARY, "x");
GRBVar y = grbModel.addVar(0,1,0,GRB.BINARY, "y");
GRBVar z = grbModel.addVar(0,1,0,GRB.BINARY, "z");
//创建变量数组
GRBVar[] grbVars = {x,y,z};
//创建限制条件
GRBLinExpr expr1 = new GRBLinExpr();
expr1.addTerms(new double[]{1,2,3},grbVars);
grbModel.addConstr(expr1,LESS_EQUAL,4,"expr1");
GRBLinExpr expr2 = new GRBLinExpr();
expr2.addTerms(new double[]{1,1,0},grbVars);
grbModel.addConstr(expr1,GREATER_EQUAL,1,"expr2");
//设置目标函数
GRBLinExpr target = new GRBLinExpr();
target.addTerms(new double[]{1,1,2},grbVars);
grbModel.setObjective(target,GRB.MAXIMIZE);
//求解
grbModel.optimize();
//输出结果
System.out.println("最优解为:" + grbModel.get(GRB.DoubleAttr.ObjVal));
for (int i = 0; i < grbVars.length; i++) {
System.out.println(grbVars[i].get(GRB.StringAttr.VarName) + "=" + grbVars[i].get(GRB.DoubleAttr.X));
}
//处理模型和环境
grbModel.dispose();
grbEnv.dispose();
}catch (Exception e){
e.printStackTrace();
}
}
}
结果
Optimal solution found (tolerance 1.00e-04)
Best objective 3.000000000000e+00, best bound 3.000000000000e+00, gap 0.0000%
最优解为:3.0
x=1.0
y=0.0
z=1.0
分析
- 创建环境
GRBEnv grbEnv = new GRBEnv("name");
- 创建模型
GRBModel grbModel = new GRBModel(grbEnv);
- 创建变量
GRBVar x = grbModel.addVar(left.right,obj,vtype,name);
left:x的左极限
right....
obj:x的客观系数,暂时不清楚何时能用到。
vtype:x的类型continuous、binary、Integer...... - 创建数组变量
GRBVar[] grbVars = {x1, x2, x3.....};
创建这个数组方便后面操作
- 声明约束
GRBLinExpr expr1 = new GRBLinExpr(); expr1.addTerms(new double[]{1,2,3},grbVars);
建立线性表达式,前面是系数,后面是变量数组
grbModel.addConstr(expr1,GRB.LESS_EQUAL,4,"expr1");
(左侧表达式/左侧值,符号,右侧表达式/右侧值,名字)
- 目标函数
GRBLinExpr target = new GRBLinExpr(); target.addTerms(new double[]{1,1,2},grbVars); grbModel.setObjective(target,GRB.MAXIMIZE);
- 求解
grbModel.optimize();
- 输出结果
System.out.println("最优解为:" + grbModel.get(GRB.DoubleAttr.ObjVal)); for (int i = 0; i < grbVars.length; i++) { System.out.println(grbVars[i].get(GRB.StringAttr.VarName) + "=" + grbVars[i].get(GRB.DoubleAttr.X)); }
- 处理模型和环境
grbModel.dispose(); grbEnv.dispose();