Search code examples
optaplanner

How to set a phase termination to maximum Unimproved Step Count?


I want to use the maximumUnimprovedStepCount termination criterion for a local search phase.

The unmarshalling of solverConfigResource fails with the error

No such field org.optaplanner.core.config.solver.termination.TerminationConfig.maximumUnimprovedStepCount

The doc says that this termination does not work for the solver, only for a phase, so I am guessing that the correct resource should be org. ... .config.termination. ... (without solver in the middle).

But why isn't it getting the right class directly?

This is my minimal solver conf:

<solver>
    <scanAnnotatedClasses/>

    <scoreDirectorFactory>
        <scoreDefinitionType>HARD_SOFT</scoreDefinitionType>
        <scoreDrl>solver/rules.drl</scoreDrl>
    </scoreDirectorFactory>

    <constructionHeuristic>
        <constructionHeuristicType>FIRST_FIT_DECREASING</constructionHeuristicType>
    </constructionHeuristic>

    <termination>
        <secondsSpentLimit>60</secondsSpentLimit>
    </termination>

    <localSearch>
        <termination>
            <maximumUnimprovedStepCount>100</maximumUnimprovedStepCount>
        </termination>
    </localSearch>

</solver>

Solution

  • Because it's called <unimprovedStepCountLimit> now, see TerminationConfig.java:

    <solver>
      ...
      <localSearch>
        <termination>
          <unimprovedStepCountLimit>...</>
        </>
      </>
    </>
    

    IIRC it got renamed before the public API & config of 6.1 was finished.