在 CP-SAT 中以宽松的方式纳入约束

问题描述 投票:0回答:1

我的问题设置相当简单。我想在模型找到具有已定义约束的

const
x
后,向决策变量
y
x
添加
y
值。但我想仅当新的
const
x
值在其域范围内并遵循所有其他约束时才添加该
y
值。

我尝试了如下问题:

"""Model finding x and y values based on previously defined constraints"""

# defines NewBoolVar(b1, b2)
# This is the trick I tried to used
# defined a temporary bool var - NewBoolVar(temp_bool) and always wants it to be true

model.Add(1>=0).OnlyEnforceIf(temp_bool)     #always keeps temp_bool true

model.Add(x == x + const). OnlyEnforceIf(b1)
model.Add(y == y + const). OnlyEnforceIf(b2)

model.AddBoolOr([b1, temp_bool])
model.AddBoolOr([b2, temp_bool])

根据上述公式,我假设模型应该给出我期望的结果。但我没有得到我想要的。即使

x
y
在域范围内并遵循其他约束,它们也不会添加
const
值。我同意我有这个
temp_bool
变量,它正在完成它的工作,但没有给我预期的结果。

所以我想知道有什么技巧可以用来达到我的期望吗?还有其他方法可以建议吗?

谢谢:)

optimization mathematical-optimization or-tools constraint-programming cp-sat
1个回答
2
投票

您所写的内容没有任何内容是正确的:

  • ==
    不是赋值而是相等测试。因此它总是会失败。
  • model.Add(1 >= 0).OnlyEnforceIf(b)
    :那是什么???
    model.AddBoolOr(b)
    slightly worse model.Add(b == 1)
  • 此外,你的方程在逻辑上等价于
    b implies true
    ,这实际上不会影响
    b
    b=true
    b=false
    都是有效的解决方案。
  • model.AddBoolOr(b1, temp_bool)
    :temp_bool 始终为 true。 bool_or 总是满足并且不约束
    b1
© www.soinside.com 2019 - 2024. All rights reserved.