私は現在、駒を配置できる(つまり、元々ボード上にない)チェスバリアントエンジンの転置テーブルをデバッグしています。キーの衝突が発生する頻度を知る必要があります。通常のハッシュデータとともに、各テーブルインデックスにピースリストを保存しています。2つのピースのリストを線形に比較しているため、2つの位置が等しいかどうかを判断するための簡単な解決策は、転置に失敗することです。
ピースセントリックではなくボードセントリックで保管することを提案しないでください。配置可能でキャプチャされたピースのユニークな性質のため、ピースリストを保存する必要があります。これらの州の作品は、重なり合って位置のない場所を占めているようなものです。ピースの保管方法の説明をご覧ください。
// [Piece List]
//
// Contents: The location of the pieces.
// Values 0-63 are board indexes; -2 is dead; -1 is placeable
// Structure: Black pieces are at indexes 0-15
// White pieces are at indexes 16-31
// Within each set of colors the pieces are arranged as following:
// 8 Pawns, 2 Knights, 2 Bishops, 2 Rooks, 1 Queen, 1 King
// Example: piece[15] = 6 means the black king is on board index 6
// piece[29] = -2 means the white rook is dead
char piece[32];
移調は、ピースが異なる順序で移動されたときに発生しますが、最終的には同じボード位置になります。たとえば、次の位置は同じです。
1) first rook on A1; second rook on D7
2) first rook on D7; second rook on A1
以下は、最適化されていない一般的なアルゴリズムです。内側のループは別の一般的な問題に似ていますが、0〜63の値が1回だけ発生するという制限が追加されています(つまり、正方形ごとに1つだけ)。
for each color:
for each piece type:
are all pieces in the same position, disregarding transpositions?
次の比較は、転置のために機能しません。私が必要としているのは、転置を等しいものとして検出し、実際には異なる位置のみを報告する方法です。
bool operator==(const Position &b)
{
for (int i = 0; i < 32; i++)
if (piece[i] != b.piece[i])
return false;
return true;
}
テーブルは1ターンあたり100Kヒット(キーが等しい場合)を超え、通常のテーブルには100万のアイテムがあるため、パフォーマンス/メモリが考慮されます。今後は、リストをコピーして並べ替えるよりも速いものを探しています。