我仍然是约束编程的初学者,我目前正试图在Python中实现护士调度问题,这类似于Google OR-Tools提供的示例。
然而,在我的调度问题中,存在多个患者,每个患者每天都有相同的班次,但在一天的不同时间点。我试图实施的约束应该确保给定的护士不被分配到相互重叠的班次。例如,如果病人X从上午10点到12点轮班,病人Y从上午9点到11点轮班,那么给定的护士应该只分配到其中一个班次。如何实现这一点呢?
我的方法是创建两个单独的列表(或组合它们的元组列表):
(1)定义每次轮班的持续时间,shift_duration
(以小时为单位表示每次轮班持续时间的元素列表)
(2)定义移位开始时间,shift_starting_point
(一个从0到24的元素列表,每个元素代表一个移位)在另一个列表中(类型类似于示例中的shift_requests
)。
我试图应用工作车间问题中的AddNoOverlap
方法,但我不知道如何使用这种方法将它们组合成一个硬约束规则。我也不知道这种方法是否有很大意义。我很感激任何帮助-谢谢!
我将从简单的方法开始:
for each conflicting pair of shifts (a, b):
for each nurse n:
model.AddBoolOr([assign_a_n.Not(), assign_b_n.Not()])
我知道这是二次方程,但它很简单。