2015-03-24 4 views
0

Я пытаюсь решить проблему расписания с помощью OptaPlanner, но перед вами столкнулась проблема, которая может быть связана с проблемой клонирования. Почему, когда мой планирование метод сбора лицо выглядит, чтоCloning PlanningSolution в OptaPlanner

@PlanningEntityCollectionProperty 
public List<Lesson> getLessons() { 
    return getProject().getLessons(); 
} 

Я получаю ошибку

java.lang.IllegalStateException: The solutionProperty (уроки) не был клонирован, как и ожидалось. FieldAccessingSolutionCloner не смог распознать поле этого свойства, возможно, потому, что его имя поля отличается.

но, когда метод выглядит

@PlanningEntityCollectionProperty 
public List<Lesson> getLessons() { 
    if (lessons == null) { 
     lessons = getProject().getLessons(); 
    } 
    return lessons; 
} 

все в порядке. Что может быть причиной? Почему я получаю эту ошибку? Спасибо за любую помощь.

ответ

0

Общий клонер (для планирования клонирования наилучшего решения, так что рабочее решение может ухудшиться), в настоящее время невозможно обработать этот первый фрагмент кода.

Есть 2 обходные пути:

  • Реализовать Cloner пользовательского планирования (это не просто, но это объясняется в разделе DOCS
  • Сделать каноническое поле «4.3.7.6 Клонирование решение.». уроки по этому планировочному решению вместо проекта (или рефакторинг проект для реализации решения).

Я бы не сделать это с этим ленивой инициализацией трюком, так как вы не всегда можете быть в состоянии гарантировать, что добытчик было называемый по крайней мере один раз перед произошел клонированный клоун.