OptaPlanner:java.lang.IllegalArgumentException

OptaPlanner: java.lang.IllegalArgumentException

目前我正在 OptaPlanner 中实施我的第二个项目。我正在检索以下错误:

    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>

"Car" class 带有“@PlanningEntity”注释。 "Planning" class 用“@PlanningSolution”注释。 Tha "Assignment" class 是我的问题事实。 解决方案的“@PlanningEntityCollectionProperty”位于运行 "Car".

列表的 getter 上

"Main" class 看起来像这样:

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.

编辑:我在 OptaPlanner 中的第一个项目是一个 "One to Many" 问题(一个项目有一个开发人员,一个开发人员可以有多个项目)。这个项目是一个 "One to One" 问题(需要一辆车才能开到一个任务,一个任务是由一辆车完成的)。

编辑:我更改了规划问题的模型。现在 class "Assignment" 是我的 "planning entity" 而 class "Car" 是 "planning fact"。错误信息仍然是一样的,除了 "Car" 和 "Assignment" 交换了位置:)

我打赌解决方案的 @PlanningEntityCollectionProperty 是在一个 getter 上,它运行 Assignment 的集合(在你的情况下这不是一个实体)而不是 Car (这是一个实体)。

class 命名虽然令人困惑。我会将 class Assignment 重命名为 Task 并将 class Car 重命名为 CarAssignment 因为任何名称分配通常都是规划实体......

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());

感谢您的帮助!