我试图在规划实体中对本地搜索阶段的难度降低进行排序。 我试图添加" 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;选择了错误的展示位置?标签 ?我应该用另一种方式吗?
感谢您的帮助。
答案 0 :(得分:2)
实施细节:元素<moveListFactory>
由类MoveListFactoryConfig
定义。如果查看该类的来源,它没有名为entitySelector
的字段,因此您无法在其中嵌套<entitySelector>
元素。
有两种方法可以解决您的问题:
不使用<moveListFactory>
,而是使用支持<changeMoveSelector>
元素的<entitySelector>
。然后,您可以删除自定义的ParentChangeMoveFactory
课程。 <changeMoveSelector>
与自定义MoveListFactory相比具有许多优势,例如JIT支持等等。
如果您有充分的理由拥有自定义的MoveListFactory(例如由于移动过滤无法覆盖的一些复杂原因),请调整您的ParentChangeMoveFactory
以对实体列表进行排序产生动作。请记住首先列出浅列表,因为您不希望排序影响workingSolution实例的实体列表引用。重点是:如果你编写一个自定义的MoveListFactory,你可以完全控制如何生成移动,但你需要自己做所有事情......