两个计划实体类的求解器配置问题 [英] Problems with the solver configuration for two planning entity classes

查看:111
本文介绍了两个计划实体类的求解器配置问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在研究一个与optaplanner中的护士名册示例"接近的问题的解决方案.

像护士名册中一样,员工被分配轮班,但主要区别在于还有持续20分钟的技能要求(任务).如果雇员被分配到涵盖给定技能需求时间的轮班,则可以分配给他一个技能需求.可以说,我们对技能1的技能要求是从12:00到12:20,并且从08:00到16:00的班次分配了一个雇员,那么只有拥有该技能的他才能被分配到该技能要求. /p>

我有2个计划实体类.该示例中的默认班次分配,我又实现了2个类SkillRequirement类,它将在给定的时间范围内保留一项技能要求(这将是一个计划事实),第二个计划实体类别将在Employee和SkillRequirement类,其名称为EmployeeSkillRequirement.

现在,我认为我已经做好了所有事情,并注释了EmployeeSkillRequirement 类为@PlanningEntity并具有适当值范围的计划变量,在计划解决方案中,我添加了技能要求列表(既是事实,也进入了流口水的工作记忆),还添加了技能要求员工列表(这是计划)实体,并使用@PlanningEntitySolutionProperty正确注释

我在配置求解器时遇到了困难,我尝试了许多不同的求解器配置,我在文档中阅读到,当有更多计划实体和/或计划变量时,应在您告诉的地方使用移动选择器的并集OptaPlanner计划实体类和计划变量的名称,因为默认情况下找不到它.

似乎没有一个工作,而且我一直都收到此异常

Exception in thread "main" java.lang.IllegalArgumentException: Unmarshalling of solverConfigResource (org/optaplanner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml) fails.

以下是我一直在尝试使用的配置:

配置1:

在此配置中,默认的移动选择器用于 本地搜索和移动中的计划实体班次分配类 选择器 为计划实体类添加 "EmployeeSkillRequirement",并将所有内容合并为一个 并将构造启发式替换为组合在一起的移动选择器.

<?xml version="1.0" encoding="UTF-8"?>
<solver>
<!--<environmentMode>FAST_ASSERT</environmentMode> -->
<solutionClass>org.optaplanner.examples.nurserostering.domain.NurseRoster
</solutionClass>
<entityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
</entityClass>
<entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
</entityClass>
<scoreDirectorFactory>
    <scoreDefinitionType>HARD_SOFT</scoreDefinitionType>
    <scoreDrl>org/optaplanner/examples/nurserostering/solver/nurseRosteringScoreRules.drl
    </scoreDrl>
</scoreDirectorFactory>

<termination>
    <!-- Official benchmark secondsSpentLimit allowed on: - ge0ffrey's main 
        pc: sprint 11, medium 700, long 42000 -->
    <secondsSpentLimit>700</secondsSpentLimit>
    <!--<bestScoreLimit>-0hard/-999999soft</bestScoreLimit> -->
</termination>
<constructionHeuristic>
    <queuedEntityPlacer>
        <unionMoveSelector>
            <changeMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </downcastEntityClass>
                    <variableName>employee</variableName>
                </valueSelector>
            </changeMoveSelector>
            <swapMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </downcastEntityClass>
                    <variableName>employee</variableName>
                </valueSelector>
            </swapMoveSelector>
            <changeMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <variableName>employee</variableName>
                </valueSelector>
            </changeMoveSelector>
            <swapMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <variableName>employee</variableName>
                </valueSelector>
            </swapMoveSelector>
        </unionMoveSelector>
    </queuedEntityPlacer>
