我正在与Optaplanner合作解决类似于患者入院计划示例的问题。
我面临两个问题。
首先,当其中一个计划实体(类似于示例的bedDesignation)由某人(不是optaplanner)定位时,此计划实体的得分与其他实体一样。 手动放置的计划实体成为不可移动的计划实体,但仍然像可移动计划实体一样进行评分。因此,它打破了一些严格的约束。
其次,当其中一个计划实体(类似于bedDesignation)由某人(不是optaplanner)定位时,该计划实体在本地搜索阶段移动。 本地搜索阶段配置如下(与示例相同的配置):
<localSearch>
<unionMoveSelector>
<moveListFactory>
<moveListFactoryClass>org.optaplanner.examples.pas.solver.move.factory.BedDesignationPillarPartSwapMoveFactory</moveListFactoryClass>
</moveListFactory>
</unionMoveSelector>
<acceptor>
<entityTabuSize>7</entityTabuSize>
</acceptor>
<forager>
<acceptedCountLimit>1000</acceptedCountLimit>
</forager>
</localSearch>
BedDesignationPillarPartSwapMoveFactory类与示例相同。 我在文档中读到,对于不可移动的计划实体,我们必须确保自定义moveListFactory不会移动不可移动的实体。但是怎么样?在config xml文件中还是在类本身中?
感谢您的帮助。
答案 0 :(得分:1)
调整BedDesignationPillarPartSwapMoveFactory
以跳过不可移动的实体(BedDesignations
)(例如,如果它们是isLocked() == true
)。
或者更好的是:根本不使用BedDesignationPillarPartSwapMoveFactory,只需使用通用移动选择器:changeMove,swapMove,pillarChangeMove和pillarSwapMove。支柱移动现在选择6.2中的子支柱,但我还没有测试过,如果这个例子给出了更好的结果(我相信它会) - 这可能会使定制移动工厂过时。