2012-04-08 15 views
1

現在チェスエンジンに転置テーブルを追加していますが、Zobristキーを段階的に更新する際に問題があります。私はdid some researchと基本的なアイデアを実装しましたが、期待通りに動作していません。私が遭遇した問題は、同等のボードポジションが常に同じキーを持つわけではないということでした。たとえば、開始位置で、両方のプレイヤーがちょうどナイトを移動してから戻した場合、キーは開始位置のキーとは異なります。しかし、これをもう一度(騎士を動かして)開始位置に戻すと、は元のキーになります。だから、そのようなシークエンスの期間は各プレイヤーのための4つの動き、それはちょうど2でなければならないようだ。Zobrist Hashingを正しく実装する

誰かがこのような問題に遭遇したか解決策を考えることができますか?私は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 
} 
+1

通常、makeとunmakeは同じにする必要があります。 (XORは対称です)ハッシュは動きを反映するのではなく、ボード上の部分を反映します。ピースをキャプチャする:=その値をハッシュから削除する。部分を移動する:=ハッシュから前の位置を削除する+新しい位置をハッシュに追加する。 (キャスルとエンパス状態はちょっと違います) – wildplasser

+0

はい、私はそれが私のコードと同じだと信じています。残りのmake/unmakeコードも考慮に入れなければならないので、「to」と「from」の四角が変わるのはそのためです。 makeメソッドで "from"にあった部分は、もはやunmakeメソッドには存在しません。 –

+0

いいえ、Make()コードには2つのコンポーネントしかありません.1つは古いポーションからピースを削除するコード、もう1つは新しいポシジョンに追加するコードです。 (そしておそらくキャプチャされたピースを取り除くための余分なコンポーネント) – wildplasser

答えて

2
Make_a_move() { 
    hashval ^= Zobrist_array[oldpos][piece]; 
    hashval ^= Zobrist_array[newpos][piece]; 
    /* if there is a capture */ 
    hashval ^= Zobrist_array[otherpos][otherpiece]; 
    } 

Undo_a_move() { 
    hashval ^= Zobrist_array[oldpos][piece]; 
    hashval ^= Zobrist_array[newpos][piece]; 
    /* if there was a capture */ 
    hashval ^= Zobrist_array[otherpos][otherpiece]; 
    } 

キャスリングは

プロモーション(2又は7の位置から)ボードからポーンを除去するように処理することができる(明らかに、捕捉せず)は、2つの移動の和として見ることができ新しいピースを追加する(1または8の位置)

関連する問題