Encriptacion

+Chess Bot

Junio 2025 Versión Access: 2007 - 2016

 

Una guía paso a paso para construir una IA de ajedrez simple



Por Lauri Hartikka
https://www.freecodecamp.org/news/simple-chess-ai-step-by-step-1d55a9266977

Traduccion Google translator


Exploremos algunos conceptos básicos que nos ayudarán a crear una IA de ajedrez sencilla:
• Generación de movimientos
• Evaluación de la Junta Directiva
• Minimax
• y poda alfa beta.


En cada paso, mejoraremos nuestro algoritmo con una de estas técnicas de programación de ajedrez probadas en el tiempo. Demostraré cómo cada uno afecta el estilo de juego del algoritmo.

Puedes ver el algoritmo final de IA aquí en GitHub.


Paso 1: Generación de movimientos y visualización de tableros.
Usaremos la biblioteca chess.js para la generación de movimientos y chessboard.js para visualizar el tablero. La biblioteca de generación de jugadas implementa básicamente todas las reglas del ajedrez. Basándonos en esto, podemos calcular todos los movimientos legales para un estado determinado del tablero.

generacion movimientos tablero ajedrez


Una visualización de la función de generación de movimientos. La posición inicial se utiliza como entrada y la salida son todos los movimientos posibles desde esa posición.


El uso de estas librerías nos ayudará a centrarnos solo en la tarea más interesante: crear el algoritmo que encuentre la mejor jugada.


Comenzaremos creando una función que simplemente devuelva un movimiento aleatorio de todos los movimientos posibles:


Aunque este algoritmo no es un ajedrecista muy sólido, es un buen punto de partida, ya que podemos jugar contra él:
_Black Juega movimientos aleatorios. Se puede reproducir en https://jsfiddle.net/lhartikk/m14epfwb/


 

Paso 2 : Evaluación de la posición
Ahora tratemos de entender qué lado es más fuerte en una determinada posición. La forma más sencilla de conseguirlo es contar la fuerza relativa de las piezas del tablero utilizando la siguiente tabla:

fuerza relativa piezas ajedrez

Con la función de evaluación, podemos crear un algoritmo que elija el movimiento que da la evaluación más alta:
La única mejora tangible es que nuestro algoritmo ahora capturará una pieza si puede.
_Black juega con la ayuda de la sencilla función de evaluación. Se puede reproducir en

https://jsfiddle.net/lhartikk/m5q6fgtb/1/

 


Paso 3: Árbol de búsqueda usando Minimax
A continuación, vamos a crear un árbol de búsqueda del que el algoritmo puede elegir la mejor jugada. Esto se hace mediante el algoritmo Minimax.


En este algoritmo, se explora el árbol recursivo de todos los movimientos posibles a una profundidad determinada, y la posición se evalúa en las "hojas" finales del árbol.


Después de eso, devolvemos el valor más pequeño o el más grande del nodo secundario al nodo principal, dependiendo de si es blanco o negro para mover. (Es decir, tratamos de minimizar o maximizar el resultado en cada nivel).

busqueda arbol minimax


Una visualización del algoritmo minimax en una posición artificial. La mejor jugada para las blancas es b2-c3, porque podemos garantizar que podemos llegar a una posición en la que la evaluación sea -50
Con minimax en su lugar, nuestro algoritmo está comenzando a comprender algunas tácticas básicas del ajedrez:
_Minimax con nivel de profundidad 2. Se puede reproducir en: https://jsfiddle.net/k96eoq0q/1

La efectividad del algoritmo minimax se basa en gran medida en la profundidad de búsqueda que podamos lograr. Esto es algo que mejoraremos en el siguiente paso.

 

Paso 4: Poda alfa-beta
La poda alfa-beta es un método de optimización del algoritmo minimax que nos permite descartar algunas ramas en el árbol de búsqueda. Esto nos ayuda a evaluar el árbol de búsqueda minimax mucho más profundo, mientras usamos los mismos recursos.


La poda alfa-beta se basa en la situación en la que podemos dejar de evaluar una parte del árbol de búsqueda si encontramos un movimiento que conduce a una situación peor que un movimiento descubierto anteriormente.


La poda alfa-beta no influye en el resultado del algoritmo minimax, solo lo hace más rápido.
El algoritmo alfa-beta también es más eficiente si visitamos primero aquellos caminos que conducen a buenos movimientos.


Las posiciones no necesitamos explorar si se utiliza la poda alfa-beta y se visita el árbol en el orden descrito.

poda alfa beta de ajedrez


Con alpha-beta, obtenemos un impulso significativo al algoritmo minimax, como se muestra en el siguiente ejemplo:

ejemplo alfa beta de ajedrez

 El número de posiciones que se requieren evaluar si queremos realizar una búsqueda con profundidad de 4 y la posición "raíz" es la que se muestra.
Siga este enlace para probar la versión mejorada alfa-beta de la IA de ajedrez.


Paso 5: Mejora de la función de evaluación
La función de evaluación inicial es bastante ingenua, ya que solo contamos el material que se encuentra en el tablero. Para mejorar esto, añadimos a la evaluación un factor que tiene en cuenta la posición de las piezas.

Por ejemplo, un caballo en el centro del tablero es mejor (porque tiene más opciones y, por lo tanto, es más activo) que un caballo en el borde del tablero.


Usaremos una versión ligeramente ajustada de las tablas de piezas cuadradas que se describen originalmente en la wiki de programación de ajedrez.

piezas ajustadas ajedrez


Las tablas cuadradas visualizadas. Podemos disminuir o aumentar la evaluación, dependiendo de la ubicación de la pieza.


Con la siguiente mejora, comenzamos a obtener un algoritmo que juega un ajedrez "decente", al menos desde el punto de vista de un jugador casual:
_Improved evaluación y poda alfa-beta con profundidad de búsqueda de 3.

Se puede reproducir en: https://jsfiddle.net/q76uzxwe/1


Conclusiones
La fuerza de incluso un simple algoritmo de juego de ajedrez es que no comete errores estúpidos. Dicho esto, todavía carece de comprensión estratégica.
Con los métodos que presenté aquí, hemos sido capaces de programar un algoritmo de juego de ajedrez que puede jugar al ajedrez básico. La "parte de IA" (excluida la generación de movimientos) del algoritmo final es de solo 200 líneas de código, lo que significa que los conceptos básicos son bastante simples de implementar. Puedes consultar la versión final en GitHub.


Algunas mejoras adicionales que podríamos hacer al algoritmo serían, por ejemplo:
• Ordenamiento de movimientos
• Generación de movimientos más rápida
• y la evaluación específica del final del juego.


Si quieres saber más, echa un vistazo a la wiki de programación de ajedrez. Es un recurso útil para explorar más allá de estos conceptos básicos que presenté aquí.


¡Gracias por leer!

 

 

[Atrás]