【问题标题】:Allowing overlap with OptaPlanner and TSPTW允许与 OptaPlanner 和 TSPTW 重叠
【发布时间】:2023-04-05 21:05:01
【问题描述】:

我目前正在使用 OptaPlanner 解决 TSPTW 问题。对于以下内容,将目的地视为任务会有所帮助。

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

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

我认为我可以实现的方法是:

  1. 为每个 A 类任务提供第二个(非链式)计划变量,称为重叠任务。
  2. 将当前的“任务”ValueRangeProvider 拆分为两个 ValueRangeProvider,“typeATasks”和“typeBTasks”。
  3. 将previousTask 的ValueRangeProviders 注释为typeATasks 和typeBTasks。
  4. 将重叠任务的 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


【解决方案1】:

并不是说您的模型不好,我们将您的提案称为 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 类分配没有重叠变量),但配置要痛苦得多(尤其是移动更难)。

【讨论】:

  • 提案 A 运行良好。此外,我意识到提案 C(我的原始提案)存在重叠 TaskB 仍然需要满足之前的实体规划变量的缺陷。
猜你喜欢
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多