Ich benutze inkrementelle Score-Rechner für mein Modell. Nach mehreren Stunden/Tage der Optimierung in "full assert" Modus Score Korruption Ausnahme geworfen:OptaPlanner mythische Punktzahl Korruption
java.lang.IllegalStateException: Score corruption: the workingScore (-86591/-2765/-422/-591) is not the uncorruptedScore (-86591/-2873/-422/-591) after completedAction [...]:
Uncorrupted: Score calculator 3718238 [schedule=Schedule6422-2015-04-16T09:47:36.932[-86591/-2873/-422/-591], prioritiesScore=-422, timelineGapsScore=-2873, requirementGapsScore=-86591, timelineVersionsScore=-591]
Corrupted: Score calculator 3717237 [schedule=Schedule6422-2015-04-16T09:47:36.932[-86591/-2873/-422/-591], prioritiesScore=-422, timelineGapsScore=-2873, requirementGapsScore=-86591, timelineVersionsScore=-591]
dass Partituren unterscheidet sich in Parameter timelineGapsScore
. Die Score-Instanz wird aus den Objektfeldern prioritiesScore
, timelineGapsScore
, requirementGapsScore
und timelineVersionsScore
erstellt. Logarithmisch sind die Instanzen beider Bewertungen in diesen Feldern gleichwertig, aber die Unterschiede zwischen den Optaplaner-Maschinen finden sich in (-86591/-2765/-422/-591) vs (-86591/-2873/-422/-591) . Wie ist es möglich?
Ich vermute, dass Referenzen Lecks beim Klonen von Lösungen (es ist spezifische Implementierung und tiefes Kopieren), aber sorgfältige Code-Check zeigt solche Fehler nicht.
UPD: Ich habe vergessen zu erwähnen: optaplanner läuft im Daemon-Modus, Modell ist in der Lage, Fakten in Echtzeit zu ändern. Also habe ich Verdacht auf Rennbedingungen im Modell. Aber ich weiß nicht, wie Änderungen Einspritzung unter Haube von optaplanner realisierte (es ist nicht genug Info in docs).
Race-Bedingungen sind nicht möglich, solange Sie 'addProblemFactChange()' verwenden, um das Modell im Solver zu ändern (da dieser Callback im Solver-Thread ausgeführt wird). –
Beachten Sie, dass 'addProblemFactChange()' in der Tat schwierig sein kann.Es erfordert oft einen tieferen Klon als nur einen Planungsklon. Um beispielsweise im CB-Beispiel einen neuen Computer hinzuzufügen, muss die Computerliste geklont werden (was in einem Planungsklon nicht der Fall ist). –