CustomShadowVariables和ScoreDirector

时间:2016-05-01 19:28:00

标签: optaplanner

我有一个自定义影子变量,可以在分配给作业时更新某个人的分配列表。这是为了启用一个规则,例如,一个人每周只能换班x次。我认为保持这个人员变动列表,因为我们进入阴影变量应该比在求解器规则中计算它更容易。

当我运行求解器时,在第一次迭代中,求解器崩溃并出现此异常:

  

线程“main”中的异常java.lang.IllegalArgumentException:The   实体(黑色)从未添加到此ScoreDirector中。通常是   原因是该特定实例不在您的解决方案中   实体。

我不完全确定这意味着什么。实体Black是规划实体的一个实例,它在config.xml中都有注释和定义,它位于问题事实集合中。

我的影子变量定义为:

@CustomShadowVariable(
        variableListenerClass = PersonAssignmentListener.class,
        sources = {@CustomShadowVariable.Source(
                variableName = "startingTimeGrain",
                entityClass = Assignment.class)
        }
)
public List<Assignment> getAssignments() {
    return assignments;
}

shadow变量的监听器如下所示:

@Override
public void afterEntityAdded(ScoreDirector scoreDirector, 
                             Assignment assignment) {
    updatePerson(scoreDirector, assignment);
}

@Override
public void afterVariableChanged(ScoreDirector scoreDirector,
                             Assignment assignment) {
    updatePerson(scoreDirector, assignment);
}

private void updatePerson(ScoreDirector scoreDirector,
                          Assignment sourceAssignment) {

    Shift shift = sourceAssignment.getShift();
    Person p = sourceAssignment.getPerson();

    scoreDirector.beforeVariableChanged(away, "assignments");
    p.getAssignments().add(sourceAssignment);
    scoreDirector.afterVariableChanged(away, "assignments");
}

“afterVariableChanged”调用发生异常。

1 个答案:

答案 0 :(得分:0)

它与链式或影子变量无关。

检查PlanningSolution类上具有EntityCollectionProperty批注的方法。那个黑色的例子不会在那里。