如何将设定时间范围约束中所需的连续休息天数编码到 Or-Tools 时间表中?

问题描述 投票:0回答:1

我正在开发一个为空中救护车生成名册的系统,显然这些名册受到很大限制,并且有大量关于飞行员应该休息多少时间的规则。这些限制之一是“飞行员在过去 [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 的性质而失败了。任何建议将不胜感激,我有点难住了!

python or-tools constraint-programming cp-sat
1个回答
0
投票

您应该看看 shift_scheduling 示例

特别是,软序列约束为布尔变量序列定义了 4 个值。连续数量的硬下限和上限,以及相同数量的软下限和上限。

© www.soinside.com 2019 - 2024. All rights reserved.