将任务固定到链式计划变量中的员工

Fix a task to an employee in chained planning variable

这是在任务计划问题的上下文中,其中任务链(T1、T2、T3 等等)被分配给员工(锚点),比如 E1。所以,计划的结果大致是这样的:

E1 -> T1 -> T2 -> T3

T1、T2 和 T3 可以来自任何任务列表。现在,我想要的是 T1,T2,T3,T4,T5,T6.. 列表中的内容,必须将 T3 分配给 E1。简而言之,T3 必须链接在 之间的某处 (可能不是第一个)锚链 E1。 Optaplanner 在链式规划变量中只有 select previous entityOrAnchor 的选项,如果我想将第一个任务分配给员工,但我想要一个应该在当天晚些时候发生的任务,所以它会工作,所以在任务之间的某个地方链.

我能想到的解决办法:
1。保留一个额外的变量'assignEmployee'。
2。保持硬性约束,以便 assignEmployee 匹配锚点,即员工。

这将在相同情况下起作用,我必须保持非常强(加权)的高约束,但问题是我不想将其保留为约束,因为不可能将该任务分配给其他人员工,我想对其建模,以便将特定任务分配给特定员工。我们还有哪些其他选择?

我想要这个做什么?
这是因为上面 T3 中的任务是特定于该员工的休息,我将休息作为任务保留的原因是因为休息地点也是一个位置,应根据附近的任务进行规划以避免完全不同的驾驶时间.

这是对我有用的解决方案:

如果 T3 是链中要分配员工 E1 的任务,则在提交给 Optaplanner 之前,使用以下方法将 T3 分配给 E1:

  • E1.setNextTask(T3) --InverseShadowVar
  • T3.prevTaskOrEmployee(E1)--正品变种
  • T3.setEmployee(E1) -- 锚阴影变量
  • T3.setEmployee锁定(真)

这使得 T3 已经用员工 E1 进行了初始化,因此 CH 不会更改它。现在,过滤你所有的 LS 移动(change/swap/chain),这样他们就不会尝试将锁定员工的任务转移给其他员工。