我目前有OptaPlanner解决TSPTW问题。对于以下内容,将有助于将目的地视为任务。
每个任务当前都有一个名为previousTask的链式计划变量。任务可以归类为A类或B类。我现在要做的是允许B类任务可选地重叠A类任务,让OptaPlanner决定重叠是否是正确的选择。
例如,给定任务A1,A2,B1,OptaPlanner可以决定A1 - > B1 - > A2最好或A1 - > (A2与B1重叠)是最好的。
我认为我能做到这一点的方式是:
我要解决的问题总是至少有一个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 :(得分: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型分配没有重叠变量),但配置更加痛苦(尤其是移动更难)。