</constructionHeuristic>
<localSearch>
    <unionMoveSelector>

        <!-- Move Selectors for ShiftAssignment this was the default configuration 
            from the example -->
        <moveListFactory>
            <cacheType>PHASE</cacheType>
            <moveListFactoryClass>org.optaplanner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory
            </moveListFactoryClass>
        </moveListFactory>
        <moveListFactory>
            <cacheType>PHASE</cacheType>
            <moveListFactoryClass>org.optaplanner.examples.nurserostering.solver.move.factory.ShiftAssignmentSwapMoveFactory
            </moveListFactoryClass>
        </moveListFactory>
        <moveListFactory>
            <cacheType>STEP</cacheType>
            <moveListFactoryClass>org.optaplanner.examples.nurserostering.solver.move.factory.ShiftAssignmentPillarPartSwapMoveFactory
            </moveListFactoryClass>
        </moveListFactory>


        <!-- The move selectors for the second plannig entity class EmployeeSkillRequirement -->
        <changeMoveSelector>
            <entitySelector>
                <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                </entityClass>
            </entitySelector>
            <valueSelector>
                <variableName>employee</variableName>
            </valueSelector>
        </changeMoveSelector>
        <swapMoveSelector>
            <entitySelector>
                <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                </entityClass>
            </entitySelector>
            <valueSelector>
                <variableName>employee</variableName>
            </valueSelector>
        </swapMoveSelector>
    </unionMoveSelector>
    <acceptor>
        <entityTabuSize>7</entityTabuSize>
    </acceptor>
    <forager>
        <acceptedCountLimit>800</acceptedCountLimit>
    </forager>
</localSearch>

配置2:

第二,我查看了文档,发现这个提示说,如果每个规划实体类都有两个不同的构造启发式部分,则处理多个规划实体类会更容易 http://docs.jboss .org/optaplanner/release/6.3.0.Final/optaplanner-docs/html_single/index.html#allocateEntityFromQueueMultipleEntityClasses 所以我也尝试了这种配置.

<?xml version="1.0" encoding="UTF-8"?>
<solver>
<!--<environmentMode>FAST_ASSERT</environmentMode> -->
<solutionClass>org.optaplanner.examples.nurserostering.domain.NurseRoster
</solutionClass>
<entityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
</entityClass>
<entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
</entityClass>
<scoreDirectorFactory>
    <scoreDefinitionType>HARD_SOFT</scoreDefinitionType>
    <scoreDrl>org/optaplanner/examples/nurserostering/solver/nurseRosteringScoreRules.drl
    </scoreDrl>
</scoreDirectorFactory>

<termination>
    <!-- Official benchmark secondsSpentLimit allowed on: - ge0ffrey's main 
        pc: sprint 11, medium 700, long 42000 -->
    <secondsSpentLimit>700</secondsSpentLimit>
    <!--<bestScoreLimit>-0hard/-999999soft</bestScoreLimit> -->
</termination>
<constructionHeuristic>
    <queuedEntityPlacer>
        <unionMoveSelector>
            <changeMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </downcastEntityClass>
                    <variableName>employee</variableName>
                </valueSelector>
            </changeMoveSelector>
            <swapMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </downcastEntityClass>
                    <variableName>employee</variableName>
                </valueSelector>
            </swapMoveSelector>
        </unionMoveSelector>
    </queuedEntityPlacer>
</constructionHeuristic>
<constructionHeuristic>
    <queuedEntityPlacer>
        <unionMoveSelector>
            <changeMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                    </downcastEntityClass>
                    <variableName>employee</variableName>
                </valueSelector>
            </changeMoveSelector>
            <swapMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                    </downcastEntityClass>
                    <variableName>employee</variableName>
                </valueSelector>
            </swapMoveSelector>
        </unionMoveSelector>
    </queuedEntityPlacer>
