在自定义克隆期间,实体从未添加到此scoreDirector异常中

时间:2017-05-26 03:24:45

标签: optaplanner

我正在尝试在我的解决方案中实现自定义克隆,我按照文档中的说明操作,并且遇到了此异常形式的包版广告:The entity was never added to this ScoreDirector. Maybe that specific instance is not in the return values of the PlanningSolution's entity members。我知道这不是真的,因为在自定义克隆之前,没有抛出此异常。

我的planningClone方法设置如下:

@Override
public Solution planningClone() {
    Solution clonedSolution = new Solution();
    clonedSolution.id = id;
    clonedSolution.code = code;
    clonedSolution.score = score;
    clonedSolution.field1 = field1;
    clonedSolution.field2 = field2;
    ...............
    clonedSolution.fieldN = fieldN;

    List<PlanningEntity1> clonedPlanningEntity1List= new ArrayList<PlanningEntity1>(planningEntity1List.size());
    List<PlanningEntity2> clonedPlanningEntity2List= new ArrayList<PlanningEntity2>(planningEntity1List.size());

    for (PlanningEntity1 planningEntity: planningEntity1List) {
        clonedPlanningEntity1List.add(planningEntity.clone());
    }
    for (PlanningEntity2 planningEntity: planningEntity2List) {
        clonedPlanningEntity1List.add(planningEntity.clone());
    }
    clonedSolution.planningEntity1List = clonedPlanningEntity1List;
    clonedSolution.planningEntity2List = clonedPlanningEntity2List;
    return clonedSolution;
{

我的计划实体的克隆方法是通过Java接口Cloneable实现的:

protected PlanningEntity clone() {
    try {
        return (PlanningEntity) super.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
    return null;
}

为了确保,我检查了每个实体实例及其集合,以确保我的克隆工作正常,事实上它就是。

我在这里缺少什么步骤?

1 个答案:

答案 0 :(得分:2)

如果有一个计划实体从另一个类指向另一个计划实体或者可能指向一个列表,那么克隆过程需要处理这些计划实体的引用,以便它们指向克隆的对象。这是默认克隆过程正在执行的操作没有问题,从而使解决方案保持一致状态。它甚至可以正确地更新父计划实体中的计划实体实例列表(方法&#34; cloneCollectionsElementIfNeeded&#34;来自类&#34; FieldAccessingSolutionCloner&#34;来自OptaPlanner核心)。

例如,如果我们有下两个计划实体类

@PlanningEntity
public class ParentPlanningEntityClass{
    List<ChildPlanningEntityClass> childPlanningEntityClassList;
}

@PlanningEntity
public class ChildPlanningEntityClass{
    ParentPlanningEntityClass parentPlanningEntityClass;
}

&#34; parentPlanningEntityClass&#34;需要将变量设置为指向克隆的对象。当涉及到列表&#34; childPlanningEntityClassList&#34;它首先需要从头开始创建&#34; new ArrayList();&#34;因此,工作和新的最佳解决方案(当前正在克隆的解决方案)都没有指向同一个列表。最后,新创建的列表需要填充克隆的对象。