Optaplanner:检查链式规划变量是否有锚点

问题描述

我正在修改车辆路线 Optaplanner 示例。车辆被必须在城市周围旅行的个人所取代,但他们可以使用不同的交通方式。所以我在锚点上有一个属性(示例中为 Vehicle,修改后的代码中为 Employee),名为 modeOfTransportation

在使用示例中的自定义阴影变量侦听器计算到达时间时,我当然想考虑运输方式。但是,当 Optaplanner 开始初始化我的计划实体(消费者)时,它们似乎一开始并没有连接到锚点。所以我找不到我的交通工具,一切都坏了。

关于如何进行的任何想法?

下面是我想要完成的。 shadowVisit 是我的计划实体,shadowVisit.getEmployee() 应该给我锚点。 执行 shadowVisit.getEmployee()==null 检查似乎会挂起整个求解过程。

arrivalTime = 
prevIoUsstopDepartureTime.plus(
shadowVisit.getLocation().getdistanceFrom(
shadowVisit.getPrevIoUsstop().getLocation(),shadowVisit.getEmployee().getModeOfTransportation())

解决方法

好的,所以我想出了问题所在。 我的问题被过度限制了,我实施了一个虚拟员工作为解决方案(参见 optaplanner: modifying vehicle routing to let customers be not served

我没有为我的虚拟对象设置 modeOfTransportation,导致空指针。有时候把问题写下来就好,让你足够努力去解决它!

非常感谢您的意见杰弗里

,

这很奇怪,因为链原则保证每个链都有一个锚点(见下文)。

也许您的 @CustomShadowVariablesources 属性不包含锚阴影变量,并且您的自定义变量侦听器在调用锚阴影变量侦听器之前被调用。 OptaPlanner 保证它会在调用下一种类型之前为所有域类调用一种类型的变量侦听器。这些类型的变量侦听器的顺序由 sources 属性决定(参见第二张图片)。

enter image description here

enter image description here