将 or 语句添加到 OR-Tools 约束(CP-SAT 求解器)
Adding an or-statement to an OR-Tools constraint (CP-SAT solver)
所以我正在尝试在 OR-tools 中构建一个类似于 employee scheduling 示例的调度工具。但是,在我的例子中,有十个班次要轮班,我想通过确保前两个班次或最后两个班次不上班来防止人们每天工作十小时。
我想做这样的事情,但它一直说解决方案不可行。
all_nurses = range(5)
all_shifts = range(10)
all_days = range(20)
for n in all_nurses:
for d in all_days:
model.add(sum(shifts[(n,d,s)] for s in [0, 1]) == 0 or sum(shifts[(n,d,s)] for s in [8, 9]) == 0)
它真的不可行还是这段代码没有按照我的想法去做?
感谢 Laurent 帮我找到答案!
为了将来参考,在代码中它看起来像这样:
for n in all_nurses:
for d in all_days:
# Implement the contraint
b = model.NewBoolVar(f'constr_{n}_{d}')
model.add(sum(shifts[(n,d,s)] for s in [0, 1]) == 0).OnlyEnforceIf(b)
model.add(sum(shifts[(n,d,s)] for s in [0, 1]) > 0).OnlyEnforceIf(b.Not())
# Apply the contraint
model.add(sum(shifts[(n,d,s)] for s in [8, 9]) == 0).OnlyEnforceIf(b.Not())
请阅读https://github.com/google/or-tools/blob/stable/ortools/sat/doc/channeling.md
简而言之,or, and, min, max python 关键字没有被正确解释。
在您的情况下,sum() == 0 将在对象上,因此在解析 python 代码时始终评估为 True。
您需要创建所有中间布尔变量,并在这些变量上添加 bool_or 约束。
所以我正在尝试在 OR-tools 中构建一个类似于 employee scheduling 示例的调度工具。但是,在我的例子中,有十个班次要轮班,我想通过确保前两个班次或最后两个班次不上班来防止人们每天工作十小时。
我想做这样的事情,但它一直说解决方案不可行。
all_nurses = range(5)
all_shifts = range(10)
all_days = range(20)
for n in all_nurses:
for d in all_days:
model.add(sum(shifts[(n,d,s)] for s in [0, 1]) == 0 or sum(shifts[(n,d,s)] for s in [8, 9]) == 0)
它真的不可行还是这段代码没有按照我的想法去做?
感谢 Laurent 帮我找到答案! 为了将来参考,在代码中它看起来像这样:
for n in all_nurses:
for d in all_days:
# Implement the contraint
b = model.NewBoolVar(f'constr_{n}_{d}')
model.add(sum(shifts[(n,d,s)] for s in [0, 1]) == 0).OnlyEnforceIf(b)
model.add(sum(shifts[(n,d,s)] for s in [0, 1]) > 0).OnlyEnforceIf(b.Not())
# Apply the contraint
model.add(sum(shifts[(n,d,s)] for s in [8, 9]) == 0).OnlyEnforceIf(b.Not())
请阅读https://github.com/google/or-tools/blob/stable/ortools/sat/doc/channeling.md
简而言之,or, and, min, max python 关键字没有被正确解释。 在您的情况下,sum() == 0 将在对象上,因此在解析 python 代码时始终评估为 True。
您需要创建所有中间布尔变量,并在这些变量上添加 bool_or 约束。