当前位置: 首页 > 知识库问答 >
问题:

OptaPlanner解决方案使用两个实体类和排队变量(列表变量)。错误“entityClassSet中有多个”

壤驷华辉
2023-03-14

我使用OptaPlanner 8.19.0。这个问题有两个实体类。

但它出现了以下例外:

未能实例化[org.optaplanner.core.api.solver.SolverManager]:工厂方法“SolverManager”引发异常;嵌套的异常是java。lang.IllegalArgumentException:config(QueuedValuePlacerConfig(ValueSelectorConfig(taskCombos),ChangeMoveSelectorConfig(null,ValueSelectorConfig(null)))没有配置实体类,并且由于实体类集中有多个实体类([class com.aiseeding.aps.hf.domain.MachineStageFirst,class com.aiseeding.aps.hf.domain.MachineStageSecond]),因此无法自动推断。

PlanningEntity1和PlanningEntity2相同,但取值范围不同。我试图在@PlanngingEntity上使用value eRangeProvider,但optaplanner说它不支持列表变量。所以我使用了两个实体类,每个实体类都有一个value eProviderRange

解决方案类别:

@PlanningSolution
@XStreamAlias("TaTaskAssigningSolution")
public class APSSolution extends AbstractPersistable {

    @ProblemFactCollectionProperty
    private List<Tank> taskTypeList;

    @ValueRangeProvider(id = "taskRangeStageFirst")
    @ProblemFactCollectionProperty
    private List<TaskCombo> taskComboListStageFirst;

    @ValueRangeProvider(id = "taskRangeStageSecond")
    @ProblemFactCollectionProperty
    private List<TaskCombo> taskComboListStageSecond;

    @ProblemFactCollectionProperty
    private List<Tank> tankList;

    @PlanningEntityCollectionProperty
    private List<Machine> machineList;

    @PlanningEntityCollectionProperty
    private List<Machine> machineListSecond;

    @XStreamConverter(BendableScoreXStreamConverter.class)
    @PlanningScore(bendableHardLevelsSize = 1, bendableSoftLevelsSize = 4)

    private BendableLongScore score;

    /** Relates to {@link Task#()}. */
    private int frozenCutoff; // In minutes

    private Param param;
    private List<Stage> stageList;
    private Map<String,Task> taskMap;
    private Map<String,Machine> machineMap;

    public APSSolution(long id){}
}

PlanningEntity1和PlanningEntity2:

@PlanningEntity
@XStreamAlias("TaEmployee")
public class MachineStageFirst extends Machine {

    @PlanningListVariable(valueRangeProviderRefs = "taskRangeStageFirst")
    private List<TaskCombo> taskCombos;

    public MachineStageFirst()
    {    }

    public MachineStageFirst(long id, String fullName) {
        super.setId(id);
        super.setFullName(fullName);
        setTaskCombos(new ArrayList<>());
    }

    public List<TaskCombo> getTaskCombos() {
        return taskCombos;
    }

    public void setTaskCombos(List<TaskCombo> taskCombos) {
        this.taskCombos = taskCombos;
    }
}

conifg XML:

<?xml version="1.0" encoding="UTF-8"?>
<solver>
  <!--<environmentMode>FULL_ASSERT</environmentMode>--><!-- To slowly prove there are no bugs in this code -->
  <moveThreadCount>1</moveThreadCount> To solve faster by saturating multiple CPU cores

  <solutionClass>com.aps.hf.domain.APSSolution</solutionClass>
  <entityClass>com.aps.hf.domain.MachineStageFirst</entityClass>
  <entityClass>com.aps.hf.domain.MachineStageSecond</entityClass>


  <scoreDirectorFactory>
    <easyScoreCalculatorClass>com.aiseeding.aps.hf.score.APSConstraintScoreCalculator</easyScoreCalculatorClass>
  </scoreDirectorFactory>

  <termination>
    <secondsSpentLimit>10</secondsSpentLimit>
  </termination>

  <constructionHeuristic>
    <queuedValuePlacer>
      <entitySelector>
        <entityClass>com.aiseeding.aps.hf.domain.MachineStageFirst</entityClass>
      </entitySelector>
      <valueSelector id="placerValueSelector">
        <cacheType>PHASE</cacheType>
        <selectionOrder>SORTED</selectionOrder>
        <sorterManner>INCREASING_STRENGTH</sorterManner>
      </valueSelector>
      <changeMoveSelector>
        <entitySelector>
          <cacheType>PHASE</cacheType>
          <selectionOrder>SORTED</selectionOrder>
          <sorterManner>DECREASING_DIFFICULTY</sorterManner>
        </entitySelector>
        <valueSelector mimicSelectorRef="placerValueSelector"/>
      </changeMoveSelector>
    </queuedValuePlacer>
  </constructionHeuristic>

  <constructionHeuristic>
    <queuedValuePlacer>
      <entitySelector>
        <entityClass>com.aiseeding.aps.hf.domain.MachineStageSecond</entityClass>
      </entitySelector>
      <valueSelector id="placerValueSelector">
        <cacheType>PHASE</cacheType>
        <selectionOrder>SORTED</selectionOrder>
        <sorterManner>INCREASING_STRENGTH</sorterManner>
      </valueSelector>
      <changeMoveSelector>
        <entitySelector>
          <cacheType>PHASE</cacheType>
          <selectionOrder>SORTED</selectionOrder>
          <sorterManner>DECREASING_DIFFICULTY</sorterManner>
        </entitySelector>
        <valueSelector mimicSelectorRef="placerValueSelector"/>
      </changeMoveSelector>
    </queuedValuePlacer>
  </constructionHeuristic>

  <localSearch>
    <changeMoveSelector>
      <entitySelector>
        ... <!-- Normal selector properties -->
        <entityClass>com.aps.hf.domain.MachineStageFirst</entityClass>
      </entitySelector>
      <selectionOrder>ORIGINAL</selectionOrder>
    </changeMoveSelector>

    <acceptor>
      <entityTabuSize>5</entityTabuSize>
    </acceptor>
    <forager>
    </forager>
  </localSearch>
  <localSearch>
    <changeMoveSelector>
      <entitySelector>
        ... <!-- Normal selector properties -->
        <entityClass>com.aps.hf.domain.MachineStageSecond</entityClass>
      </entitySelector>
      <selectionOrder>ORIGINAL</selectionOrder>
    </changeMoveSelector>

    <acceptor>
      <entityTabuSize>5</entityTabuSize>
    </acceptor>
    <forager>
    </forager>
  </localSearch>

</solver>

问题是由两个实体CALSS还是排队变量引起的?

多谢啦~

共有1个答案

阙博容
2023-03-14

具有多个实体类(每个实体类至少有一个真正的(=非影子)规划变量)的情况既困难又罕见。

@PlanningListVariable尚未与多个实体类兼容。

 类似资料:
  • 我正在研究来自OptaPlanner的示例用例。我也找不到任何类似的例子,可以在一个规划实体中求解多个规划变量。例如,在护士名册中,一个轮班的每个可能需要多个分配的。在这种情况下,如何利用planner和编写规则呢?

  • 我从optaplanner示例的CourclemCourse示例中扩展了我的问题库。 由于需要解决现有的问题,我开始使用两个变量,都来自“实体的Value range provider”。 现在我正在努力改进我的解决方案,当我检查解决方案时,我意识到有一些课程可以更好(基于分数),如果他们只是交换,或左移或右移,等等。 我不确定这种方法是否能解决这个问题,但我发现,使用nearbySelectio

  • 本文向大家介绍JavaScript交换两个变量值的七种解决方案,包括了JavaScript交换两个变量值的七种解决方案的使用技巧和注意事项,需要的朋友参考一下 前言 这篇文章总结了七种办法来交换a和b的变量值 交换变量值方案一 最最最简单的办法就是使用一个临时变量了,不过使用临时变量的方法实在是太low了 首先把a的值存储到临时变量中,然后b赋值给a,最后拿出临时变量中的a值赋给b,这个办法是最基

  • 本文向大家介绍Python实现全局变量的两个解决方法,包括了Python实现全局变量的两个解决方法的使用技巧和注意事项,需要的朋友参考一下 本文针对Python的全局变量实现方法简述如下: 先来看下面一段测试程序: 运行结果是: 很显然,这并不是我们想要的结果。 针对这一问题的解决方法就是采用全局变量: 运行结果为: 需要注意:哪里需要全局变量,哪里声明一下;但是函数千万不要传参数,比如用Fuc(

  • 我有以下CVRPTW问题,我正在尝试使用OptaPlanner找到一个好的解决方案。时间为hh: mm: ss格式。 我的DRL文件是这样的。此外,我还定义了一个与准备时间之前到达相关的硬约束。我的解算器配置如下,但终止标记不同: 这是问题陈述: 我有2辆车,容量为10件物品和1个仓库。 这是解决方案(客户按车辆分组,按到达时间排序): (D=需求,Ar.T=到达时间,上一个D=与上一个位置的距离

  • 问题 你想创建类变量和实例变量(属性)。 解决方案 类变量 class Zoo @MAX_ANIMALS: 50 MAX_ZOOKEEPERS: 3 helpfulInfo: => "Zoos may contain a maximum of #{@constructor.MAX_ANIMALS} animals and #{@MAX_ZOOKEEPERS} zoo keep