2016-04-14 12 views
1

ローカル検索OptaPlannerでは、移動を実行してからundoMoveを呼び出し、最後にNが評価された場所から最適な移動を行うことでN個の異なる移動を評価します。いつundoMoveですか?undoMoveからの移動を区別する方法は?

+1

あなたはそれをどこから探したいですか?ログに?カスタム移動の実装では?コード内のデバッガで?なぜ? –

+0

私は、undoMoveが与えられたステップで作られるたびに再計算されたスコアであることを知りたかっただけです。もちろん、ステップの始めに計算して冗長になるので意味がありません。また、カスタムのシャドウ変数用にカスタム変数リスナーを実装しています。undoMoveを使用してすべてを正常に戻すときにトリガーされるかどうかを調べる必要がありました。だから私は、undoMoveが呼び出され、変数リスナーが正常にトリガされ、ソリューションを以前の状態に設定したときにスコアが計算されないことがわかった。 –

+0

それは、それがMoveであるときと、それがundoMoveであるときを見つける方法はありますか?私はvariableListenersでこれを知る必要があります。なぜなら、瞬時に割り当てられるシャドウ変数の値が何であるかを調べるコードがあるからです。私はこれが最良の方法ではないかもしれないが、それは私のために働くことがわかっています。私が必要なのは、そのMoveがshadow変数(OLD VALUE)の値を覚えて、新しい値を計算し、記憶されているOLD VALUEと呼ばれるものが検索される。 –

答えて

1

変数リスナはundoMoveの終わりにトリガされます(すべての移動が6.3の時点でScoreDirector.triggerVariableListeners()を実行する必要があるため)。

デフォルトでは、undoMoveの後にスコアが再計算されません(予測可能なので、パフォーマンスの無駄です)。ただし、enviromnentMode FAST/FULL_ASSERTの場合はNON_INTRUSIVE_FULL_ASSERTでは使用できません。もちろん、アンドゥの移動後にスコアの再計算を強制するために使用するべきではありません。アンドゥの移動後にスコアを再計算することに決して頼るべきではありません。

関連する問題