OptaPlanner 无限期地重复最后一步

OptaPlanner repeat last move indefinitely

我使用 OptaPlanner 7.56 实现了类似于 CloudBalancing 的算法。

实际上,我使用的是 ChangeMoveSelector,我在某些条件下对其进行了过滤,并且效果很好。当没有可用的移动时它停止并且 return 最好的解决方案。

<localSearch>
    <changeMoveSelector>
        <selectionOrder>ORIGINAL</selectionOrder>
        <filterClass>...</filterClass>
    </changeMoveSelector>

    <acceptor>
        <acceptorType>HILL_CLIMBING</acceptorType>
    </acceptor>
    <forager>
        <pickEarlyType>NEVER</pickEarlyType>
        <acceptedCountLimit>1000</acceptedCountLimit>
    </forager>
</localSearch>

但我尝试添加一个具有类似过滤器的 PillarChangeMove,在检查了所有可能的移动之后,它无限期地重复最后一个移动,并且在某些时候我收到以下警告 Bailing out of neverEnding selector

<unionMoveSelector>
    <changeMoveSelector>
        <selectionOrder>ORIGINAL</selectionOrder>
        <filterClass>...</filterClass>
    </changeMoveSelector>
        
    <pillarChangeMoveSelector>
        <filterClass>...</filterClass>
        <subPillarType>NONE</subPillarType>
    </pillarChangeMoveSelector>
</unionMoveSelector>

我记得我在实施 ChangeMoveSelector 时遇到了同样的问题。 我通过添加 <selectionOrder>ORIGINAL</selectionOrder>

来修复
<unionMoveSelector>
    <changeMoveSelector>
        <selectionOrder>ORIGINAL</selectionOrder>
        <filterClass>...</filterClass>
    </changeMoveSelector>

    <pillarChangeMoveSelector>
        <selectionOrder>ORIGINAL</selectionOrder>
        <filterClass>...</filterClass>
        <subPillarType>NONE</subPillarType>
    </pillarChangeMoveSelector>
</unionMoveSelector>