如何在本地搜索阶段使用规划实体难度?

时间:2014-08-04 12:21:23

标签: optaplanner

我试图在规划实体中对本地搜索阶段的难度降低进行排序。 我试图添加" entitySelector"在配置文件中,如下所示,但它导致ConversionException:

 <localSearch>

      <termination>
            <maximumUnimprovedStepCount>500</maximumUnimprovedStepCount>   
      </termination>

   <moveListFactory>
        <cacheType>PHASE</cacheType> <!-- STEP, PHASE -->
        <selectionOrder>RANDOM</selectionOrder>
         <moveListFactoryClass>com.abcdl.be.solver.move.factory.ParentChangeMoveFactory</moveListFactoryClass>

    <entitySelector> 
        <cacheType>PHASE</cacheType> 
        <selectionOrder>SORTED</selectionOrder> 
        <sorterManner>DECREASING_DIFFICULTY</sorterManner>
    </entitySelector>
</moveListFactory>

    <acceptor>
      <lateAcceptanceSize>400</lateAcceptanceSize>
     <entityTabuSize>5</entityTabuSize> 
    </acceptor>
    <forager>
        <pickEarlyType>NEVER</pickEarlyType> <!-- FIRST_BEST_SCORE_IMPROVING -->
        <acceptedCountLimit>3</acceptedCountLimit>
    </forager>

  </localSearch>

以下Comparator类在域模型上注释:

public class NodeDifficultyComparator implements Comparator<Node>{

    public int compare(Node a, Node b) {
        return new CompareToBuilder()
                .append(a.getResources(), b.getResources()) // the most difficult nodes are the ones who use the most resources
                .append(a.getId(), b.getId())
                .toComparison();
    }

}

我是否为&#34; entitySelector&#34;选择了错误的展示位置?标签 ?我应该用另一种方式吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

实施细节:元素<moveListFactory>由类MoveListFactoryConfig定义。如果查看该类的来源,它没有名为entitySelector的字段,因此您无法在其中嵌套<entitySelector>元素。

有两种方法可以解决您的问题:

  • 不使用<moveListFactory>,而是使用支持<changeMoveSelector>元素的<entitySelector>。然后,您可以删除自定义的ParentChangeMoveFactory课程。 <changeMoveSelector>与自定义MoveListFactory相比具有许多优势,例如JIT支持等等。

  • 如果您有充分的理由拥有自定义的MoveListFactory(例如由于移动过滤无法覆盖的一些复杂原因),请调整您的ParentChangeMoveFactory以对实体列表进行排序产生动作。请记住首先列出浅列表,因为您不希望排序影响workingSolution实例的实体列表引用。重点是:如果你编写一个自定义的MoveListFactory,你可以完全控制如何生成移动,但你需要自己做所有事情......