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());
感谢您的帮助!
目前我正在 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());
感谢您的帮助!