因此,我尝试在 OR-tools 中构建一个类似于“员工调度”示例的调度工具。然而,就我而言,有十个班次需要覆盖,我想通过确保前两个班次关闭或最后两个班次关闭来防止人们每天工作十个小时。 我想做这样的事情,但它一直说解决方案是不可行的。
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())