Optaplanner链接的变量损坏



在链式变量模型上遇到变量损坏问题。

实体(Delivery{id='3',tasks=[…],previousDeliveryOrShift=Delivery{id='2',tasks=[…]、previousDeliveryOrShift=Shift{id='1',startTime=2022-03-T16:00}、deliveryTime=2022--03T16:27}、deliveryTime=2022-03-03T17:12}(的影子变量(Delivery.deliveryTime(的损坏值(2022-10-03T17:10(在所有变量侦听器都被更改为未损坏值在不改变真实变量的情况下触发

我曾尝试将FULL_ASSERT与跟踪日志一起使用,以查看导致这种情况的移动,但在跟踪日志向我显示它试图进行的移动之前,它就出现了错误。我试过运行一个带有断点的调试器,但当我这样做时,它会正确地解决问题,不会出现任何损坏。不确定这是否是线程问题?

导致这种情况的variableListener中的代码是一个while循环,它需要在nextDelivery((中循环,并将任务时间相加,这样我就可以将其添加到链中第一次交付的deliveryTime中。删除这个循环可以修复损坏,但现在链中所有Delivery的deliveryTimes都将关闭。我不明白为什么向前循环和求和任务时间会导致损坏。

private void updateDeliveryTime(
ScoreDirector<DeliveryRoutingSolution> scoreDirector, Delivery delivery) {
Delivery shadowDelivery = delivery;
while (shadowDelivery != null) {
LocalDateTime deliveryTime = null;
if (shadowDelivery.getPreviousDeliveryOrShift() != null) {
PreviousDeliveryOrShift previousDeliveryOrShift =
shadowDelivery.getPreviousDeliveryOrShift();
if (previousDeliveryOrShift.getType() == PreviousDeliveryOrShift.Type.SHIFT) {
Delivery nextDelivery = shadowDelivery;
Duration taskTimeBeforeDelivery = Duration.ZERO;
while (nextDelivery != null) { // the while loop causing the problem
taskTimeBeforeDelivery =
taskTimeBeforeDelivery.plus(
nextDelivery.getTaskTime());
nextDelivery = nextDelivery.getNextDelivery();
}
deliveryTime =
previousDeliveryOrShift
.getStartTime()
.plus(taskTimeBeforeDelivery);
} else {
...
}
}
scoreDirector.beforeVariableChanged(shadowDelivery, "deliveryTime");
shadowDelivery.setDeliveryTime(deliveryTime);
scoreDirector.afterVariableChanged(shadowDelivery, "deliveryTime");
shadowDelivery = shadowDelivery.getNextDelivery();
}
}
}

我已经尝试过查看关于这个问题的其他stackoverflow线程,但似乎仍然无法实现。欢迎提出任何建议。谢谢

解决了这个问题。我已经了解到,您不希望影子变量的值根据链中前面的内容而改变。这就是造成腐败的原因。我删除了导致问题的while循环,并将计算转移到约束中。

最新更新