現在、チェスエンジンに転置テーブルを追加していますが、ゾブリストキーの増分更新で問題が発生しています。私はいくつかの調査を行い、基本的なアイデアを実装しましたが、期待どおりに動作していません。私が遭遇した問題は、同等のボード位置が常に同じキーを持っているとは限らないということでした。たとえば、開始位置で、両方のプレイヤーが騎士を動かしてから元に戻した場合、キーは開始位置のキーとは異なります。ただし、これを再度実行して(騎士を移動して)開始位置に戻ると、元のキーになります。したがって、このようなシーケンスの期間は、プレーヤーごとに4ムーブであるように見えますが、2ムーブである必要があります。
誰かがそのような問題に遭遇したか、解決策を考えることができますか?make/unmakeメソッドの関連部分を含めました。サイドツームーブ、キャスリングの権利などは含まれていません。それらは私が提起した特定のケースに影響を与えるべきではありません。HashValueはランダムな値を格納します。最初のインデックスはピースタイプで、2番目は正方形です。
void Make(Move m) {
ZobristKey ^= HashValue[Piece[m.From].Type][m.From];
ZobristKey ^= HashValue[Piece[m.From].Type][m.To];
ZobristKey ^= HashValue[Piece[m.To].Type][m.To];
//rest of make move
}
void Unmake(Move m) {
ZobristKey ^= HashValue[m.Captured.Type][m.To];
ZobristKey ^= HashValue[Element[m.To].Type][m.To];
ZobristKey ^= HashValue[Element[m.To].Type][m.From];
//rest of unmake
}