OptaPlanner中的克隆规划解决方案



我正试图用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在计划克隆发生之前至少被调用过一次。

最新更新