Java—Gurobi学习笔记(一)

这篇博客展示了如何利用Gurobi Java API创建并解决一个简单的混合整数线性规划(MIP)问题。代码中定义了三个二进制变量x, y, z,并设置了两个约束条件及最大化目标函数。程序成功找到最优解,输出为x=1.0, y=0.0, z=1.0,目标函数最优值为3.0。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据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.youkuaiyun.com/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

分析

  1. 创建环境
    GRBEnv grbEnv = new GRBEnv("name");

  2. 创建模型
    GRBModel grbModel = new GRBModel(grbEnv);

  3. 创建变量
    GRBVar x = grbModel.addVar(left.right,obj,vtype,name);

    left:x的左极限
    right....
    obj:x的客观系数,暂时不清楚何时能用到。
    vtype:x的类型continuous、binary、Integer......

  4. 创建数组变量
    GRBVar[] grbVars = {x1, x2, x3.....};
    
    创建这个数组方便后面操作
    
  5. 声明约束
    GRBLinExpr expr1 = new GRBLinExpr();
    expr1.addTerms(new double[]{1,2,3},grbVars);
    
    建立线性表达式,前面是系数,后面是变量数组
    
    
    grbModel.addConstr(expr1,GRB.LESS_EQUAL,4,"expr1");
    (左侧表达式/左侧值,符号,右侧表达式/右侧值,名字)
  6. 目标函数
    GRBLinExpr target = new GRBLinExpr();
    target.addTerms(new double[]{1,1,2},grbVars);
    grbModel.setObjective(target,GRB.MAXIMIZE);

  7. 求解
    grbModel.optimize();

  8. 输出结果
     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));
    }

  9. 处理模型和环境
    grbModel.dispose();
    grbEnv.dispose();

### Java 调用 Gurobi 进行优化计算 尽管对于 Java 的支持不如 Python 或 CPLEX 多,Gurobi 仍然提供了足够的接口来实现大多数常见的优化任务。下面是个简单的线性规划问题实例,展示了如何通过 Java 来调用 Gurobi。 #### 创建并设置模型 为了创建个新的优化模型,首先需要导入必要的包,并初始化环境以及模型对象: ```java import gurobi.*; // ... GRBEnv env = new GRBEnv(true); env.set("logFile", "gurobi.log"); env.start(); GRBModel model = new GRBModel(env); ``` 这里设置了日志文件路径以便追踪求解过程中的信息[^1]。 #### 添加变量 定义决策变量时,可以通过 `addVar` 方法指定其上下界和其他属性: ```java double lb[] = {0, 0}; // 下限 double ub[] = {1, Double.POSITIVE_INFINITY}; // 上限 char vtype[] = {'B', 'C'}; // 类型 (二元/连续) for(int i=0;i<2;i++) { String name="var"+i; double objCoeff=(i==0)?1:0; // 目标系数 model.addVar(lb[i],ub[i],objCoeff,vtype[i],name); } model.update(); // 更新模型以反映新添加的变量 ``` 此段代码片段中,第个变量被设为布尔类型(即取值范围为{0,1}),第二个则是无约束的实数变量。 #### 设置目标函数 接下来要设定目标表达式的方向(最小化还是最大化)及具体的数学形式: ```java model.setObjective(model.getVars()[0]); // 假定我们只关心第个变量作为目标项 if ("min".equalsIgnoreCase(sense)) { model.setModelSense(GRB.MINIMIZE); }else if ("max".equalsIgnoreCase(sense)){ model.setModelSense(GRB.MAXIMIZE); } ``` 这段逻辑允许灵活切换最优化方向。 #### 加入约束条件 最后步就是加入实际业务场景下的各种限制条件到模型里去: ```java double A[][]={{3,4},{8,2}}; double b[]={7,12}; for(int i=0;i<A.length;i++){ GRBLinExpr expr=new GRBLinExpr(); for(int j=0;j<A[i].length;j++){ expr.addTerm(A[i][j],model.getVars()[j]); } model.addConstr(expr,b[i],"c"+i); } model.optimize(); // 开始执行优化算法寻找最优解 ``` 上述循环构建了个矩阵表示法的不等式组,并将其转换成适合传递给 Gurobi 解算器的形式。 完成以上步骤之后就可以调用 `optimize()` 函数启动求解程序了。当切顺利的话,最终结果会被存储在相应的变量结构体内供后续处理使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_仇笑痴_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值