OptaPlanner:java.lang.IllegalArgumentException [英] OptaPlanner: java.lang.IllegalArgumentException

查看:256
本文介绍了OptaPlanner:java.lang.IllegalArgumentException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 线程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 Sc​​oreDirector 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