将任务修复为链式计划变量中的员工

时间:2017-10-17 12:48:49

标签: optaplanner drools-planner

这是在任务计划问题的上下文中,其中任务链(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中的任务是一种特定于该员工的休息时间以及我作为一项任务保持休息的原因是因为休息地点也是一个位置,应该根据附近的任务进行规划,以避免完全明显的驾驶时间。

1 个答案:

答案 0 :(得分:0)

这是适用于我的解决方案:

如果T3是您想要分配员工E1的链中的任务,那么在提交给Optaplanner之前,使用以下命令将T3分配给E1:

  • E1.setNextTask(T3)--InverseShadowVar
  • T3.prevTaskOrEmployee(E1) - Genuine var
  • T3.setEmployee(E1) - Anchor Shadow var
  • T3.setEmployeeLocked(真)

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