</constructionHeuristic>
<localSearch>
    <unionMoveSelector>

        <!-- Move Selectors for ShiftAssignment this was the default configuration 
            from the example -->
        <moveListFactory>
            <cacheType>PHASE</cacheType>
            <moveListFactoryClass>org.optaplanner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory
            </moveListFactoryClass>
        </moveListFactory>
        <moveListFactory>
            <cacheType>PHASE</cacheType>
            <moveListFactoryClass>org.optaplanner.examples.nurserostering.solver.move.factory.ShiftAssignmentSwapMoveFactory
            </moveListFactoryClass>
        </moveListFactory>
        <moveListFactory>
            <cacheType>STEP</cacheType>
            <moveListFactoryClass>org.optaplanner.examples.nurserostering.solver.move.factory.ShiftAssignmentPillarPartSwapMoveFactory
            </moveListFactoryClass>
        </moveListFactory>
        <!-- besides this default configuration from optaplaner i also tried this here

        <changeMoveSelector>
            <entitySelector>
                <entityClass>org.optaplanner.examples.nurserostering.domain.
                </entityClass>
            </entitySelector>
            <valueSelector>
                <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                </downcastEntityClass>
                <variableName>employee</variableName>
            </valueSelector>
        </changeMoveSelector>
        <swapMoveSelector>
            <entitySelector>
                <entityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                </entityClass>
            </entitySelector>
            <valueSelector>
                <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                </downcastEntityClass>
                <variableName>employee</variableName>
            </valueSelector>
        </swapMoveSelector>-->


        <!-- The move selectors for the second plannig entity class EmployeeSkillRequirement -->
        <changeMoveSelector>
            <entitySelector>
                <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                </entityClass>
            </entitySelector>
            <valueSelector>
                <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                </downcastEntityClass>
                <variableName>employee</variableName>
            </valueSelector>
        </changeMoveSelector>
        <swapMoveSelector>
            <entitySelector>
                <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                </entityClass>
            </entitySelector>
            <valueSelector>
                <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                </downcastEntityClass>
                <variableName>employee</variableName>
            </valueSelector>
        </swapMoveSelector>
    </unionMoveSelector>
    <acceptor>
        <entityTabuSize>7</entityTabuSize>
    </acceptor>
    <forager>
        <acceptedCountLimit>800</acceptedCountLimit>
    </forager>
</localSearch>

我还尝试了一些与这些配置类似的配置,但是还是没有运气.

我该如何解决并使它正常工作?

Exception in thread "main" java.lang.IllegalArgumentException: Unmarshalling of solverConfigResource (org/optaplanner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml) fails.
at org.optaplanner.core.impl.solver.XStreamXmlSolverFactory.configure(XStreamXmlSolverFactory.java:114)
at org.optaplanner.core.api.solver.SolverFactory.createFromXmlResource(SolverFactory.java:66)
at org.optaplanner.examples.nurserostering.app.NurseRosteringApp.createSolver(NurseRosteringApp.java:50)
at org.optaplanner.examples.common.app.CommonApp.createSolutionBusiness(CommonApp.java:90)
at org.optaplanner.examples.common.app.CommonApp.init(CommonApp.java:77)
at org.optaplanner.examples.common.app.CommonApp.init(CommonApp.java:73)
at org.optaplanner.examples.nurserostering.app.NurseRosteringApp.main(NurseRosteringApp.java:38)
Caused by: " com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field   org.optaplanner.core.config.heuristic.selector.move.generic.SwapMoveSelectorConfig.valueSelector
---- Debugging information ----
field               : valueSelector
class               :      org.optaplanner.core.config.heuristic.selector.move.generic.SwapMoveSelect    orConfig
required-type       :     org.optaplanner.core.config.heuristic.selector.move.generic.SwapMoveSelect    orConfig
converter-type      :    com.thoughtworks.xstream.converters.reflection.ReflectionConverter
line number         : 98
class[1]            :       org.optaplanner.core.config.heuristic.selector.move.composite.UnionMoveSel    ectorConfig
class[2]            :    org.optaplanner.core.config.localsearch.LocalSearchPhaseConfig
class[3]            : org.optaplanner.core.config.solver.SolverConfig
version             : 1.4.7
-------------------------------
at org.optaplanner.core.impl.solver.XStreamXmlSolverFactory.configure(XStreamXmlSolverFactory.java:114)
at org.optaplanner.core.api.solver.SolverFactory.createFromXmlResource(SolverFactory.java:66)
at org.optaplanner.examples.nurserostering.app.NurseRosteringApp.createSolver(NurseRosteringApp.java:50)
at org.optaplanner.examples.common.app.CommonApp.createSolutionBusiness(CommonApp.java:90)
at org.optaplanner.examples.common.app.CommonApp.init(CommonApp.java:77)
at org.optaplanner.examples.common.app.CommonApp.init(CommonApp.java:73)
at org.optaplanner.examples.nurserostering.app.NurseRosteringApp.main(NurseRosteringApp.java:38)

解决方案

一个常见的错误是在无法正确解析的类名属性中添加空格.在解析过程中失败:

<solutionClass>org.optaplanner.examples.nurserostering.domain.NurseRoster
</solutionClass>

但这成功解析了:

<solutionClass>org.optaplanner.examples.nurserostering.domain.NurseRoster</solutionClass>

I'm working on a solution of a problem that is close to the Nurse Rostering Example in optaplanner .

