2017-10-17 32 views
2

这是在任务计划问题的背景下,其中任务链(T1,T2,T3等等)被分配给员工(锚点),例如E1。因此,规划中的结局一般是这样的:将任务修理给链式规划变量中的员工

E1 -> T1 -> T2 -> T3 

T1,T2和T3可以从任务列表中的任何。现在,我想要的是类似T1,T2,T3,T4,T5,T6 ..的列表,T3必须分配给E1。简单来说,T3必须链接之间的(可能不是第一个)锚链E1。 Optaplanner只能选择在链接的计划变量中选择以前的entityOrAnchor,如果我希望将第一个任务分配给某个员工,但是我想要一个任务应该在白天稍后发生,以便在任务链之间的某个位置进行,则该工作方式将起作用。

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

这将工作在相同的情况下,我将不得不保持一个非常强大(加权)的高约束,但问题是我不想保持它的约束,因为它是不可能分配给其他员工的任务我想对其进行建模,以便将特定任务分配给特定员工。我们还有什么其他选择?

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

回答

0

这里是为我工作的解决方案:

如果T3是要指派雇员E1的链式任务,然后提交到Optaplanner前使用分配T3到E1:

  • E1.setNextTask(T3)--InverseShadowVar
  • T3.prevTaskOrEmployee(E1) - 真正的无功
  • T3.setEmployee(E1) - 锚阴影变种
  • T3.setEmployeeLocked(真)

这使T3已经与员工E1初始化,所以CH不会改变它。现在,过滤所有的LS移动(更改/交换/链),以便它们不尝试将锁定员工的任务移动到其他员工。