¿Qué paradigma usar para escribir el motor de ajedrez?

9

Si fuera a escribir un motor de juego de ajedrez, ¿qué paradigma de programación usaría (POO, de procedimiento, etc.) y por qué lo elegiría? Por motor de ajedrez, me refiero a la parte de un programa que evalúa el tablero actual y decide el próximo movimiento de la computadora.

Lo pregunto porque pensé que sería divertido escribir un motor de ajedrez. Entonces se me ocurrió que podría usarlo como un proyecto para aprender programación funcional. Entonces se me ocurrió que algunos problemas no se ajustan bien al paradigma funcional. Entonces se me ocurrió que este podría ser un buen tema de discusión.

dar un toque
fuente
1
Esto es similar a escribir un compilador de C desde cero. No reinventaría la rueda. Estudiaría los existentes primero.
Trabajo
10
@ Job: mi objetivo es el proceso más que el resultado. Incluso si termino con un motor muy malo, creo que podría ser valioso en el proceso de analizar el problema y desarrollar una forma de atacarlo, especialmente si aprendí algunos métodos de programación nuevos en el proceso.
meter
1
Buena suerte. Ningún empleador real le pedirá que desarrolle uno desde cero, pero durante una entrevista podrían preguntarle cómo atacaría el problema.
Trabajo
66
@Trabajar una gran parte de abrazar la vida de la programación es codificar cosas no porque haya una necesidad definitiva de ellas, sino porque puedes hacerlo.
1
@ Mark, ¿qué tal abrazar la vida;) = viajes, idiomas, teatro, poesía, aire libre, etc.? Me gusta programar, pero cuando no lo estoy haciendo per se, tengo otras 1000 cosas que hacer.
Trabajo

Respuestas:

7

Hasta donde yo sé, la evaluación no es un problema paralelo, pero evaluar diferentes cadenas lo es, por lo que definitivamente lo escribiría para hacer uso de múltiples núcleos y subprocesos múltiples.

Ya sea que vaya funcional o semi-funcional es cuestión de gustos. Personalmente, iría a OOP y usaría el soporte para programación funcional y paralelización que existe, por ejemplo, en C #

En una nota al margen, si tuviera que escribir un motor de ajedrez, trataría de hacer uno que realmente pueda "pensar" sobre el ajedrez. Utilizando la evaluación del tablero para la fuerza bruta, todas las combinaciones posibles se han hecho hasta la muerte y extremadamente bien, pero no ha habido mucho progreso para hacer un motor de ajedrez más reflexivo / difuso. ¡Eso sería un desafío! :)

Encuentra algunos juegos con un juego de posición realmente complicado y movimientos fuertes (¡están marcados! O !!) y úsalos para entrenar y probar tu motor.

Homde
fuente
2

Supongo que depende de tus objetivos, que considero son estrictamente didácticos. Si intentara escribir un producto competitivo, desearía la máxima eficiencia en los evaluadores de nivel más bajo. Muchas oportunidades para el paralelismo a nivel de bits aquí. También muchas oportunidades para tablas hash. También oportunidades para explotar el paralelismo. Luego, en los niveles superiores, es probable que desee un sistema bueno para la inteligencia artificial, lo que probablemente significa un lenguaje de programación funcional. Obviamente, no desea hacer todas estas cosas, elegir una o dos de ellas y contentarse con el hecho de que su proyecto no será competitivo con los mejores programas.

Omega Centauri
fuente
2

Elegí el paradigma OOP en mi motor de ajedrez llamado The Turk . La primera versión de mi motor de ajedrez fue escrita más procedimental que OOP. Entonces encontré tan difícil mejorar mi motor de ajedrez debido a los largos bloques de código y el diseño deficiente.

Depende de lo que quieras lograr mientras escribes el motor de ajedrez. Si quieres crear un motor de ajedrez que sea demasiado fuerte, incluso no es posible hacerlo en lenguajes OOP debido a enlaces tardíos lentos. Si solo quieres aprender programación y también divertirte escribiendo un motor de ajedrez para que los lenguajes administrados y OOP sean tus amigos. Puedo sugerirle que elija C # porque también es posible escribir un motor de ajedrez de manera más procesal con él.

Sangre fresca
fuente
¿Cómo califica ELO-wise? En comparación con Crafty?
@ Thorbjørn Ravn Andersen: uno de los mejores motores de ajedrez de código abierto escrito en C y por el Dr. Robert M. Hyatt, quien ha pasado su vida en la programación de ajedrez. Desafortunadamente, no he probado la calificación elo porque todavía hay muchas cosas que hacer antes de evaluar la calificación elo. Actualmente evaluar es solo evaluar los valores de las piezas, por lo que tiene una evaluación bastante débil y aún no he implementado todos los algoritmos necesarios. Desafortunadamente no tengo tiempo para gastar en este proyecto en este momento. Espero que algún día sea posible continuar.
Freshblood
ah lo siento, pensé que en realidad podría jugar. Culpa mía.
@ Thorbjørn Ravn Andersen: he publicado algunos lanzamientos allí y el último conjunto de cambios de repositorio listo para construir. Solo quería decir que es bastante débil en este momento.
Freshblood
2

Porté un programa de ajedrez simple como un medio para aprender el idioma Forth. Resultó ser muy adecuado para este problema tan imperativo, y aprendí mucho. La pila abierta me permitió implementar la búsqueda alfa-beta de una manera única, lo que me dio una mayor comprensión del algoritmo.

Uno pensaría que la programación funcional sería excelente para los programas de ajedrez, ya que los algoritmos centrales (búsqueda alfa-beta de búsqueda en profundidad, evaluación) son recursivos y funcionalmente estrictos. Sin embargo, un programa de ajedrez vive y muere por eficiencia y ninguno de los cultivos funcionales de lenguajes actuales tiene ese objetivo. Los cien principales motores de última generación utilizan lenguajes imperativos (principalmente C / C ++, luego Delphi) para tener el máximo control sobre el uso de memoria, subprocesos múltiples, estado global y generación de código. Todos los lenguajes funcionales utilizan la asignación dinámica de memoria para las estructuras de datos centrales, lo cual es la muerte para un programa de ajedrez.

Todavía me gustaría ver que alguien intente entrar en los 100 mejores motores de ajedrez usando un lenguaje funcional.

Ian Osgood
fuente