2015-12-01 3 views
0

Я пытаюсь реализовать что-то вроде NurseRostering в примере, поэтому я сделал все то же самое, кроме классов в 'solver/drools & move' (также может кто-то объяснить, что они делают именно?).OptaPlanner ClassCastException в ComparatorSelectionSorter

Итак, моя проблема заключается в том, что я реализовал компараторы: EmployeeStrengthComparator и JobDifficultyComparator, они похожи на EmployeeStrengthComparator и ShiftAssignmentDifficultyComparator в примере NurseRostering.

Так я создал свои правила, мое решение, и начал решать, но я получаю эту ошибку:

Exception in thread "main" java.lang.ClassCastException: org.demo.DemoApp.domain.JobAssignment cannot be cast to org.demo.DemoApp.domain.Employee 
at org.demo.DemoApp.domain.solver.EmployeeStrengthComparator.compare(EmployeeStrengthComparator.java:12) 
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) 
at java.util.TimSort.sort(TimSort.java:220) 
at java.util.Arrays.sort(Arrays.java:1512) 
at java.util.ArrayList.sort(ArrayList.java:1454) 
at java.util.Collections.sort(Collections.java:175) 
at org.optaplanner.core.impl.heuristic.selector.common.decorator.ComparatorSelectionSorter.sort(ComparatorSelectionSorter.java:45) 
at org.optaplanner.core.impl.heuristic.selector.value.decorator.SortingValueSelector.constructCache(SortingValueSelector.java:43) 
at org.optaplanner.core.impl.heuristic.selector.common.SelectionCacheLifecycleBridge.phaseStarted(SelectionCacheLifecycleBridge.java:49) 
at org.optaplanner.core.impl.phase.event.PhaseLifecycleSupport.firePhaseStarted(PhaseLifecycleSupport.java:39) 

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

UPD: так это было как:

@PlanningEntityCollectionProperty 
@ValueRangeProvider(id = "employeeRange") 
public List<JobAssignment> getJobAssignments() { 
    return jobAssignments; 
} 
+1

[Сообщение об ошибке улучшено] (https://issues.jboss.org/browse/PLANNER-484) для 6.4.0.Beta1. –

ответ

0

да ладно ... Я случайно добавил атрибут ValueRangeProvider для планирования объекта JobAssignment, когда он должен быть помещен на Работника, теперь это нормально

UPD:

И это должно быть так:

@ValueRangeProvider(id = "employeeRange") 
public List<Employee> getEmployees() { 
    return employees; 
} 

@PlanningEntityCollectionProperty 
public List<VisitAssignment> getVisitAssignments() { 
    return visitAssignments; 
} 
+0

Какой метод на них? Обычно ValueRangeProvider находится на уровне получателя решения (или объект планирования, но это гораздо менее распространено). –

+0

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

+0

@GeoffreyDeSmet ничего себе, спасибо за ответ, Джеффри, это действительно отличная каркас! Это была моя ошибка :) просто перепутали атрибуты в классе решений. Просто интересно, существуют ли описания примеров, используемых в примерах? Это будет очень полезно для быстрого вовлечения в разработку с помощью Optaplanner, я думаю. –

Смежные вопросы