2017-01-19 29 views
2

我目前使用移位表進行移動排序。使用迭代加深搜索,我將前一次迭代的極小極大值存儲爲下一次迭代的次序移動。這很好,很好。關於移位表的困惑(國際象棋程序設計)

這裏是我的困惑:

如果我發現我的換位表中的某個位置,然後我用移動訂購先前計算的得分(從迭代深化以前的迭代)。然而,如果這個位置的分數被更新(在返回minimax之後),並且該位置在另一個子樹中被重新找到(迭代加深的相同迭代) - 我不想只用它來移動排序...我應該能夠返回該值,因爲現在已經計算了該迭代的值並且是絕對的。

我的問題是:是不是標準有兩個換位表?一個用於前一次迭代,另一個用於迭代加深的當前迭代。所以我會首先檢查當前迭代的表格,看看最小值是否已經計算好,然後簡單地返回這個值。如果它不在此表中,我將使用該表作爲前一次迭代,以進行移動排序。如果兩者都不是,那麼這是我在這次搜索中從未見過的新職位。

是這種思路正確的,或者是有一個更有效的方法?

+0

這個問題將是過於寬泛/意見。我會說這是值得嘗試使用兩個。如果它幫助你在更短的時間內獲得更多的成就,那麼它就是肉汁。如果它沒有,然後拋它。曾經是國際象棋程序員的新聞組。也許試着追蹤下來並在那裏詢問。這只是不適合這類問題的地方。 –

+0

感謝您的快速回復。 – SethCS

回答

1

我@Dennis_Soemers同意。您應該保存深度,甚至可以將alpha/beta界限添加到轉置表中。不,你不應該需要兩張桌子。

讓我們來看看桌上的乾貨源代碼。

https://github.com/official-stockfish/Stockfish/blob/master/src/tt.h

/// TTEntry struct is the 10 bytes transposition table entry, defined as below: 
/// 
/// key  16 bit 
/// move  16 bit 
/// value  16 bit 
/// eval value 16 bit 
/// generation 6 bit 
/// bound type 2 bit 
/// depth  8 bit 

該表的保存功能被定義爲:

void save(Key k, Value v, Bound b, Depth d, Move m, Value ev, uint8_t g) 

現在,如果你有兩個相同的位置,從深度和d-1d。你可以這樣做:

// My hash key is now position + depth 
Key my_hash_key = k + d 

您可以輕鬆地檢查之前的迭代和當前迭代:基於

Key previous_iter_key = my_position_key + d-1 
probe(previous_iter_key ...) 

Key current_iter_key = my_position_key + d 
probe(current_iter_key ...) 
2

通常你會希望不僅存儲在你表個態的,最後發現極大極小值,而且當你存儲在表中的狀態,你在反覆使用的深度限制。這樣,當您稍後查看錶格時,可以通過比較表格條目中存儲的深度限制與當前深度限制,來判斷它是在上一次迭代中還是在當前迭代中最後更新的。如果這些都是平等的,你知道表條目的最後更新在當前迭代,並且可以直接使用存儲在表中的值沒有任何多餘的搜索