2016-04-14 46 views
1

讓我們說本地搜索的一個步驟OptaPlanner通過執行移動然後調用撤消移動來評估N個不同的移動,然後在最後從N中評估最佳移動。是否有一種方法可以找出移動的時間和何時撤消移動?如何區分移動和撤消移動?

+1

你想在哪裏找到那個?在日誌中?在自定義移動實現中?在代碼中的調試器?爲什麼? –

+0

我只是想找出每次在給定步驟中進行撤消移動時重新計算的分數。當然,它將不會有意義,因爲我們已經在步驟開始時計算了它,並且它將是多餘的。而且我還爲自定義影子變量實現了自定義變量偵聽器,並且我想知道當使用undoMove將所有事情恢復正常時它們是否被觸發。所以當我發現調用undoMove並且變量偵聽器被正常觸發並將解決方案設置爲之前的狀態時,計算得分不會被計算出來。 –

+0

那麼有沒有辦法找出它是什麼時候的移動,什麼時候它是一個撤銷移動?我需要在variableListeners中知道這一點,因爲在這些變量中,我有一些代碼可以找出目前分配的影子變量的最佳值。我知道這可能不是最好的方法,但它適用於我。因此,我需要的是當它移動時記住陰影變量(OLD VALUE)的值,計算新值,設置它,然後當撤消移動時稱爲舊記憶的舊值將被檢索。 –

回答

1

變量偵聽器在撤消移動的末尾觸發(因爲每次移動必須從6.3開始執行ScoreDirector.triggerVariableListeners())。

默認情況下,撤消移動後不會重新計算得分(因爲它可以預測,所以這是浪費性能)。但是,使用enviromnentMode FAST/FULL_ASSERT時,它不是NON_INTRUSIVE_FULL_ASSERT。當然,你不應該使用這些來撤銷移動後強制重新計算分數:你不應該依靠撤消移動後重新計算的分數。