Optaplanner:检查链式规划变量是不是有锚
Posted
技术标签:
【中文标题】Optaplanner:检查链式规划变量是不是有锚【英文标题】:Optaplanner: check if chained planning variable has anchorOptaplanner:检查链式规划变量是否有锚 【发布时间】:2021-06-16 06:40:00 【问题描述】:我正在修改车辆路线 Optaplanner 示例。车辆被必须在城市周围旅行的个人所取代,但他们可以使用不同的交通工具来这样做。所以我在锚点上有一个属性(示例中为车辆,修改后的代码中为员工),称为modeOfTransportation
。
在使用示例中的自定义影子变量侦听器计算到达时间时,我当然想考虑运输方式。但是,当 Optaplanner 开始初始化我的计划实体(消费者)时,它们似乎一开始并没有连接到锚点。所以我找不到我的交通工具,一切都坏了。
关于如何进行的任何想法?
以下是我想要完成的。
shadowVisit
是我的计划实体,shadowVisit.getEmployee()
应该给我锚。
进行shadowVisit.getEmployee()==null
检查似乎会挂起整个求解过程。
arrivalTime =
previousStopDepartureTime.plus(
shadowVisit.getLocation().getDistanceFrom(
shadowVisit.getPreviousStop().getLocation(), shadowVisit.getEmployee().getModeOfTransportation())
【问题讨论】:
【参考方案1】:好的,所以我弄清楚了问题所在。 我的问题受到了过度约束,我实施了一个虚拟员工作为解决方案(请参阅optaplanner: modifying vehicle routing to let customers be not served)
我没有为我的假人设置 modeOfTransportation,导致空指针。有时候把问题写下来就好了,让你用心思考去解决它!
非常感谢杰弗里的意见
【讨论】:
【参考方案2】:这很奇怪,因为链原理保证每条链都有一个锚(见下文)。
也许您的@CustomShadowVariable
的sources
属性不包含锚阴影变量,并且在调用锚阴影变量侦听器之前调用了您的自定义变量侦听器。
OptaPlanner 保证它会在调用下一种类型之前为所有域类调用一种类型的变量侦听器。这些类型的变量侦听器的顺序由 sources
属性确定(参见第二张图片)。
【讨论】:
同意这很奇怪。当然,在求解过程的开始,所有规划实体都是孤立的,但我有点假设链是从锚点向上构建的,规划实体在锚定之前不会链接在一起。这是我在 TWVRP 示例中的 Customer 类中的变量 @PlanningVariable(valueRangeProviderRefs = "employeeRange", "visitRange" , graphType = PlanningVariableGraphType.CHAINED) private Stop previousStop;员工是锚。 @CustomShadowVariable(variableListenerClass = ArrivalTimeListener.class, sources = @PlanningVariableReference(variableName = "previousStop")) private LocalDateTimearrivalTime; @AnchorShadowVariable(sourceVariableName = "previousStop") 私人雇员雇员; 好的,再调试一下,我可以看到,当我的变量监听器被调用时,有时 previousStop 设置为 Employee 并且employee 为空,有时反过来。以上是关于Optaplanner:检查链式规划变量是不是有锚的主要内容,如果未能解决你的问题,请参考以下文章