Gurobi:使用Java+Gurobi建立一个小数学模型

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);

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值