我想知道 Google OR-Tools 中逻辑约束的语法。我有一个在 CPLEX 中完成的护士调度项目,我正在将其翻译到 Google OR-Tools。我在 Google OR-Tools 中遇到了有关通道约束的文档,但我很困惑。您能帮我理解如何在 Google OR-Tools 中实现这个 CPLEX 逻辑约束吗?我有一个尝试,但它没有按预期工作:(
语境:
working_assignment_vars_long[r,h,i] 是一个二元决策变量,表示角色 r 中的护士 i 是否在 15 分钟间隔 h(即下午 1:15)工作。
lunch_break_assignment_vars_long[r,h,i] 是一个二元决策变量,表示角色 r 中的护士 i 是否在 15 分钟间隔 h(即下午 1:15)休息。
simple_break_assignment_vars_long[r,h,i] 是一个二元决策变量,表示角色 r 中的护士 i 是否以 15 分钟间隔 h 休息。
因此,CPLEX 中的这个约束是说,如果给定护士的工作间隔为 31 次或更少,间隔 15 分钟,那么他们应该有 0 次午休和 1 次简单休息。
CPLEX 逻辑约束:
for r, num_role in role_dict.items():
for i in range(0,num_role):
model.add_if_then(
model.sum(model.working_assignment_vars_long[r,h,i] for h in range(0,144))
<= 31,
(model.sum(model.lunch_break_assignment_vars_long[r,h,i] for h in range(0,144)) ==
0) + (model.sum(model.simple_break_assignment_vars_long[r,h,i] for h in range(0,144)) ==
1) >= 2,
'less_than_8_hr_0_lunch_break_1_simple_break'
)
我在 OR-Tools 中尝试了以下代码:
for r, num_role in role_dict.items():
for i in range(0,num_role):
b=model.NewBoolVar(‘b’)
model.Add(sum(working.assignment_vars_long[r,h,i] for h in range(0,144)) <= 31).OnlyEnforceIf(b)
model.Add(sum(lunch_break_assignment_vars_long[r,h,i] for h in range(0,144)) == 0).OnlyEnforceIf(b)
model.Add(sum(simple_break_assignment_vars_long[r,h,i] for h in range(0,144)) == 1).OnlyEnforceIf(b)
虽然这并没有按预期工作:(因为我看到护士的工作间隔少于 32 15 分钟,既没有午休也没有简单的休息。非常感谢任何见解/帮助。我已经被这个问题困扰了很长时间了:(