java Optaplanner链接变量损坏

bogh5gae  于 2022-10-30  发布在  Java
关注(0)|答案(1)|浏览(133)

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

在触发所有变量监听程序而不更改真正变量后,实体(交货{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线程,但似乎仍然不能让这个工作。任何建议都是受欢迎的。谢谢。

js81xvg6

js81xvg61#

解决了这个问题。我了解到你不希望影子变量的值根据链中它前面的变量而改变。这就是导致损坏的原因。我删除了导致问题的while循环,并将计算移到了一个约束中。

相关问题