Roster/Timetable代

Roster/Timetable generation

我正在开发一种工具,可以为员工生成长达一个月的时间表,同时考虑到商业和劳动法的限制。与 similar problem 的挑战和区别很少:

可能的解决方案是依靠使用求解器(又名 OR-Tools 和 Optaplanner)。有什么提示吗?

如果您选择 OptaPlanner 并且不想遵循将 8 小时轮班(计划实体)分配给员工(计划值)的员工排班设计,因为您的第二个约束, 那么您可以尝试遵循 Cheap Time Example 设计,如下所示:

@PlanningEntity public class WorkAssignment {
     Employee employee;
     @PlanningVariable PotentialShiftStartTime startTime
     @PlanningVariable int durationInHalfHours
}

PotentialShiftStartTime 基本上是班次可以有效开始的任何时间,因此周一 8:00、周一 8:30、周一 9:00 等

搜索 space 将是巨大的,以这种自由形式的方式,但有一些技巧可以提高可扩展性(附近选择,CH 尽早选择,CH 有限选择,...)。

要摆脱自由形式的方式(=减少搜索 space),您可以将 startTime 和 durationInHalfHours 合并到 PotentialShift 中,例如,如果无法开始 8 小时轮班在 16:00 下午。但在引入这种复杂性之前,请确保收益是巨大的。

无论如何,这种设计的问题在于确定要创建多少个 WorkAssignment 实例。因此,您可能希望为每位员工创建最大数量,并使用 nullable=true 忽略未使用的分配。