Optaplanner - drools 使用旧的影子变量
Optaplanner - drools uses old shadow variables
我正在使用经过一些更改的 VRP 问题示例。
一种是计算所有任务的到达时间和目的地时间。
另一个是一些任务对必须具有相同的到达时间。
在更新到达时间后,我 "move" 并行任务 - 并更改他们的日期。
所以移动步骤可以改变任务在另一辆车上的影子变量。
但是 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");
(...)
}
任务:
@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 注释并使用了lombok。
当我在 getter(手动创建)上放置注释时,规则开始工作...
我正在使用经过一些更改的 VRP 问题示例。 一种是计算所有任务的到达时间和目的地时间。 另一个是一些任务对必须具有相同的到达时间。 在更新到达时间后,我 "move" 并行任务 - 并更改他们的日期。 所以移动步骤可以改变任务在另一辆车上的影子变量。
但是 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");
(...)
}
任务:
@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 注释并使用了lombok。 当我在 getter(手动创建)上放置注释时,规则开始工作...