Optaplanner - drools использует старые теневые переменные - PullRequest
0 голосов
/ 26 сентября 2019

Я использую пример проблемы VRP с некоторыми изменениями.Одним из них является расчет времени прибытия и назначения для всех задач.Другим фактором является необходимость для некоторых пар задач иметь одинаковое время прибытия.А после обновления времени прибытия я «перемещаю» параллельные задачи - и меняю их дату.Таким образом, шаг перемещения может изменить теневую переменную задачи на другом транспортном средстве.

Но проверка правил слюней, если прибытие двух задач одинаково, не видит этого изменения.Как будто они вообще не меняют объект.Что я делаю неправильно?Может быть, мой подход неверен?

Параллельные задачи не помечены как 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");

    (...)

}

Задача:

@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
...