两个规划实体的求解器配置问题 类
Problems with the solver configuration for two planning entity classes
我正在解决一个与 optaplanner 中的护士排班示例接近的问题。
员工被分配到护士名册中的轮班,但主要区别在于还有持续 20 分钟的技能要求(任务)。如果员工被分配到涵盖给定技能要求时间的班次,则可以为他分配技能要求。假设我们对 Skill1 有从 12:00 到 12:20 的技能要求,并且分配了一名员工从 08:00 到 16:00 的轮班,那么他可以被分配到该技能要求只有他有那个技能。
我有 2 个规划实体 classes。示例中的默认轮班分配,我已经实施了 2 个 classes SkillRequirement class,它将在给定的时间范围内满足一项技能要求(这将是一个计划事实),第二个计划实体 class 将位于 Employee 和 SkillRequirement class 之间,其名称将是 EmployeeSkillRequirement。
到现在为止,我认为我已经做好了一切,我注释了 EmployeeSkillRequirement
class 作为@PlanningEntity 和具有适当值范围的计划变量,在计划解决方案中我添加了技能要求列表(这是事实,也会进入流口水工作记忆)和员工技能要求列表这是规划实体,并用 @PlanningEntitySolutionProperty
正确注释
我很难配置解算器,我尝试了许多不同的解算器配置,我在文档中读到当有更多规划实体时 and/or 规划变量应该是移动选择器的联合在你告诉 OptaPlanner 规划实体的名称 class 和规划变量的地方使用,因为它默认找不到它。
None 似乎可以正常工作,而且我一直遇到此异常
Exception in thread "main" java.lang.IllegalArgumentException: Unmarshalling of solverConfigResource (org/optaplanner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml) fails.
以下是我一直尝试使用的配置:
配置 1:
在此配置中,默认移动选择器用于
在本地搜索和移动中计划实体轮班分配 class
选择器
为规划实体添加 class
"EmployeeSkillRequirement" 一切都组合成一个
并且构造启发式被替换为联合移动选择器 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>
配置 2:
其次,我查看了文档,发现这个提示表明,如果每个规划实体都有两个不同的构造启发式部分,那么处理多个规划实体会更容易 classes
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>
我正在解决一个与 optaplanner 中的护士排班示例接近的问题。
员工被分配到护士名册中的轮班,但主要区别在于还有持续 20 分钟的技能要求(任务)。如果员工被分配到涵盖给定技能要求时间的班次,则可以为他分配技能要求。假设我们对 Skill1 有从 12:00 到 12:20 的技能要求,并且分配了一名员工从 08:00 到 16:00 的轮班,那么他可以被分配到该技能要求只有他有那个技能。
我有 2 个规划实体 classes。示例中的默认轮班分配,我已经实施了 2 个 classes SkillRequirement class,它将在给定的时间范围内满足一项技能要求(这将是一个计划事实),第二个计划实体 class 将位于 Employee 和 SkillRequirement class 之间,其名称将是 EmployeeSkillRequirement。
到现在为止,我认为我已经做好了一切,我注释了 EmployeeSkillRequirement class 作为@PlanningEntity 和具有适当值范围的计划变量,在计划解决方案中我添加了技能要求列表(这是事实,也会进入流口水工作记忆)和员工技能要求列表这是规划实体,并用 @PlanningEntitySolutionProperty
正确注释我很难配置解算器,我尝试了许多不同的解算器配置,我在文档中读到当有更多规划实体时 and/or 规划变量应该是移动选择器的联合在你告诉 OptaPlanner 规划实体的名称 class 和规划变量的地方使用,因为它默认找不到它。
None 似乎可以正常工作,而且我一直遇到此异常
Exception in thread "main" java.lang.IllegalArgumentException: Unmarshalling of solverConfigResource (org/optaplanner/examples/nurserostering/solver/nurseRosteringSolverConfig.xml) fails.
以下是我一直尝试使用的配置:
配置 1:
在此配置中,默认移动选择器用于 在本地搜索和移动中计划实体轮班分配 class 选择器 为规划实体添加 class "EmployeeSkillRequirement" 一切都组合成一个 并且构造启发式被替换为联合移动选择器 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>
配置 2:
其次,我查看了文档,发现这个提示表明,如果每个规划实体都有两个不同的构造启发式部分,那么处理多个规划实体会更容易 classes 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>