Or-Tools排班开发:如何在护士排班场景中添加员工技能匹配约束
你需要的技能约束可以按以下方式实现,直接替换你代码中// define shifts skills requirements的占位部分即可:
// define shifts skills requirements const int SKILL_A = 0; const int SKILL_B = 1; for (int d : all_days) { for (int s : all_shifts) { LinearExpr a_skill_count; LinearExpr b_skill_count; for (int n : all_workers) { auto key = std::make_tuple(n, d, s); // 持有对应技能的员工,当班状态计入对应统计项 if (skills[n][SKILL_A] == 1) { a_skill_count += shifts[key]; } if (skills[n][SKILL_B] == 1) { b_skill_count += shifts[key]; } } // 要求每个班次两类技能的当班人数均不低于1 cp_model.AddGreaterOrEqual(a_skill_count, 1); cp_model.AddGreaterOrEqual(b_skill_count, 1); } }
补充说明:
- 该实现完全复用你现有的
skills数组定义,不需要修改之前的变量结构 - 当员工同时具备A、B两类技能时,他的当班状态会同时被计入两类技能的人数统计,天然支持你要求的「同一员工可同时满足两项技能要求」的规则
- 约束逻辑和你已实现的班次人数上下限逻辑层级一致,不会和你后续添加的工时、员工排班诉求等其他约束产生冲突
内容的提问来源于stack exchange,提问作者arxarian
相关产品推荐
相关产品推荐

