我目前有OptaPlanner解決TSPTW問題。以下將有助於將目的地視爲任務。允許與OptaPlanner和TSPTW重疊
每個任務目前都有一個名爲previousTask的鏈接計劃變量。這些任務可以分爲A類或B類。我現在想要做的是允許B類任務可選地重疊A類任務,讓OptaPlanner決定重疊是否是正確的選擇。例如,給定任務A1,A2,B1,OptaPlanner可以決定A1→B1→A2是最好的,或者A1→A2(具有B1重疊的A2)是最好的。
我想我可以做到這一點的方法是:
- 給每種類型的任務稱爲overlappingTask第二(非連鎖)規劃變量。
- 將當前「任務」ValueRangeProvider拆分爲兩個ValueRangeProviders,「typeATasks」和「typeBTasks」。
- 註釋previousTask的ValueRangeProviders是類型ATasks和typeBTasks。
- 註釋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()
}
」由於ValueRangeProviders的組合不是空的,所以對PreviousTask的空投訴似乎很奇怪,OptaPlanner似乎更好地檢查組合是否爲空,而不是單獨輸入每個輸入。 [同意,看到這個傑拉](https://issues.jboss.org/browse/PLANNER-545) –