2016-02-29 42 views
0

我目前有OptaPlanner解決TSPTW問題。以下將有助於將目的地視爲任務。允許與OptaPlanner和TSPTW重疊

每個任務目前都有一個名爲previousTask的鏈接計劃變量。這些任務可以分爲A類或B類。我現在想要做的是允許B類任務可選地重疊A類任務,讓OptaPlanner決定重疊是否是正確的選擇。例如,給定任務A1,A2,B1,OptaPlanner可以決定A1→B1→A2是最好的,或者A1→A2(具有B1重疊的A2)是最好的。

我想我可以做到這一點的方法是:

  1. 給每種類型的任務稱爲overlappingTask第二(非連鎖)規劃變量。
  2. 將當前「任務」ValueRangeProvider拆分爲兩個ValueRangeProviders,「typeATasks」和「typeBTasks」。
  3. 註釋previousTask的ValueRangeProviders是類型ATasks和typeBTasks。
  4. 註釋overlappingTask的ValueRangeProviders只能是typeBTasks。

我正在解決的問題將始終至少有一個類型A任務,但可能沒有任何類型B任務。這對我提出的解決方案造成了一個問題,因爲「typeBTasks」ValueRangeProvider有時爲空,會爲previousTask計劃變量拋出IllegalStateException。

有沒有更好的方法來解決這個問題?有沒有辦法解決空的ValueRangeProvider問題?由於ValueRangeProviders的組合不是空的,所以對previousTask的空投訴似乎很奇怪。 OptaPlanner似乎會更好地檢查組合是否爲空,而不是單獨輸入。

這裏有一些代碼片段,以澄清目前的設計:

public Solution 
{ 
    @PlanningEntityCollectionProperty 
    @ValueRangeProvider(id = "typeATasks") 
    public List<TypeA> getTypeATasks) 

    @PlanningEntityCollectionProperty 
    @ValueRangeProvider(id = "typeBTasks") 
    public List<TypeB> getTypeBTasks() 
} 

public class Task 
{ 
    @PlanningVariable(valueRangeProviderRefs = { "typeATasks", "typeBTasks" }, 
         graphType = PlanningVariableGraphType.CHAINED) 
    public Task getPreviousTask() 
} 

public class TaskB extends Task {} 

public class TaskA extends Task 
{ 
    @PlanningVariable(valueRangeProviderRefs = { "typeBTasks" }, nullable = true) 
    public TaskB getOverlappingTask() 
} 
+0

」由於ValueRangeProviders的組合不是空的,所以對PreviousTask的空投訴似乎很奇怪,OptaPlanner似乎更好地檢查組合是否爲空,而不是單獨輸入每個輸入。 [同意,看到這個傑拉](https://issues.jboss.org/browse/PLANNER-545) –

回答

0

不是你的模式是不好的,讓我們叫你的建議C)。看到我上面的評論,這是一個錯誤,optaplanner 6.4.0.Beta2在該模型上快速失敗。

但我就是這樣想的典範,建議A):

@PlanningEntity class TaskAssignment { 
    TaskDef taskDef; 
    @PlanningVariable TaskAssignment previousTaskAssignment; 
    @PlanningVariable Boolean overlapPreviousIfPossible; 

    boolean isOverLappingPrevious { 
     return taskDef.isTypeB() && overlapPreviousIfPossible; 
    } 
} 

在這種情況下,值範圍內的供應商將剛剛返回所有TaskAssignments。

但我也在想另一種模式,讓我們稱之爲提案B),就像在考試範例中一樣:計劃實體AbstractTaskAssignment,由TypeATaskAssigement和TaskBTaskAssignment擴展。這是一個更好的領域模型(類型A分配不重疊),但更痛苦的配置(特別是移動更難)。 「

+0

提案A工作良好。另外,我意識到Proposal C(我的原創)有一個缺陷,即重疊的TaskBs仍然會有以前的實體規劃變量會見。 –