Employees are assigned to shifts as in the Nurse Roster but the main difference is that there are also skill requirements (assignments) that last lets say 20 minutes. An employee can be assigned to a skill requirement if he gets assigned to a shift that covers the given skill requirement time. Lets say we have a skill requirement for Skill1 from 12:00 to 12:20 and an employee is assigned on a shift from 08:00 to 16:00 then he can be assigned to that skill requirement only if he has that skill.

I have 2 planning entity classes. The default shift assignment in the example, and i have implemented 2 more classes SkillRequirement class which will hold one skill requirement in the given time frame (this will be a planning fact) , and the second planning entity class will be between the Employee and the SkillRequirement class and the name of it will be EmployeeSkillRequirement.

By now i think i have done everything good i annotated the EmployeeSkillRequirement class as @PlanningEntity and the planning variable with the appropriate value range, in the planning solution i added the lists for the skill requirements(which are facts and also go into drools working memory) and the list of employees on skill requirements which are the planning entities and are properly annotated with @PlanningEntitySolutionProperty

I'm having a hard time configuring the solver, i have tried many different solver configurations, i read in the documentation that when there are more planning entities and/or planning variables a union of move selectors should be used where you tell OptaPlanner the name of the planning entity class and planning variable, because it cant find it by default.

None seem to work and i get this exception all the time

Exception in thread "main" java.lang.IllegalArgumentException: Unmarshalling of solverConfigResource (org/optaplanner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml) fails.

Here are the configurations i' have been trying to use:

Config 1:

In this configuration the default move selectors are used for the planning entity shift assignment class in local search and move selectors are added for the planning entity class "EmployeeSkillRequirement" and everything is combined in a and the construction heuristic is replaced with move selectors combined in a union to.

<?xml version="1.0" encoding="UTF-8"?>
<solver>
<!--<environmentMode>FAST_ASSERT</environmentMode> -->
<solutionClass>org.optaplanner.examples.nurserostering.domain.NurseRoster
</solutionClass>
<entityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
</entityClass>
<entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
</entityClass>
<scoreDirectorFactory>
    <scoreDefinitionType>HARD_SOFT</scoreDefinitionType>
    <scoreDrl>org/optaplanner/examples/nurserostering/solver/nurseRosteringScoreRules.drl
    </scoreDrl>
</scoreDirectorFactory>

<termination>
    <!-- Official benchmark secondsSpentLimit allowed on: - ge0ffrey's main 
        pc: sprint 11, medium 700, long 42000 -->
    <secondsSpentLimit>700</secondsSpentLimit>
    <!--<bestScoreLimit>-0hard/-999999soft</bestScoreLimit> -->
</termination>
<constructionHeuristic>
    <queuedEntityPlacer>
        <unionMoveSelector>
            <changeMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </downcastEntityClass>
                    <variableName>employee</variableName>
                </valueSelector>
            </changeMoveSelector>
            <swapMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </downcastEntityClass>
                    <variableName>employee</variableName>
                </valueSelector>
            </swapMoveSelector>
            <changeMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <variableName>employee</variableName>
                </valueSelector>
            </changeMoveSelector>
            <swapMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <variableName>employee</variableName>
                </valueSelector>
            </swapMoveSelector>
        </unionMoveSelector>
    </queuedEntityPlacer>
</constructionHeuristic>
<localSearch>
    <unionMoveSelector>

        <!-- Move Selectors for ShiftAssignment this was the default configuration 
            from the example -->
        <moveListFactory>
            <cacheType>PHASE</cacheType>
            <moveListFactoryClass>org.optaplanner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory
            </moveListFactoryClass>
        </moveListFactory>
        <moveListFactory>
            <cacheType>PHASE</cacheType>
            <moveListFactoryClass>org.optaplanner.examples.nurserostering.solver.move.factory.ShiftAssignmentSwapMoveFactory
            </moveListFactoryClass>
        </moveListFactory>
        <moveListFactory>
            <cacheType>STEP</cacheType>
            <moveListFactoryClass>org.optaplanner.examples.nurserostering.solver.move.factory.ShiftAssignmentPillarPartSwapMoveFactory
            </moveListFactoryClass>
        </moveListFactory>


        <!-- The move selectors for the second plannig entity class EmployeeSkillRequirement -->
        <changeMoveSelector>
            <entitySelector>
                <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                </entityClass>
            </entitySelector>
            <valueSelector>
                <variableName>employee</variableName>
            </valueSelector>
        </changeMoveSelector>
        <swapMoveSelector>
            <entitySelector>
                <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                </entityClass>
            </entitySelector>
            <valueSelector>
                <variableName>employee</variableName>
            </valueSelector>
        </swapMoveSelector>
    </unionMoveSelector>
    <acceptor>
        <entityTabuSize>7</entityTabuSize>
    </acceptor>
    <forager>
        <acceptedCountLimit>800</acceptedCountLimit>
    </forager>
