在链接变量模型上遇到变量损坏问题。
在触发所有变量监听程序而不更改真正变量后,实体(交货{id ='3',任务=[...],先前交货或班次=交货{id ='2',任务=[...],先前交货或班次=班次{id ='1',开始时间= 2022 - 10 - 03 T16:00},交货时间= 2022 - 10 - 03 T16:27},交货时间=2022-10- 03 T17:12})的影子变量(交货.交货时间)的损坏值(2022 - 10 - 03 T17:10)更改为未损坏值(2022 - 10- 03 T17:12)。
我已尝试使用FULL_ASSERT与跟踪日志记录来查看导致此问题的移动,但在跟踪日志显示它尝试执行的移动之前,它就出错了。我已尝试使用断点运行调试器,但在我这样做时,它将正确解决问题,而不会出现任何损坏。不确定这是否是某个线程问题?
variableListener中的代码是一个while循环,它需要循环遍历nextDelivery()并将任务时间相加,这样我就可以将其添加到链中第一个交货的deliveryTime中。删除此循环修复了损坏,但现在链中所有交货的deliveryTime都将关闭。我不明白为什么向前循环并将任务时间相加会导致损坏。
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线程,但似乎仍然不能让这个工作。任何建议都是受欢迎的。谢谢。
1条答案
按热度按时间js81xvg61#
解决了这个问题。我了解到你不希望影子变量的值根据链中它前面的变量而改变。这就是导致损坏的原因。我删除了导致问题的while循环,并将计算移到了一个约束中。