【发布时间】:2020-04-29 20:22:40
【问题描述】:
我正在尝试实现一个员工(护士)调度问题,并就如何实现特定约束寻求一些建议。问题如下:有一组员工和天数(均由整数标记)。可以为每个员工分配白班 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