在 Google OR 工具中使用 NewBoolVar
Using NewBoolVar in Google OR-Tools
我想知道 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:15PM)工作。
lunch_break_assignment_vars_long[r,h,i] 是一个二元决策变量,表示角色 r 中的护士 i 是否在 15 分钟间隔 h(即 1:15PM)休息。
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 分钟,没有午休时间也没有简单的休息时间。非常感谢任何 insight/help。我被困住了在这个问题上这么久了:(
在官方文档中记录了如何执行 If-Then-Else 表达式。
你没有限制b.Not()
:
model.Add(sum(working.assignment_vars_long[r,h,i] for h in range(0,144)) > 31).OnlyEnforceIf(b.Not())
我想知道 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:15PM)工作。
lunch_break_assignment_vars_long[r,h,i] 是一个二元决策变量,表示角色 r 中的护士 i 是否在 15 分钟间隔 h(即 1:15PM)休息。
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 分钟,没有午休时间也没有简单的休息时间。非常感谢任何 insight/help。我被困住了在这个问题上这么久了:(
在官方文档中记录了如何执行 If-Then-Else 表达式。
你没有限制b.Not()
:
model.Add(sum(working.assignment_vars_long[r,h,i] for h in range(0,144)) > 31).OnlyEnforceIf(b.Not())