首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在OR工具中使用AddBoolXOr

如何在OR工具中使用AddBoolXOr
EN

Stack Overflow用户
提问于 2021-06-19 13:02:22
回答 1查看 405关注 0票数 0

我试着去理解或者-工具。我想用模块化2来求解这个方程组:

代码语言:javascript
复制
x1 + x2 + x3 + 0  = 0
x1 + x2 + 0  + x4 = 1
x1 + 0  + x3 + x4 = 1
0  + x2 + x3 + x4 = 1

这与模块化2等同为:

代码语言:javascript
复制
x1 ^ x2 ^ x3 = 0
x1 ^ x2 ^ x4 = 1
x1 ^ x3 ^ x4 = 1
x2 ^ x3 ^ x4 = 1

使用按位的xor (请参阅here)。

因此,我尝试了以下代码:

代码语言:javascript
复制
from ortools.sat.python import cp_model

# Creates the model.
model = cp_model.CpModel()

# Creates the variables.
x1 = model.NewBoolVar('x1')
x2 = model.NewBoolVar('x2')
x3 = model.NewBoolVar('x3')
x4 = model.NewBoolVar('x4')

# Creates the constraints.
model.AddBoolXOr(x1 ^ x2 ^ x3 == 0)
model.AddBoolXOr(x1 ^ x2 ^ x4 == 1)
model.AddBoolXOr(x1 ^ x3 ^ x4 == 1)
model.AddBoolXOr(x2 ^ x3 ^ x4 == 1)

# Creates a solver and solves the model.
solver = cp_model.CpSolver()
status = solver.Solve(model)

if status == cp_model.OPTIMAL:
    print('x1 = %i' % solver.Value(x1))
    print('x2 = %i' % solver.Value(x2))
    print('x3 = %i' % solver.Value(x3))
    print('x4 = %i' % solver.Value(x4))

但我明白:

‘在线性表达式上调用xor不受支持,’NotImplementedError:不支持对线性表达式调用xor,请使用CpModel.AddBoolXor

如果我使用AddBoolXor而不是AddBoolXOr,我会得到:

AttributeError:'CpModel‘对象没有属性'AddBoolXor'

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-19 13:38:40

AddBoolXor接受一个布尔文本数组。

代码语言:javascript
复制
model.AddBoolXOr([x1, x2.Not(), x3])

AddBoolXor(xi)的语义是sum(xi) % 2 == 1

所以,在你的情况下

代码语言:javascript
复制
# Creates the constraints.
model.AddBoolXOr([x1, x2, x3, True])
model.AddBoolXOr([x1, x2, x4])
model.AddBoolXOr([x1, x3, x4])
model.AddBoolXOr([x2, x3, x4])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68047032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档