我正试图用OptaPlanner解决时间表问题,但我面临的问题可能与克隆问题有关。为什么我的计划实体收集方法看起来像
@PlanningEntityCollectionProperty
public List<Lesson> getLessons() {
return getProject().getLessons();
}
我收到错误
java.lang.IollegalStateException:未按预期克隆解决方案属性(课程)。FieldAccessingSolutionCloner无法识别该属性的字段,可能是因为其字段名称不同。
但是,当方法看起来像时
@PlanningEntityCollectionProperty
public List<Lesson> getLessons() {
if (lessons == null) {
lessons = getProject().getLessons();
}
return lessons;
}
一切都很好。可能是什么原因?为什么我会出现这个错误?谢谢你的帮助。
不幸的是,通用克隆器(计划克隆最佳解决方案,以便工作解决方案降级)目前无法处理第一段代码。
有两种解决方法:
- 实现自定义计划克隆器(这并不简单,但在文档"4.3.7.6"一节中有解释。克隆解决方案"
- 为规划解决方案而不是Project的课程制作规范字段(或者重构Project以实现solution)
我不会用这种懒惰的初始化技巧来做这件事,因为你可能总是不能保证getter在计划克隆发生之前至少被调用过一次。