Este repositorio contiene la implementación del motor de ajedrez utilizando Minimax , poda Alfa-Beta y algoritmo de búsqueda de inactividad . El cuaderno Jupyter dentro de un contenedor Docker se utiliza para codificar. Todos los Jupyter Notebook también están disponibles en forma de imagen acoplable.
Consulte el documento del proyecto para ver un análisis detallado.
docker pull codewithnk/chess-engine-using-python:latest
docker run -p 8888:8888 -v $( pwd ) codewithnk/chess-engine-using-python:latest
El núcleo del ajedrez es jugar al ajedrez en minmax. Minmax suele asociar la pieza negra con MAX y la pieza blanca con MIN, y siempre evalúa desde el punto de vista blanco.
El algoritmo Minmax es un algoritmo de búsqueda adversario en teoría de juegos. Utiliza un árbol de juegos e incluye MIN y MAX para dos jugadores. Ambos jugadores intentan anular la acción del otro. Max intenta maximizar el resultado mientras que MIN intenta minimizarlo. Ambos jugadores juegan alternativamente, bajo el supuesto de que ambos juegan de manera óptima. Juego óptimo significa que ambos jugadores juegan según la regla, es decir, MIN minimiza el resultado y MAX maximiza el resultado.
El algoritmo minmax utiliza el enfoque de búsqueda en profundidad para encontrar el resultado. Además, también utiliza retroceso y recursividad. El algoritmo atravesará hasta el nodo terminal y luego retrocederá mientras compara todos los valores secundarios. Seleccionará el valor mínimo o máximo, según a quién le toque. Luego propagará el valor a su padre. Utiliza una función de evaluación estática para determinar el valor en cada nodo hoja. Aprovecha el juego de suma cero.
Motor de ajedrez usando Minmax
Minmax utiliza Depth First Search (DFS) en Game Tree, por lo que la complejidad temporal del algoritmo minmax es O(b**m) , donde b es el factor de ramificación del árbol de juegos y m es la profundidad máxima del árbol.
La complejidad espacial del algoritmo minmax también es similar a DFS, que es O(bm) , donde b es el factor de ramificación del árbol del juego y m es la profundidad máxima del árbol.
El algoritmo Minmax está completo. Definitivamente encontrará una solución, si existe, en el árbol de búsqueda finito.
El algoritmo Minmax es óptimo si ambos oponentes juegan de manera óptima.
El algoritmo minmax se puede optimizar podando algunas ramas. Las ramas podadas son las que no van a afectar el resultado. Mejorará la complejidad del tiempo. Esta versión minmax se conoce como minmax con poda alfa-beta. También se le llama algoritmo alfa-beta.
En la poda Alfa-Beta, hay dos valores, Alfa y Beta. A continuación se detallan algunos puntos a considerar sobre alfa y beta:
Mientras que el retroceso solo se pasa el valor del nodo al padre, no el valor alfa y beta.
La condición para la poda alfa-beta:
α >= β
La eficacia del algoritmo alfa-beta depende en gran medida del orden de recorrido. Desempeña un papel crucial en la complejidad del tiempo y el espacio.
En algunos casos, no se elimina ningún nodo o subárbol del Game Tree. En este caso, el mejor movimiento ocurre en el subárbol derecho del árbol de juego. Esto dará como resultado una mayor complejidad del tiempo.
En este caso, se poda el número máximo de nodos y subárboles. Los mejores movimientos ocurren en el subárbol izquierdo. Reducirá la complejidad del tiempo y el espacio.
Motor de ajedrez que utiliza poda alfa-beta
El algoritmo Alpha Beta también utiliza la búsqueda en profundidad (DFS) en el árbol de juegos.
El algoritmo Alfa-Beta está completo. Definitivamente encontrará una solución, si existe, en el árbol de búsqueda finito.
El algoritmo Alfa-Beta es óptimo si ambos oponentes juegan de manera óptima.
Quiescencia Search es una modificación además de la poda alfa-beta con min-max. Quiescencia significa silencio. Esta búsqueda sólo evalúa movimientos silenciosos. En otras palabras, después de cierta profundidad, solo usa movimientos de captura para calcular los siguientes movimientos. Una búsqueda de quietud puede evitar el efecto horizonte.
El efecto horizonte se produce cuando sólo buscamos hasta una determinada profundidad, pero puede suceder que si miramos un nivel más de profundidad, entonces movernos pueda sumar menos puntos. Una búsqueda de inactividad sólo utiliza movimientos de captura para evitar esto. La búsqueda de inactividad también reduce el factor de ramificación en diferentes niveles, lo que da como resultado un algoritmo rápido.
El algoritmo de búsqueda de inactividad también utiliza la búsqueda en profundidad (DFS) en el árbol de juegos.
El algoritmo de búsqueda de inactividad está completo. Definitivamente encontrará una solución, si existe, en el árbol de búsqueda finito.
El algoritmo de búsqueda de quietud es óptimo si ambos oponentes juegan de manera óptima.