如何在多个索引上正确写约束条件?

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

我正试图实现一个员工(护士)排班问题,就如何实现一个特定的约束条件寻求一些建议.问题如下。有一组雇员和天数(都用整数标注)。每个员工都可以被分配到白班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天以上的工作。

我在这里遗漏了什么?先谢谢你

python linear-programming pulp
1个回答
1
投票

你可以看到

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
© www.soinside.com 2019 - 2024. All rights reserved.