如何正确编写多个索引的约束?

How to properly write constraints over multiple indexes?

我正在尝试实现一个员工(护士)调度问题,并就如何实现一个特定的constraint.The问题寻求一些建议如下:有一组员工和天数(均标有整数数)。可以为每个员工分配白班 D[(i, j)] 、夜班 N[(i, j)] 或休息日 V[(i, j)] 。这些是我的决策变量:

D = LpVariable.dicts(name="Dagdienst", indexs=[(i, j) for i in employees for j in days], cat='Binary')
N = LpVariable.dicts(name="Nachtdienst", indexs=[(i, j) for i in employees for j in days], cat='Binary')
V = LpVariable.dicts(name="Vrij", indexs=[(i, j) for i in employees for j in days], cat='Binary')

生成合理计划的约束示例如下。

for i in employees:
    for j in days:
        m += D[(i, j)] + N[(i, j)] + V[(i, j)] == 1

另一个似乎有效的约束条件(即实施此约束条件后,在夜班后的接下来两天内,没有员工被分配白班)

for i in employees:
    for j in range(1, len(days)-1):
        m += N[(i, j)] + D[(i, (j + 1))] <= 1
        m += N[(i, j)] + D[(i, (j + 2))] <= 1

我希望上述约束的实施不言而喻。如果需要澄清,请询问!

以同样的方式,我试图强制执行一个限制,即员工可以(日)轮班分配的最大连续天数。

max_consecutive_days = 4
for i in medewerkers:
    for j in range(1, (len(dagen)+1 - max_consecutive_days)):
        m += D[(i, j)] + D[(i, j + 1)] + D[(i, j + 2)] + D[(i, j + 3)] <= max_consecutive_days

然而,这似乎对生产的时间表没有任何影响,因为员工仍然连续分配 4 天以上。

我在这里错过了什么?提前致谢!

你可以看到

D[(i, j)] + D[(i, j + 1)] + D[(i, j + 2)] + D[(i, j + 3)] <= 4

从不具有约束力。我想你想要:

D[(i, j)] + D[(i, j + 1)] + D[(i, j + 2)] + D[(i, j + 3)] + D[(i, j + 4)] <= 4