0

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

  • 班次概念包含长达半小时的休息时间。
  • 没有完整 8 班次的概念作为提到的类似问题。例如,早上 8 点需要 2 个资源,下午 3 点需要 2.5 个资源(例如,休息半小时)..
  • 和常规限制,例如每天几个小时,休息前几个小时,休息时间......

可能的解决方案是依靠使用求解器,即 OR-Tools 和 Optaplanner。任何提示?

4

1 回答 1

1

如果您使用OptaPlanner并且不想遵循将 8 小时班次(计划实体)分配给员工(计划值)的员工排班设计,因为您的第二个约束,那么您可以尝试遵循廉价时间示例设计,像这样的东西:

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

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

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

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

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

于 2015-02-12T15:11:40.850 回答