在我的公司,我们目前正在使用 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->例如,当客户是链上最后一个时的就绪时间)
最后......我在概念上做错了什么吗?
任何评论将不胜感激(对不起我的语法,我是西班牙语母语人士)