如何在Python OR-Tools CP-SAT中实现每班恰好分配2名护士?
OR-Tools CP-SAT 实现每班恰好2名护士排班的解决方案
方法一:使用官方提供的AddExactlyKConstraints(推荐)
CP-SAT库本身针对这类场景提供了优化的约束方法,直接替换原有的AddExactlyOne即可:
for d in all_days: for s in all_shifts: # 约束每班恰好分配2名护士 model.AddExactlyKConstraints([shifts[(n, d, s)] for n in all_nurses], 2)
这个方法专门用于指定恰好K个布尔变量为真,比手动写求和约束更高效,也能避免逻辑疏漏。
方法二:修复手动求和约束的问题
你尝试的sum(...) == 2思路本身是正确的,未成功大概率是变量定义或循环逻辑的问题,按以下规范调整:
- 确保
shifts[(n, d, s)]是cp_model.BoolVar类型(只有布尔变量的求和才能正确表示选中的护士数量) - 确认
all_nurses集合包含所有需参与排班的护士,无遗漏或错误项 - 正确的代码示例:
for d in all_days: for s in all_shifts: # 约束当前班次的护士排班变量之和等于2 model.Add(sum(shifts[(n, d, s)] for n in all_nurses) == 2)
额外排查点
如果调整后仍无解,需检查其他约束是否与“每班2人”规则冲突:
- 护士的最大排班次数限制是否过于严格
- 连续排班、休息日等约束是否导致无法凑出每班2人
- 确认
all_days和all_shifts的遍历范围覆盖所有需要排班的日期和班次
内容的提问来源于stack exchange,提问作者MG G
相关产品推荐
相关产品推荐

