Optaplanner:扩展vrp示例以解决多旅行案例

时间:2016-02-03 18:16:26

标签: drools optaplanner drools-planner

在我的公司,我们目前正在使用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.getVehice()方法并不总是返回一个值(与null值不同),它似乎在previousStandstill更改触发侦听器“updateArrivalTime”方法后的某个时间更新。
    • 在客户获得分配给车辆时的构造中,customer.getVehice()方法返回null(来自“未分配”)
    • 在客户“被释放”时的构造中,customer.getVehice()方法返回“上一辆车”
    • 在本地搜索中,当客户分配给车辆时,customer.getVehice()方法返回“上一辆车”(原车)
    • 在本地搜索中,当客户返回原始车辆时,customer.getVehice()方法返回“先前分配的车辆”

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

  • 触发previousStandstill改变的顺序很难理解(对我来说)。我的意思是当移动客户或在车辆之间交换它们时...任何想法或提示都要找到信息?

  • 当解算器移动时,我可以从“模型的先前状态”中访问某些变量吗?因为我认为如果我继续这种方法,我将需要它(更新车辆 - > endOfTrip是nextVehicle-> readyTime,例如当客户是链上的最后一个时)

最后......我在概念上做了一些完全错误的事情吗?

任何评论都会非常感激(对不起我的语法,我是西班牙语母语人士)

1 个答案:

答案 0 :(得分:0)

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

enter image description here

但是旧版本(optaplanner 6.2及更早版本)遭受混乱的触发行为(由PLANNER-252修复 - 是的我知道这个问题的数字 - 是的,我不是唯一的一个)可以驱动一个开发人员(他在一个复杂的模型上工作,有多个阴影变量)疯狂并提供单程票到庇护。

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