</localSearch>

Config 2:

Second i looked at the documentation and found this hint that says that it is easier to deal with multiple planning entity classes if there are two different construction heuristic parts for each of them http://docs.jboss.org/optaplanner/release/6.3.0.Final/optaplanner-docs/html_single/index.html#allocateEntityFromQueueMultipleEntityClasses so i tried this configuration too.

<?xml version="1.0" encoding="UTF-8"?>
<solver>
<!--<environmentMode>FAST_ASSERT</environmentMode> -->
<solutionClass>org.optaplanner.examples.nurserostering.domain.NurseRoster
</solutionClass>
<entityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
</entityClass>
<entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
</entityClass>
<scoreDirectorFactory>
    <scoreDefinitionType>HARD_SOFT</scoreDefinitionType>
    <scoreDrl>org/optaplanner/examples/nurserostering/solver/nurseRosteringScoreRules.drl
    </scoreDrl>
</scoreDirectorFactory>

<termination>
    <!-- Official benchmark secondsSpentLimit allowed on: - ge0ffrey's main 
        pc: sprint 11, medium 700, long 42000 -->
    <secondsSpentLimit>700</secondsSpentLimit>
    <!--<bestScoreLimit>-0hard/-999999soft</bestScoreLimit> -->
</termination>
<constructionHeuristic>
    <queuedEntityPlacer>
        <unionMoveSelector>
            <changeMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </downcastEntityClass>
                    <variableName>employee</variableName>
                </valueSelector>
            </changeMoveSelector>
            <swapMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                    </downcastEntityClass>
                    <variableName>employee</variableName>
                </valueSelector>
            </swapMoveSelector>
        </unionMoveSelector>
    </queuedEntityPlacer>
</constructionHeuristic>
<constructionHeuristic>
    <queuedEntityPlacer>
        <unionMoveSelector>
            <changeMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                    </downcastEntityClass>
                    <variableName>employee</variableName>
                </valueSelector>
            </changeMoveSelector>
            <swapMoveSelector>
                <entitySelector>
                    <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                    </entityClass>
                </entitySelector>
                <valueSelector>
                    <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                    </downcastEntityClass>
                    <variableName>employee</variableName>
                </valueSelector>
            </swapMoveSelector>
        </unionMoveSelector>
    </queuedEntityPlacer>
</constructionHeuristic>
<localSearch>
    <unionMoveSelector>

        <!-- Move Selectors for ShiftAssignment this was the default configuration 
            from the example -->
        <moveListFactory>
            <cacheType>PHASE</cacheType>
            <moveListFactoryClass>org.optaplanner.examples.nurserostering.solver.move.factory.EmployeeChangeMoveFactory
            </moveListFactoryClass>
        </moveListFactory>
        <moveListFactory>
            <cacheType>PHASE</cacheType>
            <moveListFactoryClass>org.optaplanner.examples.nurserostering.solver.move.factory.ShiftAssignmentSwapMoveFactory
            </moveListFactoryClass>
        </moveListFactory>
        <moveListFactory>
            <cacheType>STEP</cacheType>
            <moveListFactoryClass>org.optaplanner.examples.nurserostering.solver.move.factory.ShiftAssignmentPillarPartSwapMoveFactory
            </moveListFactoryClass>
        </moveListFactory>
        <!-- besides this default configuration from optaplaner i also tried this here

        <changeMoveSelector>
            <entitySelector>
                <entityClass>org.optaplanner.examples.nurserostering.domain.
                </entityClass>
            </entitySelector>
            <valueSelector>
                <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                </downcastEntityClass>
                <variableName>employee</variableName>
            </valueSelector>
        </changeMoveSelector>
        <swapMoveSelector>
            <entitySelector>
                <entityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                </entityClass>
            </entitySelector>
            <valueSelector>
                <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.ShiftAssignment
                </downcastEntityClass>
                <variableName>employee</variableName>
            </valueSelector>
        </swapMoveSelector>-->


        <!-- The move selectors for the second plannig entity class EmployeeSkillRequirement -->
        <changeMoveSelector>
            <entitySelector>
                <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                </entityClass>
            </entitySelector>
            <valueSelector>
                <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                </downcastEntityClass>
                <variableName>employee</variableName>
            </valueSelector>
        </changeMoveSelector>
        <swapMoveSelector>
            <entitySelector>
                <entityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                </entityClass>
            </entitySelector>
            <valueSelector>
                <downcastEntityClass>org.optaplanner.examples.nurserostering.domain.EmployeeSkillRequirement
                </downcastEntityClass>
                <variableName>employee</variableName>
            </valueSelector>
        </swapMoveSelector>
    </unionMoveSelector>
    <acceptor>
        <entityTabuSize>7</entityTabuSize>
    </acceptor>
    <forager>
        <acceptedCountLimit>800</acceptedCountLimit>
    </forager>
