OR-TOOLS排班实现:如何设置约束避免医生排连续service_blocks班次
OR-Tools 医护排班禁止连续班次约束实现方案
约束逻辑
- 核心判断:对任意医生,只要在某班次被分配任意岗位即标记为当值
- 约束规则:同一名医生的相邻两个班次的当值状态不能同时为真
需添加的代码片段
将以下代码放在你现有main()函数里,两个已有约束的下方即可:
# 禁止医生连续值两个班次约束 for d in all_doctors: # 遍历所有相邻班次对 for b in range(num_service_block - 1): # 相邻两个班次的当值次数之和不能超过1 model.Add( sum(roles[(d, b, r)] for r in all_roles) + sum(roles[(d, b + 1, r)] for r in all_roles) <= 1 )
说明
该约束和你现有「每个医生每个班次最多承担1个岗位」的约束天然兼容:每个班次的sum(roles[(d, b, r)]...)取值最多为1,两个班次的和小于等于1就保证了不会出现连续两个班次都当值的情况。
内容的提问来源于stack exchange,提问作者eibwen
相关产品推荐
相关产品推荐

