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, ...] 是允许的。
我正在尝试添加限制条件,即护士至少要连续工作两天。 代码: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, ...] 是允许的。