限制一天工作的范围

时间:2019-05-10 11:07:37

标签: c# or-tools

我正在编写代码以自动为我的工人生成班次。 我已经能够创建一些约束条件:

  • 每天的每个班次分配给一个工人
  • 每个工人每天不能工作超过8小时
  • 每个工人每周应工作[ #minShifts #maxShifts ]小时
  • 每个工人不能同时在不同的房间工作
  • 每个工人一天不能在两个以上的房间里工作

到目前为止一切都很好;现在我面临着另一个约束,我真的无法思考如何编写代码:每个工人一天不能在两个以上的不同范围内工作
我的意思是我不希望一个人工作(例如)08.30-10.30、12.30-13.30和16.30-18.30,但是将分配的范围限制为两个。

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

1 个答案:

答案 0 :(得分:1)

如果您每两个小时[上午8点班,上午9点班]的每个区块都使用这些变量, 创建一个布尔值是真实的,即第一个班次为开,第二个班次为关

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)