【问题标题】:Expressing multi variable constraints using OR-Tools使用 OR-Tools 表达多变量约束
【发布时间】:2020-03-14 09:16:14
【问题描述】:

我正在探索 Google 的 Cp-SAT 来对特定类型的约束进行建模,如下所示:

约束:

变量 X 可以取值 1、2 和 3
变量 Y 可以取值 2、3 和 4
变量 Z 可以采用值 5、6 和 7
当变量 X 的值为 1 时,Y 只能假设为 3 或 4
当变量 Y 值为 3 时,Z 只能假设为 7

给定变量 Y 值为 3 而 Z 值不是 7,求 X 和 Z 的可能值。

我无法使用 Google 的 CP-SAT Java 接口对此进行建模。有人可以帮忙吗?

我探索了以下示例,但仍然无法弄清楚: https://github.com/google/or-tools/blob/stable/ortools/linear_solver/samples/LinearProgrammingExample.java

https://github.com/google/or-tools/blob/stable/ortools/linear_solver/samples/SimpleMipProgram.java

【问题讨论】:

    标签: java constraint-programming or-tools


    【解决方案1】:

    您正在混合求解器(CP-SAT 接口和线性求解器接口)。

    你应该看看 CP-SAT 求解器,特别是这个约束:

    http://google.github.io/or-tools/java/classcom_1_1google_1_1ortools_1_1sat_1_1CpModel.html#a07c24a31bdfe0db93e53fbf38655f200

    请先阅读介绍性文档:

    https://developers.google.com/optimization/cp

    还有一份简单的食谱

    https://github.com/google/or-tools/blob/stable/ortools/sat/doc/README.md

    【讨论】:

    • 谢谢劳伦特·佩隆。这有很大帮助。我还有一个问题:如何在 CP-SAT 中实现这样的目标:(A == i) --> (B == j && C == k),其中 A,B,C 是 IntVars,i,j ,k 是整数。
    • 顺便说一句,我使用以下方法解决了与上述问题类似的问题: int numVals1 = 3; IntVar x1 = model2.newIntVar(0, 1, "x"); IntVar y1 = model2.newIntVar(0, 2, "y"); IntVar z1 = model2.newIntVar(0, 2, "z"); model2.addEquality(y1, 1); model2.addDifferent(z1, 0); IntVar[] yz = 新的 IntVar[2]; yz[0] = y1; yz[1] = z1; int[][] vals = new int[2][2]; vals[0][0] = 0; vals[0][1] = 0; vals[1][0] = 1; vals[1][1] = 1; model2.addAllowedAssignments(yz, vals); CpSolverStatus status2 = solver.solve(model2);
    • 参见:github.com/google/or-tools/blob/stable/ortools/sat/doc/…,主要思想是创建一个中间布尔值,然后是 model.Add(B == j).OnlyEnforceIf(boolean) 和 model.Add(C == k).OnlyEnforceIf(boolean)
    猜你喜欢
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多