1

我想知道 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 分钟,既没有午休也没有简单的休息。非常感谢任何见解/帮助。我已经被这个问题困扰了很长时间了:(

4

1 回答 1

3

在官方文档中记录了如何执行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())
于 2022-01-22T00:11:32.477 回答