2016-04-14 6 views
1

In einem Schritt von sagen wir lokale Suche OptaPlanner wertet N verschiedene Bewegungen aus, indem er die Bewegung ausführt und dann den UndoMove aufruft und dann am Ende die beste Bewegung von N auswertet. Gibt es eine Möglichkeit herauszufinden, wann der Zug ist und Wann ist das Rückgängigmachen?Wie unterscheidet man von undoMove?

+1

Wohin möchten Sie das herausfinden? Im Protokoll? In einer benutzerdefinierten Move-Implementierung? Im Debugger im Code? Und warum? –

+0

Ich wollte nur herausfinden, ist die Punktzahl neu berechnet jedes Mal, wenn die Rückgängigmachen in einem bestimmten Schritt gemacht wird. Natürlich wird es keinen Sinn machen, weil wir es am Anfang des Schritts berechnet haben und es wird überflüssig sein. Und ich habe auch benutzerdefinierte Variablenlistener für benutzerdefinierte Shadow-Variablen implementiert und ich wollte herausfinden, ob sie ausgelöst werden, wenn die UndoMove gemacht wird, um alles auf normal zurück zu bringen. Also, wie ich herausgefunden habe, wird der Punktestand nicht berechnet, wenn der UndoMove aufgerufen wird und die Variablenlistener wie normal ausgelöst werden und die Lösung auf den vorherigen Zustand setzen. –

+0

Gibt es also eine Möglichkeit herauszufinden, wann es sich um ein Move handelt und wann es ein undoMove ist? Ich muss das in den Variablenlistenern wissen, weil ich in ihnen Code habe, der herausfindet, welcher Wert für die Schattenvariable am besten ist. Ich weiß, das ist vielleicht nicht der beste Weg, aber es funktioniert für mich.So was ich brauche ist, wenn es eine Bewegung ist, um den Wert der Schatten-Variable (OLD VALUE) zu erinnern, berechnen Sie den neuen Wert, stellen Sie es und dann, wenn die UndoMove ist Der OLD VALUE wird aufgerufen. –

Antwort

1

Die Variablenlistener werden am Ende von undoMove ausgelöst (weil jede Bewegung ScoreDirector.triggerVariableListeners() ab 6.3 ausführen muss).

Standardmäßig wird der Punktestand nach dem Rückgängigmachen nicht neu berechnet (da dies vorhergesagt werden kann, ist es eine Verschwendung von Perfomance). Mit enviroment.Mode FAST/FULL_ASSERT ist es jedoch, aber nicht mit NON_INTRUSIVE_FULL_ASSERT. Natürlich sollten Sie diese nicht verwenden, um die Neuberechnung der Punkte nach dem Rückgängigmachen von Bewegungen zu erzwingen: Sie sollten sich niemals darauf verlassen, dass die Punktzahl nach dem Rückgängigmachen neu berechnet wird.

Verwandte Themen