Roster/Timetable代
Roster/Timetable generation
我正在开发一种工具,可以为员工生成长达一个月的时间表,同时考虑到商业和劳动法的限制。与 similar problem 的挑战和区别很少:
- 班次概念包含最多半小时的休息时间。
- 没有提到类似问题的全8班的概念。例如早上8点需要2个资源,下午3点需要2.5个资源(比如休息半小时)..
- 和常规限制,例如每天的小时数、休息前的小时数、休息时间...
可能的解决方案是依靠使用求解器(又名 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
忽略未使用的分配。
我正在开发一种工具,可以为员工生成长达一个月的时间表,同时考虑到商业和劳动法的限制。与 similar problem 的挑战和区别很少:
- 班次概念包含最多半小时的休息时间。
- 没有提到类似问题的全8班的概念。例如早上8点需要2个资源,下午3点需要2.5个资源(比如休息半小时)..
- 和常规限制,例如每天的小时数、休息前的小时数、休息时间...
可能的解决方案是依靠使用求解器(又名 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
忽略未使用的分配。