2

在我的公司,我们目前正在使用 optaplanner 解决车辆路线问题并取得了很好的效果,我们构建了一个 Web 应用程序来管理车辆、客户、位置、站点并显示解决方案的图形表示(包括在地图中显示位置) . 我们将求解器包装在一个带有 rest 接口的 spring java 应用程序中,以接收请求并解决问题。我们正在使用谷歌地图来获取距离时间数据。现在我们需要实现multirip ....

为了解决多行程部分,我采用了这种方法:

1.- 我在 Vehicle 类中添加了 readyTime、endOfTrip 和 dueTime 成员

2.- 我创建了一个规则来防止在车辆后到达客户->dueTime

3.- 我修改了 ArrivalTimeUpdateListener 以在计算车辆的离开时间时考虑车辆->就绪时间(使用 Math.max(depot->readyTime, vehicle->readyTime)

4.-此时我开始使用车辆类,就好像它是车辆旅行而不是车辆(我仍然没有更改名称,但这就是想法)

5.-我在vehicle中创建了一个成员nextVehicle来代表下一次旅行

6.- 出于测试目的,我手动链接两辆车(或车辆行程),然后将其发送到求解器->求解

7.- 在 ArrivalTimeUpdatingVariableListener 类中,我扩展了更新到达时间的方法,以考虑更新 nextVehicle->readyTime 以及因此属于下一次旅行的客户的到达时间(当有超过两次旅行时,依此类推)

我确信这不是最优雅的解决方案,但我尝试了其他方法(例如在 Vehicle 上使用自定义阴影变量)但它无法使其工作。我现在面临的问题是,当 ArrivalTimeUpdatingVariableListener 被调用时,我无法理解模型的状态,也许有人遇到了类似的问题并且可以帮助我。我发现(在尝试和错误之后)是:

  • customer.getVehice() 方法并不总是返回一个值(与空值不同),它似乎在 previousStandstill 更改触发侦听器“updateArrivalTime”方法后的某个时间得到更新。
    • 在施工过程中,当客户被分配给车辆时,customer.getVehice() 方法返回 null(它来自“未分配”)
    • 在构造过程中,当客户“被释放”时,customer.getVehice() 方法返回“先前的车辆”
    • 在本地搜索中,当客户被分配给车辆时,customer.getVehice() 方法返回“先前车辆”(原始车辆)
    • 在本地搜索中,当客户返回原始车辆时,customer.getVehice() 方法返回“先前分配的车辆”

对此有什么想法吗?我是否做出了正确的假设?(因为最初我认为 customer.getVehicle() 是“实际”车辆并且解决方案完全错误......)

  • 触发previousStandstill更改的顺序有点难以理解(对我来说)。我的意思是当移动客户或在车辆之间交换他们时......有什么想法或提示是为了找到信息?

  • 当求解器采取行动时,我可以从“模型的先前状态”中访问一些变量吗?因为我认为如果我继续使用这种方法(更新作为下一个车辆的车辆->endOfTrip->例如,当客户是链上最后一个时的就绪时间)

最后......我在概念上做错了什么吗?

任何评论将不胜感激(对不起我的语法,我是西班牙语母语人士)

4

1 回答 1

1

您描述的阴影变量的混乱触发在 optaplanner 6.3.0.Final 或更高版本中不应再发生,因为它现在提供如下所示的保证。

在此处输入图像描述

但是旧版本(optaplanner 6.2 和更早版本)会遭受这种混乱的触发行为(由 PLANNER-252 修复 - 是的,我牢记该问题编号 - 是的,我不是唯一一个)可能会驱动开发人员(正在开发具有多个影子变量的复杂模型疯狂,并提供了通往庇护的单程票。

幸运的是,它已在几个月前修复,因此请升级到6.3.0.Final或更高版本并保持理智。

于 2016-02-10T08:36:03.423 回答