【问题标题】:Optaplanner VRP example, multiple vehicles required per stop in same time windowOptaplanner VRP 示例,同一时间窗口内每次停靠需要多辆车
【发布时间】:2020-07-30 20:40:58
【问题描述】:

我们正在使用定制的 VRP 教程示例来优化服务工程师的日常路线,这些工程师前往客户那里执行某些维修和安装任务。我们确实有时间窗口,我们会在未来数周内优化 1000 多项任务。

我们的(简化的)领域模型包括:

  • 工程师 - 负责所有工作的人
  • 任务 - 在某个地点完成的单一工作任务
  • DailyRoute - 给定日期的工程师路线,由任务链表组成

作为新要求,我们现在必须支持两名工程师并行完成同一任务。

我们目前的计划是通过为第二个工程师创建子任务来实现这一点,并实施一个规则,即他们的到达时间必须与主要任务相同。 然而,这是有问题的,因为将其中一项相互依赖的任务移动到不同的时间(例如,不同的 DailyRoute)将大多违反上述约束。

到目前为止,我们提出了以下想法:

  • 只允许单个任务同一天作为其他任务的指定路线移动到 DailyRoute
    • 可以通过 SelectionFilter 完成
  • 使用 CompositeMoves 将两个并行任务同时移动到不同的日期
    • 我们是否需要自定义 MoveIteratorFactory 来选择连接的任务?
    • 或者这可以用 CartesianProductMoveSelector 代替吗?
    • 我们可以使用附近的选择来进行第二次移动,以选择与第一次移动的新指定日期相同的日期(移动当时是否已经完成)?

【问题讨论】:

    标签: optaplanner vehicle-routing


    【解决方案1】:

    对于同时从事同一任务的两名工程师,请参阅文档“设计模式”,特别是“延迟到最后一个模式”。没有示例,但我们的支持服务已经帮助实施了几次 - 它有效。

    对于同一地点的多个站点:我看到用户将此类访问分成更小的部分,以允许 optaplanner 选择要聚合的部分。它有效,但并不完美:碎片越细,搜索空间就越大 - 添加一个专注于将所有碎片移动在一起的自定义移动可能会有所帮助(但我不会从它开始)。一般来说:如果最小的车辆容量为 100,我会进行一些实验,将容量分成一半 - 他们也尝试四分之一,只是为了通过 optaplanner-benchmark 进行基准测试来看看什么效果最好。

    【讨论】:

    • 感谢 Geoffrey,如果工程师在他的时间窗口开始之前到达,我们已经在使用等待时间,并且已经扩展它以考虑稍后开始的并行任务。
    • 我尝试使用 CartesianProductMoveSelector 组合移动,但我似乎遇到了这张票 issues.redhat.com/browse/PLANNER-1464 中所述的相同异常。我认为这将发生在任何连锁动作的组合中,其中前一个动作会影响后续动作。可以通过 selectionFilter 避免这种情况吗?
    • 我已经实现了该过滤器的 POC,它似乎可以工作,代码粘贴在我的答案中:stackoverflow.com/questions/55340681/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多