cprudhom/Galak — Issue #55: Fix bug with restarts
Author: jgFages
Created: 2012-01-30 13:03:11+00:00
State: open

Un petit bug pouvait se produire avec l'utilisation de restart en optimisation:
- Le solver trouve une bonne solution
- Il fait un restart (retour au noeud root)
- Il pose sa cut (-1 sur l'objectif en minimisation, pour chercher mieux...)
- Il propage
- Il lance la search (OPEN NODE si aucune limite atteinte, CLOSE sinon)

Le problème est que si une limite (temps) est atteinte à ce moment là, le solver ne pourra pas restaurer la meilleure solution, en effet la search loop étant déjà au noeud root les domaines ne sont pas restaurés correctement et la cut rend irréalisable la meilleure solution.

Contre cela Charles à trouvé un patch: il faut faire un world push à chaque restart avant de propager la cut:

public final void restartSearch() {
restaureRootNode();
try {
objectivemanager.postDynamicCut();
propEngine.propagate();
nextState = OPEN_NODE;
} catch (ContradictionException e) {
interrupt();
}
}

devient

public final void restartSearch() {
restaureRootNode();
solver.getEnvironment().worldPush();
try {
objectivemanager.postDynamicCut();
propEngine.propagate();
nextState = OPEN_NODE;
} catch (ContradictionException e) {
interrupt();
}
}