繁体   English   中英

如何在 CP-SAT 中指定条件约束

[英]How to specify conditional constraints in CP-SAT

我想添加表单的约束

a - b > 0 如果 c + d == 4

文档讨论了我希望允许的OnlyEnforceIf

model.Add(a-b > 0).OnlyEnforceIf(c+d==4)

不幸的是,似乎 OnlyEnforceIf 只能采用单个布尔值,而不是诸如 c+d==4 之类的条件。 如果我正确阅读了文档,那么它会继续建议

model.Add(c+d==4).OnlyEnforceIf(b)
model.Add(c+d!=4).OnlyEnforceIf(b.Not())
model.Add(a-b > 0).OnlyEnforceIf(b)

我有两个问题:

  1. 有人可以解释一下这个公式的逻辑吗? 如果第一个条件应该读作“如果 b 则 c+d == 4。如果不是 b,则 c+d != 4。如果 b 则 ab > 0”,那么逻辑似乎不正确。 我希望约束是 ab>0 if c+d==4 所以肯定是“如果 c+d==4 那么 b”不应该?
  2. 我有很多需要强加的约束,所以看来我需要创建很多新变量。 我注意到,例如在 CPLEX 中,您可以直接指定 if-then 而无需创建新变量。 我错过了什么吗?
  1. 让我们分解(c+d == 4) <=> b
    1. b => (c+d == 4)model.Add(c+d==4).OnlyEnforceIf(b)添加
    2. (c+d == 4) => b对立面not(b) => not(c+d == 4)并且是用model.Add(c+d!=4).OnlyEnforceIf(b.Not())
  2. ortools 的理念是他们不想像 CPLEX 那样在后台创建变量。 参考

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM