Actualmente estoy depurando mi tabla de transposición para un motor de variante de ajedrez donde las piezas se pueden colocar (es decir, originalmente no en el tablero). Necesito saber con qué frecuencia estoy golpeando colisiones clave. Estoy guardando la lista de piezas en cada índice de tabla, junto con los datos hash habituales. Mi solución simple para determinar si dos posiciones son iguales está fallando en las transposiciones porque estoy comparando linealmente las listas de dos piezas.Determinar si dos posiciones de ajedrez son iguales
Por favor, no sugiera que deba ser almacenado por centrado en la placa en lugar de centrado en la pieza. Tengo que guardar la lista de piezas debido a la naturaleza única de las piezas aplacables y capturadas. Las piezas en esos estados son como si estuvieran ocupando una ubicación superpuesta y sin posición. Mire la descripción de cómo se almacenan las piezas.
// [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];
A transposición ocurre cuando las piezas se mueven en un orden diferente, pero el resultado final es el mismo posición del tablero. Por ejemplo las siguientes posiciones son iguales:
1) first rook on A1; second rook on D7
2) first rook on D7; second rook on A1
La siguiente es una no optimizado algoritmo general; y el bucle interno es similar a otro general problem, pero con la restricción adicional de que los valores en 0-63 solo ocurrirán una vez (es decir, solo una pieza por casilla).
for each color:
for each piece type:
are all pieces in the same position, disregarding transpositions?
La siguiente comparación no no funciona debido a transposiciones. Lo que necesito es una forma de detectar las transposiciones como iguales y solo informar posiciones realmente diferentes.
bool operator==(const Position &b)
{
for (int i = 0; i < 32; i++)
if (piece[i] != b.piece[i])
return false;
return true;
}
Rendimiento/memoria es una consideración porque la tabla recibe más golpes 100K (donde las claves son iguales) por turno y una mesa típica tiene 1 millón de artículos. De ahora en adelante, estoy buscando algo más rápido que copiar y ordenar las listas.
Esta respuesta no resuelve completamente el problema. (Creo que puede ampliarse para hacerlo sin muchos problemas, pero en la actualidad no da cuenta de la diferencia entre las piezas que son "colocables" contra las piezas que están "muertas" ...) – psmears