如何在 Google OR-Tools 中设置条件?
How to set up conditionals in Google OR-Tools?
我正在尝试使用 OR-Tools 来解决自定义护士排班问题 - 基本上每个护士正好工作两个配对班次,并给出配对偏好的排名列表。
例如,nurse1 有以下偏好:
- 第 1 班和第 7 班
- 第 4 班和第 8 班
- 第 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])
这似乎已经完成了工作。
我正在尝试使用 OR-Tools 来解决自定义护士排班问题 - 基本上每个护士正好工作两个配对班次,并给出配对偏好的排名列表。
例如,nurse1 有以下偏好:
- 第 1 班和第 7 班
- 第 4 班和第 8 班
- 第 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])
这似乎已经完成了工作。