Search code examples
optaplanneroptaweb-vehicle-routing

Why is ScoreManager changing the solution to a worse score?


I'm using solverManager to continually save the best score:

solverManager.solveAndListen(
            SINGLETON_TIME_TABLE_ID,
            this::findById,
            this::save
        )

My save() method just updates a global reference to the best solution and nothing else happens to it.

However, when I go to retrieve the best solution and get the score details, it does not always get the best solution:

val solution: MySolution = findById(SINGLETON_TIME_TABLE_ID)

println(solution.score) // prints 1100

scoreManager.updateScore(solution) // Sets the score

println(solution.score) // prints 1020 (it's now worse than before)

Simply calling scoreManager.updateScore(solution) seems to bring back a worse solution. In the above example, the score might go from 1100 down to 1020. Is there an obvious explanation for this?

I'm using SimpleScore and this happens well after all planning variables are assigned.

I'm using a variable listener ArrivalTimeUpdatingVariableListener : VariableListener.

Not sure what else is relevant. Thanks


Solution

  • This has all warning signs of a score corruption. Please run your solver for a couple minutes with <environmentMode>FULL_ASSERT</environmentMode>. If you'll see exceptions being thrown, you know that your constraints have a bug in them. What that bug is, that is impossible for me to know unless I see those constraints.