【问题标题】:Writing a Linear Expression for a MIP in or-tools在 or-tools 中为 MIP 编写线性表达式
【发布时间】:2019-08-13 13:57:25
【问题描述】:

我正在尝试使用 Java 在 or-tools 中编写线性表达式,然后将其添加到约束中。

正如在文档 linear_exprGitHub 中已经看到的那样,有一种方法可以做到这一点。

尽管如此,我不清楚如何将其用于这样的示例:

linear_expr: offset + sum_{i in S} a_i*x_i
constraint: linear_expr <= y_j

xy 是决策变量

这就是我认为应该的样子。

    /*define variables and parameters*/
double offset = Math.random();
int S = 10;
ArrayList<Double> aList = new ArrayList<Double>();
/*define variable x and parameter a*/
HashMap<Integer,LinearExpr> x = new HashMap<Integer,LinearExpr>();
for (int i = 0; i < S; i++) {
LinearExpr x_variable = solver.makeBoolVar("x_variable_" + i);
    x.put(i,x_variable);
    aList.set(i,Math.random());
}
int K = 20;
/*define variable y*/
HashMap<Integer,LinearExpr> y = new HashMap<Integer,LinearExpr>();
for (int j = 0; j < K; j++) {
    LinearExpr y_variable = solver.makeNumVar(0,MPSolver.infinity(),"y_variable_" + j);
    y.put(j,y_variable);
}
/*linear_expr: offset + sum_{i in S} a_i*x_i
constraint: linear_expr <= y_j
*/
LinearExpr linear_expr = 0;
for (int i = 0; i < S; i++) {
linear_expr = linear_expr + x.get(i) * aList.get(i)
}
linear_expr = linear_expr + offset;
/*define constraint*/
for (int j = 0; j < K; j++) {
    MPConstraint constraint = solver.makeConstraint(linear_expr,MPSolver.infinity(),"constraint_"+j);
    constraint.setCoefficient(y.get(j),1);
}

此外,不可能创建 LinearExpr 变量。

【问题讨论】:

    标签: java or-tools mixed-integer-programming


    【解决方案1】:

    java中没有这样的API,你不能像你写的那样实现它,因为你不能重载+和*运算符。

    你需要在约束对象上使用 setCoefficient。

    现在您可以创建一个包含 3 个字段(变量列表、系数列表、常量)和适当的 addTerm()、addVar() 和 setConstant() 方法的类。

    话虽如此,您使用的 API 建议您仅使用布尔变量和整数系数。

    您可以查看提供LinearExpr class 的CP-SAT API。 请参阅此gentle introductionJava API

    【讨论】:

    • 我确实使用 setCoefficient 方法:constraint.setCoefficient(y.get(j),1);。如果我做对了,为了写下面的表达式offset + sum_{i in S} a_i*x_i我需要写我自己的类吗?如果不使用 LinearExpr 类,就没有其他方法可以编写它吗?变量 x 是否仍然可以是 MPVariable 类型?这在 Python 中是否可行?
    • LinearExpr 仅适用于 C++。你可以用 Java 重写它并添加一个solver.add() 方法来解析。我计划在下一个主要版本中实现这一点,但我还没有时间表。
    猜你喜欢
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多