OR-Tools通道约束:是否必须指定boolean_var.Not()及反向约束?
OR-Tools通道约束中布尔变量Not()的使用说明
分场景说明是否必须使用Not():
当需要实现「布尔变量b与约束C双向等价(b ↔ C)」时,必须补全
Not()的对应约束
比如原示例中要实现b == (x >=5),这是双向绑定逻辑:b为真时x必须≥5,同时x≥5时b必须为真。如果只写model.Add(x >=5).OnlyEnforceIf(b),仅表达了「b为真→x≥5」的单向逻辑,反过来x≥5时b的取值不受约束,完全可能为假,不符合等价需求。所以必须加上model.Add(x <5).OnlyEnforceIf(b.Not()),确保x<5时b必为假,双向逻辑才完整,这属于强制要求。当仅需要「布尔变量b为真时触发约束C」的单向蕴含时,完全可以省略
Not()的约束
比如你只关注x≥5的情况,只要b为真时x必须≥5,而b为假时x可以取任意值,那只写model.Add(x >=5).OnlyEnforceIf(b)就足够,不需要额外添加x<5和b.Not()的相关约束。这种场景下不是强制要求,完全根据业务逻辑决定。
针对示例中y的约束补充:
原示例里b为真时y=10-x,b为假时y=0是覆盖了b的所有取值情况,如果你只需要b为真时y满足等式,b为假时y无限制,那可以只保留model.Add(y == 10 - x).OnlyEnforceIf(b),省略model.Add(y == 0).OnlyEnforceIf(b.Not())这一行。
内容的提问来源于stack exchange,提问作者Ken Adams
相关产品推荐
相关产品推荐

