2017-10-17 74 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移動(更改/交換/鏈),以便它們不嘗試將鎖定員工的任務移動到其他員工。