Optaplanner语言 - drools 使用旧的阴影变量



我正在使用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;
(...)
}

DRL:

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

我在现场@CustomShadowVariable注释并使用了龙目岛。 当我在 getter 上添加注释(手动创建(时,规则开始工作......

最新更新