CustomShadowVariables 和 ScoreDirector

CustomShadowVariables and ScoreDirector

我有一个自定义的影子变量,它应该在一个人被分配到工作时更新一个分配列表。这是为了启用一个规则,例如一个人每周只能轮班 x 次。我认为当我们进入影子变量时维护每个人的班次列表应该比尝试在求解器规则中计算它更容易。

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

Exception in thread "main" java.lang.IllegalArgumentException: The entity (Black) was never added to this ScoreDirector. Usually the cause is that that specific instance was not in your Solution's entities.

我不太清楚这是什么意思。实体 Black 是计划实体的一个实例,它在 config.xml 中被注释和定义,并且在问题事实集中。

我的影子变量定义为:

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

影子变量的侦听器如下所示:

@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" 调用上。

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

检查 PlanningSolution class 上具有 EntityCollectionProperty 注释的方法。那个实例 Black 不会在那里。