Or-tools:连续添加 2 天到调度问题

Or-tools: Add 2-days in a row to the scheduling problem

我正在尝试添加限制条件,即护士至少要连续工作两天。 代码:https://developers.google.com/optimization/scheduling/employee_scheduling#program2

我的想法是:“如果有班次而之前没有,那么第二天加班”

for n in all_nurses:
    for d in range(1,6): #Because use d-1 and d+1
        for s in all_shifts:
#1-st try            model.AddImplication(shifts[(n, d-1, s)]==0 and shifts[(n, d, s)]==1, shifts[(n, d+1, s)]==1)
#2-nd try:            model.Add(shifts[(n, d+1, s)]==1).OnlyEnforceIf(shifts[(n, d-1, s)]==0 and shifts[(n, d, s)]==1)

第 1 次:投掷 TypeError: NotSupported: model.GetOrMakeBooleanIndex(shift_n0d2s0 == 1) 第二次:投掷:AttributeError: 'BoundedLinearExpression' object has no attribute 'Index'

您第二次尝试的正确版本是:

model.Add(shifts[(n, d+1, s)]==1).OnlyEnforceIf([shifts[(n, d-1, s)].Not(), shifts[(n, d, s)]])

您还可以这样做:

model.AddBoolOr([shifts[(n, d-1, s)], shifts[(n, d, s)].Not(), shifts[(n, d+1, s)]])

将其视为 len 1 的禁止真值,参见:

此外,您没有考虑边界,现在 [1, 0, 0, ...] 是允许的。