如何在 Google OR-Tools 中设置条件?

How to set up conditionals in Google OR-Tools?

我正在尝试使用 OR-Tools 来解决自定义护士排班问题 - 基本上每个护士正好工作两个配对班次,并给出配对偏好的排名列表。

例如,nurse1 有以下偏好:

  1. 第 1 班和第 7 班
  2. 第 4 班和第 8 班
  3. 第 2 班和第 6 班

如果护士被分配到第 1 班,他还必须工作 7 个班。如果护士被分配到第 4 个班,他也必须工作第 8 个班。如果护士被分配到第 2 个班,他必须工作第 6 个班.

医院的所有护士都是如此。

我可以安排个人班次,但我不知道如何创建请求矩阵或 link 班次。

有什么想法吗?

谢谢。

简单的答案就是对 2 个班次使用相同的布尔变量。

现在,如果你想实现以下约束

b1 <=> b2 && b3

我建议阅读以下内容recipe。注意连词可以扩展到2个以上的变量。

对于每位护士,我最终为每个选择创建一个新的 BoolVar,为每个轮班对创建一个 BoolAnd,并为所有三个轮班选择创建一个 BoolOr

first_choice = model.NewBoolVar("first_choice")
second_choice = model.NewBoolVar("second_choice")
third_choice = model.NewBoolVar("third_choice")

model.AddBoolAnd([shifts[(nurse, first_a)], shifts[(nurse, first_b)]]).OnlyEnforceIf(first_choice)
model.AddBoolAnd([shifts[(nurse, second_a)], shifts[(nurse, secon_b_b)]]).OnlyEnforceIf(second_choice)
model.AddBoolAnd([shifts[(nurse, third_a)], shifts[(nurse, third_b)]]).OnlyEnforceIf(third_choice)

model.AddBoolOr([first_choice, second_choice, third_choice])

这似乎已经完成了工作。