Java Optaplanner-drools使用旧的阴影变量

Java Optaplanner-drools使用旧的阴影变量,java,drools,optaplanner,Java,Drools,Optaplanner,我使用VRP问题的例子进行了一些修改。 一种是计算所有任务的到达时间和目的地时间。 另一个原因是某些任务对的到达时间相同。 在更新到达时间后,我“移动”并行任务,并更改它们的日期。 所以移动步骤可以改变任务在另一辆车上的阴影变量 但drools规则验证两个任务的到达是否相同并没有看到这种变化。 就像他们根本不改变物体一样。 我做错了什么? 也许我的建议错了 并行任务未标记为ShadowVaraible或PlanningVariable 听众: public class ArrivalTimeUp

我使用VRP问题的例子进行了一些修改。 一种是计算所有任务的到达时间和目的地时间。 另一个原因是某些任务对的到达时间相同。 在更新到达时间后,我“移动”并行任务,并更改它们的日期。 所以移动步骤可以改变任务在另一辆车上的阴影变量

但drools规则验证两个任务的到达是否相同并没有看到这种变化。 就像他们根本不改变物体一样。 我做错了什么? 也许我的建议错了

并行任务未标记为ShadowVaraible或PlanningVariable

听众:

public class ArrivalTimeUpdatingVariableListener implements VariableListener<Task> {

    @Override
    public void afterEntityAdded(ScoreDirector scoreDirector, Task task) {
        updateTaskAssignmentTimes(scoreDirector);
    }

    @Override
    public void afterVariableChanged(ScoreDirector scoreDirector, Task task) {
        updateTaskAssignmentTimes(scoreDirector);
    }

    (...)

    scoreDirector.beforeVariableChanged(task, "arrivalTime");
    task.setArrivalTime(task.getArrivalTime() + diff);
    scoreDirector.afterVariableChanged(task, "arrivalTime");

    (...)

}
drl:


我在字段上有@CustomShadowVariable注释,并使用了lombok。 当我在getter上添加注释(手动创建)时,规则开始工作

@PlanningEntity(difficultyWeightFactoryClass = DepotAngleTaskDifficultyWeightFactory.class)
public class Task extends AbstractPersistable implements Standstill {

    (...)

    @CustomShadowVariable(variableListenerClass = ArrivalTimeUpdatingVariableListener.class, sources = {@PlanningVariableReference(variableName = "previousStandstill")})
    private Long arrivalTime;

    @CustomShadowVariable(variableListenerClass = ArrivalTimeUpdatingVariableListener.class, sources = {@PlanningVariableReference(variableName = "previousStandstill")})
    private Long departureTime;

    (...)

}
rule "Parallel task soft relation"
when
    $task : Task(assigned, relations.tasksParallel.size() > 0, $tasksParallel : relations.tasksParallel)
    Task(assigned, $tasksParallel.contains(id), doesNotHaveSameArrivalTime($task))
then
    scoreHolder.addHardConstraintMatch(kcontext, -1088);
end