</localSearch>

I also tried some other configurations that are similar to these ones, still, no luck.

How can i fix this and make it working?

Edit:

Exception in thread "main" java.lang.IllegalArgumentException: Unmarshalling of solverConfigResource (org/optaplanner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml) fails.
at org.optaplanner.core.impl.solver.XStreamXmlSolverFactory.configure(XStreamXmlSolverFactory.java:114)
at org.optaplanner.core.api.solver.SolverFactory.createFromXmlResource(SolverFactory.java:66)
at org.optaplanner.examples.nurserostering.app.NurseRosteringApp.createSolver(NurseRosteringApp.java:50)
at org.optaplanner.examples.common.app.CommonApp.createSolutionBusiness(CommonApp.java:90)
at org.optaplanner.examples.common.app.CommonApp.init(CommonApp.java:77)
at org.optaplanner.examples.common.app.CommonApp.init(CommonApp.java:73)
at org.optaplanner.examples.nurserostering.app.NurseRosteringApp.main(NurseRosteringApp.java:38)
Caused by: " com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field   org.optaplanner.core.config.heuristic.selector.move.generic.SwapMoveSelectorConfig.valueSelector
---- Debugging information ----
field               : valueSelector
class               :      org.optaplanner.core.config.heuristic.selector.move.generic.SwapMoveSelect    orConfig
required-type       :     org.optaplanner.core.config.heuristic.selector.move.generic.SwapMoveSelect    orConfig
converter-type      :    com.thoughtworks.xstream.converters.reflection.ReflectionConverter
line number         : 98
class[1]            :       org.optaplanner.core.config.heuristic.selector.move.composite.UnionMoveSel    ectorConfig
class[2]            :    org.optaplanner.core.config.localsearch.LocalSearchPhaseConfig
class[3]            : org.optaplanner.core.config.solver.SolverConfig
version             : 1.4.7
-------------------------------
at org.optaplanner.core.impl.solver.XStreamXmlSolverFactory.configure(XStreamXmlSolverFactory.java:114)
at org.optaplanner.core.api.solver.SolverFactory.createFromXmlResource(SolverFactory.java:66)
at org.optaplanner.examples.nurserostering.app.NurseRosteringApp.createSolver(NurseRosteringApp.java:50)
at org.optaplanner.examples.common.app.CommonApp.createSolutionBusiness(CommonApp.java:90)
at org.optaplanner.examples.common.app.CommonApp.init(CommonApp.java:77)
at org.optaplanner.examples.common.app.CommonApp.init(CommonApp.java:73)
at org.optaplanner.examples.nurserostering.app.NurseRosteringApp.main(NurseRosteringApp.java:38)

解决方案

A common mistake is to add whitespace in classname properties that doesn't get parsed correctly. This fails during parsing:

<solutionClass>org.optaplanner.examples.nurserostering.domain.NurseRoster
</solutionClass>

but this succeeds in getting parsed:

<solutionClass>org.optaplanner.examples.nurserostering.domain.NurseRoster</solutionClass>

这篇关于两个计划实体类的求解器配置问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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