【问题标题】:Use decision variable only in constraint Gurobi Java仅在约束 Gurobi Java 中使用决策变量
【发布时间】:2017-05-09 04:26:30
【问题描述】:

通常在 Gurobi 的 Java 界面中,我通过向模型添加变量来创建模型,例如:

for (int i = 0; i < n; i++){
    for (int j = 0; j < n; j++) {
        XobjectiveCoef = distance(i, j);
        X[i][j] = model.addVar(0.0, 1.0, XobjectiveCoef, GRB.BINARY, "x" + String.valueOf(i) + "_" + String.valueOf(j));

    }
}

完成后,我的模型是 i 和 j 上所有 X 的总和,我可以在任何我想要的约束中使用 X[i][j],如下所示:

for (int j = 0; j < n; j++) {
    GRBLinExpr expr = new GRBLinExpr();
    for (int i = 0; i < n; i++){
        expr.addTerm(1.0, X[i][j]);
    }
    model.addConstr(expr, GRB.EQUAL, 1.0, "Name_of_constraint");
}

现在我正在寻找的是一种仅在约束中而不是在模型定义中使用决策变量的方法。我检查了addVar 是否可用于GRBLinExpr,但它不是。

谢谢

【问题讨论】:

    标签: java optimization gurobi


    【解决方案1】:

    您可以创建一个GRBLinExpr 并重复使用它。例如:

    model.addConstr(expr, GRB.EQUAL, 1.0, "ct1");
    expr.addTerm(1.0, Y);
    expr.addTerm(1.0, Z).
    model.addConstr(expr, GRB.GREATER_EQUAL, 2.0, "ct2");
    

    这可能会也可能不会比创建新的GRBVar 对象更有效。

    【讨论】:

    • 感谢您的回答。我知道我可以重用 expr,但我不确定我能得到答案。如果 Y 和 Z 不在模型定义中(因此不是用 model.addVar(...) 创建的),我在哪里以及如何创建它们?。
    • Y 和 Z 是新变量;该示例只是表明您可以重用名为 expr 的 GRBLinExpr。
    • 谢谢你的例子。但正如您从主要问题和评论中看到的那样,问题不在于重用表达式,问题在于创建决策变量而不将其添加到目标函数中。构造函数new GRBVar不可用,必须通过model.addVar(...)。但是,如果我调用 model.addVar(...) ,它会将这个变量添加到目标函数中。我说的对吗?
    • 所有变量都在目标函数中。有些系数为零。
    猜你喜欢
    • 1970-01-01
    • 2021-01-23
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多