2015-04-16 17 views
5

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).

+0

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). –

+0

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). –

Antwort

0

Es war der Fehler bei der Implementierung. Seien Sie bei der Implementierung des inkrementellen Score-Kalkulators genau (oder versuchen Sie, Drools zu verwenden).

0

„Wenn eine Lösung ändert, inkrementelle Score-Berechnung (AKA Delta basierte Score-Berechnung), wird das Delta mit dem vorherigen Zustand berechnet die neuen Score zu finden, anstatt die gesamte Partitur bei jeder Lösung Auswertung neu berechnet wird.

Wenn sich zum Beispiel eine einzelne Dame A von Reihe 1 zu 2 bewegt, wird es sich nicht darum kümmern, ob Dame B und C sich gegenseitig angreifen können, da sich keiner von ihnen verändert hat. "

enter image description here

Score Korruption passiert, wenn die inkrementelle Partitur und die realen Score (= unverfälscht score) out of sync bekommen.

Es kann mehrere Ursachen geben. Es könnte sogar ein Fehler in Drools sein, wenn Sie Drools Score-Berechnung verwenden. Wenn Sie es isolieren und eine Jira mit einem Reproduzenten ablegen können, dann geben wir es normalerweise schnell an.

Isolationsmittel (in dieser Reihenfolge!):

  1. entfernen Sie alle Punktzahl Regeln, die nicht benötigt werden, um es zu reproduzieren
  2. alle Planungseinheiten entfernen, die nicht benötigt werden, um es zu reproduzieren
  3. entfernen alle Schritte, die nicht benötigt werden, um es zu reproduzieren. Siehe Termination.stepCountLimit, um die Lösung zu speichern, bevor sie schief geht, und dann ausgehend von dieser Lösung zu lösen
  4. (optional) Entfernen Sie alle Bewegungen, die für die Reproduktion nicht erforderlich sind. Aktivieren Sie das Ablaufverfolgungsprotokoll. Ohne hacking optaplanner ist das schwer zu machen, also machen wir normalerweise diesen Schritt.
+0

Ich benutze einen einfachen Java-Score-Rechner anstelle von Drools und leider ist dieser Code hoch gekoppelt. Nach logs, optaplanner Klont ursprüngliche Lösung S0 bis S1, dann nach mehreren Schritten auf S0 logische führen zu Ausgangslösung, die (zB Wechsel bewegt ein <=> B, B <=> A, A <=> C, C <=> A) es überprüft Äquivalenz-Score (S0) = Punktzahl (S1). Solch eq, natürlich, gilt in meinem Fall, aber Punktzahl Instanzen ist anders, obwohl ich einfachen Code für die Erstellung von Punkten verwenden: 'zurück BendableScore.valueOf (neue int [] {anforderungGapsScore, timelineGapsScore}, neue int [] {prioritiesScore, timelineVersionsScore}); ' – injecto

+0

Mit' EasyJavaScoreCalculator' ist eine Beschädigung der Punkte unmöglich. Ich nehme an, Sie verwenden 'IncrementalJavaScoreCalculator'? Gut zu hören, dass es kein Fehler in Drools ist :) –

+0

In der Beispielimplementierung von NQueens werden B und C im Sandwish-Fall als einander angreifend betrachtet. Aber selbst mit der Sandwisch-nicht-Angriffs-Anforderung können Sie eine Delta-Berechnung durchführen, um besser skalieren zu können, indem Sie auch die Sandwisch-Zustände verfolgen. –