OptaPlanner:java.lang.IllegalArgumentException [英] OptaPlanner: java.lang.IllegalArgumentException
问题描述
线程main中的异常java.lang.IllegalArgumentException:
计划实体是未配置为计划实体的entitySubclass(类com.company.Assignment)
的实例。
如果该类(Assignment)(或其超类)不是entityClass
([com.company.Car]),请检查您的Solution实现的注释方法。
如果是,请检查您的求解器配置。
我的SolverConfig.xml是这样的:
<?xml version =1.0encoding =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>赋值< / variableName>
< / valueSelector>
< / changeMoveSelector>
< acceptor>
< entityTabuSize> 7< / entityTabuSize>
< / acceptor>
< forager>
< acceptedCountLimit> 1000< / acceptedCountLimit>
< / forager>
< / localSearch>
< / solver>
Car类用@PlanningEntity注释。
规划类用@PlanningSolution注释。
Tha作业类是我的问题事实。
解决方案的@PlanningEntityCollectionProperty位于运行Car列表的getter上。
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){
//从XLS文件读取数据并初始化问题
ReadDataFromXls Reader = new ReadDataFromXls();
计划规划计划=新计划(Reader.ReadAssignments(),Reader.ReadCars());
//构建求解器
Solver solver = SolverFactory.createFromXmlResource(SOLVER_CONFIG_XML).buildSolver();
//解决问题并获得最佳解决方案
solver.solve(planningSituation);
计划solvePlanning =(规划)solver.getBestSolution();
//显示结果
System.out.println(TODO);
}
}
带有 6.3的错误消息。 0.CR1
基本相同+有关 SLF4J的错误
SLF4J:无法加载类org.slf4j.impl.StaticLoggerBinder。
SLF4J:默认为无操作(NOP)记录器实现
SLF4J:有关详细信息,请参阅http://www.slf4j.org/codes.html#StaticLoggerBinder。
线程main中的异常java.lang.IllegalArgumentException:规划实体是未配置为计划实体的entitySubclass(类com.company.Assignment)的实例。
如果该类(Assignment)(或其超类)不是entityClass([com.company.Car]),请检查您的Solution实现的注释方法。
如果是,请检查您的求解器配置。
编辑:我在OptaPlanner中的第一个项目是一对多的问题(一个项目有一个开发者,开发人员可以有多个项目)。这个项目是一个一对一的问题(一辆汽车需要开车去做任务,一个任务是由一辆汽车刷新的)。
编辑:我改变了我的规划问题的模型。现在班级作业是我的规划实体,班级汽车是规划事实。除了Car和Assignment交换的地方,错误消息仍然是一样的:)
解决方案的 @PlanningEntityCollectionProperty
在一个getter上运行 Assignment
(这不是您的情况下的实体)而不是 Car
(这是一个实体)。
类命名是令人困惑的。我会将类赋值
重命名为任务
和类 Car
到 CarAssignment
,因为任何名称分配通常是规划实体...
currently i am implementing my second project in OptaPlanner. I am retrieving the following error:
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.
My SolverConfig.xml is this:
<?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>
The "Car" class is annotated with "@PlanningEntity". The "Planning" class is annotated with "@PlanningSolution". Tha "Assignment" class is my problem fact. The solution's "@PlanningEntityCollectionProperty" is on a getter that runs a list of "Car".
The "Main" class looks like this:
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");
}
}
Error message with 6.3.0.CR1
is basically the same + an error concerning 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: My first project in OptaPlanner was a "One to Many" problem (a project has a developer, a developer can have multiple projects). This project is a "One to One" problem (a car is needed to drive to an assignment, an assignment is reched by a car).
EDIT: I changed the model of my planning problem. Now the class "Assignment" is my "planning entity" and the class "Car" is the "planning fact". The error message ist still the same, besides the fact that "Car" and "Assignment" switched places :)
I bet the Solution's @PlanningEntityCollectionProperty
is on a getter that runs a Collection of Assignment
(which is not an entity in your case) instead of Car
(which is an entity).
The class naming is confusing though. I would rename the class Assignment
to Task
and the class Car
to CarAssignment
because anything name assignment is usually the planning entity...
这篇关于OptaPlanner:java.lang.IllegalArgumentException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!