在 Google OR 工具中使用 NewBool​​Var

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())