在我的公司,我们目前正在使用optaplanner解决车辆路径问题并取得了很好的效果,我们构建了一个Web应用程序来管理车辆,客户,位置,仓库以及显示解决方案的图形表示(包括显示位置)一张地图)。我们将解算器包装在带有休息接口的spring java app中,以接收请求并解决问题。我们正在使用Google地图获取距离时间数据。现在我们需要实现multirip ....
为了解决多手柄问题,我采用了这种方法:
1.-我将readyTime,endOfTrip和dueTime成员添加到Vehicle类
2.-我制定了一条规则,以防止在车辆到达后到达客户 - > dueTime
3.-我在计算车辆的起飞时间时修改了ArrivalTimeUpdateListener以考虑vehicle-> readyTime(使用Math.max(depot-> readyTime,vehicle-> readyTime)
4.-此时我开始使用车辆类似于车辆而不是车辆(我仍然没有更改名称,但这是主意)
5.-我在车辆中创建了一个成员nextVehicle来代表下一次旅行
6.-出于测试目的,我将手动链接两辆车(或车辆行程),然后再将其发送给解算器 - >解决
7.-在ArrivalTimeUpdatingVariableListener类中,我扩展了更新到达时间的方法,以考虑更新nextVehicle-> readyTime,结果是属于下一次旅行的客户的到达时间(等等超过两次)
我确信这不是最优雅的解决方案,但我尝试了其他方法(例如在Vehicle上使用自定义阴影变量),但它无法使其正常工作。 我现在面临的问题是,当调用ArrivalTimeUpdatingVariableListener时,我无法理解模型的状态,也许有人遇到类似问题并且可以帮助我。我发现(尝试和错误后)是:
对此有何想法?我做出了正确的假设吗? (因为最初我认为customer.getVehicle()是“实际”的车辆而且解决方案完全错了......)
触发previousStandstill改变的顺序很难理解(对我来说)。我的意思是当移动客户或在车辆之间交换它们时...任何想法或提示都要找到信息?
当解算器移动时,我可以从“模型的先前状态”中访问某些变量吗?因为我认为如果我继续这种方法,我将需要它(更新车辆 - > endOfTrip是nextVehicle-> readyTime,例如当客户是链上的最后一个时)
最后......我在概念上做了一些完全错误的事情吗?
任何评论都会非常感激(对不起我的语法,我是西班牙语母语人士)