允许与OptaPlanner和TSPTW重叠

时间:2016-02-29 20:50:04

标签: optaplanner

我目前有OptaPlanner解决TSPTW问题。对于以下内容,将有助于将目的地视为任务。

每个任务当前都有一个名为previousTask的链式计划变量。任务可以归类为A类或B类。我现在要做的是允许B类任务可选地重叠A类任务,让OptaPlanner决定重叠是否是正确的选择。

例如,给定任务A1,A2,B1,OptaPlanner可以决定A1 - > B1 - > A2最好或A1 - > (A2与B1重叠)是最好的。

我认为我能做到这一点的方式是:

  1. 为每个Type A任务提供一个名为overlappingTask的第二个(非链式)计划变量。
  2. 将当前“任务”ValueRangeProvider拆分为两个ValueRangeProviders,“typeATasks”和“typeBTasks”。
  3. 将previousTask的ValueRangeProviders注释为typeATasks和typeBTasks。
  4. 将overlapTask的ValueRangeProviders注释为typeBTasks。
  5. 我要解决的问题总是至少有一个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()
    }
    

1 个答案:

答案 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型分配没有重叠变量),但配置更加痛苦(尤其是移动更难)。