【问题标题】:Handling multiple moves in chained planning variable处理链式计划变量中的多个移动
【发布时间】:2017-09-05 04:17:15
【问题描述】:

我正在尝试实现车辆路线示例的变体,其中我有“接送”和“下车”而不是客户。我的硬约束是:

  • 每对相关的取件/送件对必须由同一辆车运送(例如,如果 A 车取走一件物品,则该物品不能由 B 车下车)。
  • 必须在相关的下车之前进行取件(例如,除非您已经取件,否则您不能送件)。
  • 车辆不能超过其最大容量。

除了这些硬性限制之外,我的解决方案的工作原理与车辆路线示例非常相似,其中每辆车都有一系列位置(PickUp 或 DropOff)。

我遇到的问题是,使用默认移动无法轻松地将 PickUp 和 DropOff 移动到不同的车辆。例如,以下更改移动会导致无效状态,因此将被拒绝:

为了正确完成移动,我需要做一个额外的移动,以便下车与上车属于同一链:

感觉正确的做法是实施某种同时执行两个动作的复合动作,但是我不确定解决这个问题的最佳方法。有没有人遇到过类似的问题?

【问题讨论】:

    标签: optaplanner


    【解决方案1】:

    我以前见过用户这样做。 optaplanner-examples 本身还没有 VRPPD 示例(PD 代表 Pick Up and Delivery),因此您不能只是复制粘贴。

    重用CompositieMove,看看它是静态方法来构建一个。

    通常可行的方法:构建自定义 MoveListFactory(然后将其重构为 MoveIteratorFactory 以进行横向扩展)并让它生成 CompositeMoveChainedChangeMove 和/或 ChainedSwapMove

    【讨论】:

    • 谢谢杰弗里,我会试一试的。我还尝试使用 CartesianProductMoveSelector 来创建 CompositeMove。但是,我总是会遇到循环链的情况,这会导致我在评分过程中陷入无限循环。你知道为什么会发生这种情况吗?
    • 你好,杰弗里。你知道创建 ChainedChangeMoves 的最佳方式是什么吗?构造函数需要 GenuineVariableDescriptor 和 SingletonInverseVariableSupply 但我无法通过 MoveListFactory 访问这些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2022-11-02
    • 2023-04-09
    相关资源
    最近更新 更多