在自定义克隆期间从未将实体添加到此 scoreDirector 异常
The entity was never added to this scoreDirector exception during custom cloning
我正在尝试在我的解决方案中实施自定义克隆,我按照文档中的说明进行操作,但遇到了异常形式的障碍: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;
}
为了确定,我检查了每个实体实例及其集合,以确保我的克隆工作正常,事实确实如此。
我错过了什么步骤?
如果有一个规划实体从另一个 class 指向另一个规划实体,或者可能指向一个列表,那么克隆过程需要处理这些规划实体的引用,以便它们指向克隆的 objects.This 是默认克隆过程没有问题的事情,因此使解决方案处于一致状态。它甚至可以正确更新父计划实体中的计划实体实例列表(由来自 OptaPlanner 核心的 class "FieldAccessingSolutionCloner" 的方法 "cloneCollectionsElementIfNeeded" 涵盖)。
例如,如果我们有下两个规划实体 classes
@PlanningEntity
public class ParentPlanningEntityClass{
List<ChildPlanningEntityClass> childPlanningEntityClassList;
}
@PlanningEntity
public class ChildPlanningEntityClass{
ParentPlanningEntityClass parentPlanningEntityClass;
}
需要将"parentPlanningEntityClass"变量设置为指向克隆的对象。当谈到列表 "childPlanningEntityClassList" 时,它首先需要使用 "new ArrayList();" 从头开始创建,以便工作和新的最佳解决方案(当前正在克隆的解决方案)不会指向相同的列表。最后,新创建的列表需要用克隆的对象填充。
我正在尝试在我的解决方案中实施自定义克隆,我按照文档中的说明进行操作,但遇到了异常形式的障碍: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;
}
为了确定,我检查了每个实体实例及其集合,以确保我的克隆工作正常,事实确实如此。
我错过了什么步骤?
如果有一个规划实体从另一个 class 指向另一个规划实体,或者可能指向一个列表,那么克隆过程需要处理这些规划实体的引用,以便它们指向克隆的 objects.This 是默认克隆过程没有问题的事情,因此使解决方案处于一致状态。它甚至可以正确更新父计划实体中的计划实体实例列表(由来自 OptaPlanner 核心的 class "FieldAccessingSolutionCloner" 的方法 "cloneCollectionsElementIfNeeded" 涵盖)。
例如,如果我们有下两个规划实体 classes
@PlanningEntity
public class ParentPlanningEntityClass{
List<ChildPlanningEntityClass> childPlanningEntityClassList;
}
@PlanningEntity
public class ChildPlanningEntityClass{
ParentPlanningEntityClass parentPlanningEntityClass;
}
需要将"parentPlanningEntityClass"变量设置为指向克隆的对象。当谈到列表 "childPlanningEntityClassList" 时,它首先需要使用 "new ArrayList();" 从头开始创建,以便工作和新的最佳解决方案(当前正在克隆的解决方案)不会指向相同的列表。最后,新创建的列表需要用克隆的对象填充。