我正在开发一个为空中救护车生成名册的系统,显然这些名册受到很大限制,并且有大量关于飞行员应该休息多少时间的规则。这些限制之一是“飞行员在过去 [14] 天中可以有不少于 [2] 个连续休息日。”一段时间以来,我一直试图将这条规则表示为约束,但我有点卡住了。
我代表 BoolVar 字典的职责:
duties = {}
for p in p_n:
for x in x_n:
for d in d_n:
duties[(p, x, d)] = model.NewBoolVar(f"duty_p{p}_x{x}_d{d}")
其中
p
为飞行员索引(每个飞行员被称为 0、1、2...),x
为日索引,d
d 为值班类型。对于飞行员休息的日子,此类型为 0
或 4
,对于飞行员上班的日子,此类型为 1, 2, 3, 5, 6, 7, 8
(所有这些其他职责都是不同类型的职责)。 duty_p1_x1_d0 = 1 意味着飞行员 1 在第一天关闭。我将如何在此表示中表示上述规则?
我最初尝试了类似
sum(duties[p, x, 0] * duties[(p, x+1, 0)] for x in range(0, 14)) >= 1
的方法,但由于 Or-Tools 中 BoolVars 的性质而失败了。任何建议将不胜感激,我有点难住了!
您应该看看 shift_scheduling 示例。
特别是,软序列约束为布尔变量序列定义了 4 个值。连续数量的硬下限和上限,以及相同数量的软下限和上限。