PlanningVariable 中的 PlanningVariable

PlanningVariable within a PlanningVariable

创建时间表时,您必须遵守规定的法律(硬性要求) 作为一名雇员,每个给定的 Sevenday 期间,您只能工作一定的小时数。它没有说日历周的原因是为了在制定时间表时为雇主提供一些回旋余地(通常提前 4-16 周)。一旦您为这个计划期设置了 startdate,它就不能更改,直到您想要进行完整的重新计划,然后您需要通知您的员工。 所以它可以被视为一个变量,直到您接受了时间表,然后它才变成一个常量。当然,这对每个员工都是个人的。此 startdate 将由您的第一个指定班次的开始日期 ofc 隐式设置,但 微调时间表通常是不够的。

所以假设我们想为爱丽丝和鲍勃在一年的前 3 个日历月创建一个新的时间表,他们将各自分配一个 startdate,该日期可能与第一个日历月相同,也可能不同指定班次(不能在 ofc 之后 :))。

所以基本上,一旦 Optaplanner 为员工分配了 startdate,它应该尝试从中制定最佳时间表,但同时可以自由更新 startdate 以创建更好的时间表对于下一个计划期,不应再将其声明为计划变量。您也可以在不更改代码的情况下进行设置吗?

我的问题是如何在 Employee 模型中声明这个 StartDate 变量?正如您在下面的模型中看到的,它是计划变量中的一个纯计划变量。 还是归类为 AnchorVariable?如何将值范围声明为 {20200101 - 20203030}?它可以精确到小时和分钟,但不能精确到秒和毫秒。

我阅读了链接变量,但我的实体(轮班分配)本身并没有像 TSP 问题那样链接或相互依赖。

public Employee {
   String name
   
   Date startDate <-- PlanningVariable?, AnchorVariable? how to declare the valuerange?
}

public Shift {
    Date start
    
    Date end
}

@PlanningEntity
public ShiftAssignment {
    Shift shift
    
    @PlanningVariable(valueRangeProviderRefs = {"employeeRange"})   <--Employee is a planningvariable here
    Employee employee
}

@PlanningSolution
public ShiftRooster {
   
   @ProblemFactCollectionProperty
   private List<Employee> employees
   
   @PlanningEntityCollectionProperty
   private List<ShiftAssignment> shiftAssignments
}

我是否需要将 Employee 中的 startDate 包装在 Class 中才能对其进行注释?

从商业角度来看,我觉得奇怪的是,员工的“工作日的第 7 天开始”不是规划问题的输入。因为:

  • 你成功了运行宁:他们已经有了一个时间表,你需要在最后坚持下去。例如,给定一个 4 周的发布通知,他们有一个直到 2 月 28 日的时间表(手动或通过旧版软件完成),而在 2 月 1 日之前,您需要添加一个从 3 月 1 日开始的时间表。您对他们的“七日工作日开始”没有任何选择。

  • 您有机会对所有员工的“工作日开始时间”进行颠覆性重置,同时引入全新的计划系统(祝您好运!).考虑到可能有 2-3 个月的计划 window,您将在不涉及圣诞节 and/or 暑假的时间段内做出决定,这些事件可能会给那些与七日相关的事件带来压力约束。

在第一阶段,我将它排除在优化启动的范围之外,将其作为输入参数,使用他们一直使用的值。在第二阶段,我会 运行 模拟 1 年的计划 window,以防新员工加入并且您想自动确定“工作日开始的第 7 天”。

此外,如果员工的第一个班次从 2 月 4 日开始,那么在 2 月 2 日开始his/her“七日工作日开始”仍然是最佳选择,例如,如果 2 月 20 日这一周是一半员工使用 PTO 的那一刻,将 his/her 七日重置为 2 月 23 日将是理想的。