【发布时间】:2023-04-05 21:05:01
【问题描述】:
我目前正在使用 OptaPlanner 解决 TSPTW 问题。对于以下内容,将目的地视为任务会有所帮助。
当前每个任务都有一个名为previousTask 的链式计划变量。任务可以分为 A 类或 B 类。我现在要做的是让 B 类任务有选择地重叠 A 类任务,让 OptaPlanner 决定重叠是否是正确的选择。
例如,给定任务 A1、A2、B1,OptaPlanner 可能会决定 A1 -> B1 -> A2 是最好的,或者 A1 ->(A2 与 B1 重叠)是最好的。
我认为我可以实现的方法是:
- 为每个 A 类任务提供第二个(非链式)计划变量,称为重叠任务。
- 将当前的“任务”ValueRangeProvider 拆分为两个 ValueRangeProvider,“typeATasks”和“typeBTasks”。
- 将previousTask 的ValueRangeProviders 注释为typeATasks 和typeBTasks。
- 将重叠任务的 ValueRangeProviders 注释为仅 typeBTasks。
我要解决的问题总是至少有一个 A 类任务,但可能没有任何 B 类任务。这导致我提出的解决方案出现问题,因为“typeBTasks”ValueRangeProvider 有时为空,这会为 previousTask 计划变量引发 IllegalStateException。
有没有更好的方法来解决这个问题?有没有办法解决空的 ValueRangeProvider 问题?鉴于 ValueRangeProviders 的组合不是空的,对 previousTask 的空投诉似乎很奇怪。 OptaPlanner 似乎最好检查组合是否为空,而不是单独检查每个输入。
这里有一些代码sn-ps来阐明当前的设计:
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 似乎最好检查组合是否为空,而不是单独检查每个输入。” Agreed, see this jira
标签: optaplanner