2015-08-12 4 views
1

В настоящее время я реализую свой второй проект в OptaPlanner. Я извлекая следующее сообщение об ошибке:OptaPlanner: java.lang.IllegalArgumentException

Exception in thread "main" java.lang.IllegalArgumentException: 
    A planning entity is an instance of a entitySubclass (class com.company.Assignment) 
    that is not configured as a planning entity. 
    If that class (Assignment) (or superclass thereof) is not a entityClass 
    ([class com.company.Car]), check your Solution implementation's annotated methods. 
    If it is, check your solver configuration. 

Мой SolverConfig.xml это:

<?xml version="1.0" encoding="UTF-8"?> 
<solver> 
<solutionClass>com.company.Planning</solutionClass> 
<entityClass>com.company.Car</entityClass> 
<scoreDirectorFactory> 
    <scoreDefinitionType>HARD_SOFT</scoreDefinitionType> 
    <easyScoreCalculatorClass>com.company.PlanningEasyScoreCalculator</easyScoreCalculatorClass> 
    <initializingScoreTrend>ONLY_DOWN</initializingScoreTrend> 
</scoreDirectorFactory> 
<constructionHeuristic> 
    <constructionHeuristicType>FIRST_FIT</constructionHeuristicType> 
</constructionHeuristic> 
<localSearch> 
    <termination> 
     <secondsSpentLimit>10</secondsSpentLimit> 
    </termination> 
    <changeMoveSelector> 
     <entitySelector> 
      <entityClass>com.company.Car</entityClass> 
     </entitySelector> 
     <valueSelector> 
      <variableName>assignment</variableName> 
     </valueSelector> 
    </changeMoveSelector> 
    <acceptor> 
     <entityTabuSize>7</entityTabuSize> 
    </acceptor> 
    <forager> 
     <acceptedCountLimit>1000</acceptedCountLimit> 
    </forager> 
</localSearch> 
</solver> 

Класс "Автомобиль" помечается "@PlanningEntity". Класс «Планирование» аннотируется с помощью «@PlanningSolution». Класс «Назначение» - мой проблемный факт. Решение «@PlanningEntityCollectionProperty» находится на получателе, который запускает список «Автомобиль».

Класс "Main" выглядит следующим образом:

public class Main { 
public static final String SOLVER_CONFIG_XML = "com/company/PlanningSolverConfig.xml"; 
public static ScoreDirector scoreDirector; 
public static void main(String[] args) { 
    // Read data from XLS file and initialize the problem 
    ReadDataFromXls Reader = new ReadDataFromXls(); 
    Planning planningSituation = new Planning(Reader.ReadAssignments(),Reader.ReadCars()); 
    // Build the solver 
    Solver solver = SolverFactory.createFromXmlResource(SOLVER_CONFIG_XML).buildSolver(); 
    // Solve the problem and get the best solution 
    solver.solve(planningSituation); 
    Planning solvedPlanning = (Planning) solver.getBestSolution(); 
    // Display the result 
    System.out.println("TODO"); 
} 
} 

Сообщение об ошибке с 6.3.0.CR1 в основном то же + ошибка относительно SLF4J

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 
Exception in thread "main" java.lang.IllegalArgumentException: A planning entity is an instance of an entitySubclass (class com.company.Assignment) that is not configured as a planning entity. 
If that class (Assignment) (or superclass thereof) is not a entityClass ([class com.company.Car]), check your Solution implementation's annotated methods. 
If it is, check your solver configuration. 

EDIT: Мой первый проект в OptaPlanner был " От одного до многих "(проект имеет разработчика, у разработчика может быть несколько проектов). Этот проект является проблемой «один к одному» (автомобиль необходим для перехода к заданию, задание переводится автомобилем).

EDIT: Я изменил модель своей задачи планирования. Теперь класс «Назначение» является моим «объектом планирования», а класс «Автомобиль» является «фактом планирования». Сообщение об ошибке остается неизменным, кроме того, что переключаются места «Автомобиль» и «Назначение» :)

+0

Если я правильно помню, это сообщение об ошибке стало более понятным в '6.3.0.CR1', которое было выпущено несколько дней назад. Попробуйте эту версию и сообщите об этом сообщение об ошибке. Это должно быть неправильная конфигурация вашей модели домена. –

+0

В основном то же сообщение об ошибке (вставлено в сообщение выше). –

ответ

0

Я уверен, что решение @PlanningEntityCollectionProperty находится на получателе, в котором находится коллекция Assignment (которая не является сущностью вашего case) вместо Car (который является сущностью).

Номенклатура классов путается. Я хотел бы переименовать класс Assignment в Task и класс Car к CarAssignment, потому что присвоение имени ничего, как правило, объект планирования ...

+0

Решение «@PlanningEntityCollectionProperty» находится на получателе, который запускает список «Автомобиль». В основном это та же структура, что и в моем первом (рабочем) проекте OptaPlanner, в котором я оптимизировал планирование проектов для разработчиков. –

0

It must be a misconfiguration on your domain model somehow.

Вы были совершенно правы! Я назвал этот конструктор:

public Planning(List<Car> carList, List<Assignment> assignmentList) { 
    this.carList = carList; 
    this.assignmentList = assignmentList; 
    } 

С этими аргументами:

Planning planningSituation = new Planning(Reader.ReadAssignments(),Reader.ReadCars()); 

Спасибо за помощь!

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