首页 > 解决方案 > 限制一天工作的范围数

问题描述

我正在编写代码来自动为我的工人生成轮班。我已经能够创建几个约束:

到现在为止还挺好; 现在我面临着另一个我无法真正思考如何编码的限制:每个工人一天不能在超过 2 个不同的范围内工作
我的意思是我不希望一个人在 08.30-10.30、12.30-13.30 和 16.30-18.30 工作,但将分配的范围限制为两个。

鉴于我有shifts[numWorkers, numDays, numShifts],我该如何安排这个约束?

标签: c#or-tools

解决方案


如果您在两个小时的每个块中都使用这些变量 [上午 8 点班次,上午 9 点班次],则创建一个布尔变量,即第一个班次为 ON,第二个班次为 OFF

end_of_shift = model.NewBoolVar('')
model.AddBoolOr([first_shift.Not(), second_shift, end_of_shift])
model.AddImplication(end_of_shift, first_shift)
model.AddImplication(end_of_shift, second_shift.Not())

# then for each day and each worker: 
model.Add(sum(end_of_shifts) <= 2)

推荐阅读