Cómo entrenar a una computadora ... Cómo entrenar a una computadora … ...para jugar al Ajedrez 1 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... José Javier Franco Benítez Trabajo realizado para el “Curso de Entrenadores Nivel I” organizado por la Federación Extremeña de Ajedrez CopyLeft 2012 2 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... Contenidos 1.2.3.4.- Introducción . . . . . . . . . . . . . . . . . . Evolución histórica . . . . . . . . . . . . . . El reto . . . . . . . . . . . . . . . . . . . . Técnica orientada a la programación . . . . . . 4.1.- La función generadora de movimientos . . 4.2.- Las estrategias de cálculo . . . . . . . 4.3.- Corrigiendo la estrategia Shannon A . . . 4.4.- El método MiniMax . . . . . . . . . . . . 4.5.- Alfa-Beta (mejorando el método MiniMax) . 4.6.- Poda anticipada . . . . . . . . . . . . . 4.7.- Otros métodos de búsqueda . . . . . . . . 5.- Técnica orientada a la valoración de posiciones 5.1.- El libro de aperturas . . . . . . . . . . 5.2.- Finales . . . . . . . . . . . . . . . . . 5.3.- El medio juego . . . . . . . . . . . . . 6.- Protocolos de comunicación . . . . . . . . . . . 7.- Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 5 7 9 9 10 11 13 14 15 16 18 18 20 21 24 26 Advertencia Legal: Si por algún casual alguien plagia el contenido de este trabajo para beneficio propio, y tiene la fortuna de enriquecerse con ello (cosa que por otro lado dudo muy mucho), que la maldición de Tutankhamon recaíga sobre él, y le persigan eternamente todos los vástagos de Ramsés II. **las imágenes han sido obtenidas googleando en internet 3 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... 1.- Introducción Este pequeño trabajo acerca de cómo hacer un juego de ajedrez para ordenador pretende dar las claves esenciales para comprender como funcionan en la actualidad este tipo de programas. No pretende ser una guía exhaustiva que explique paso a paso los más íntimos secretos de los grandes programas de ajedrez, al contrario, debe verse como un manual de filosofía que incide en la realidad del software y la problemática que supone afrontar el reto de hacer uno de ellos. En la actualidad es fácil encontrar información al respecto. De hecho, hay un exceso de información que produce lo que suele conocerse como “ruido informativo”, y que impide distinguir la buena información de la rápidamente desechable. Podemos encontrar desde pequeños tutoriales, que sin entrar en profundidad, pretenden enseñar como afrontar el reto de hacer un programa de ajedrez, hasta los más pretenciosos que explican paso a paso como hacerlo desde un punto de vista meramente algorítmico. Todos carecen de lo que realmente es importante, cómo valorar adecuadamente las diferentes posiciones que se van sucediendo durante una partida. Este es el secreto, y el mejor guardado por las empresas y programadores, que no se encuentra al alcance de cualquiera. En el fondo existe una enorme similitud entre hacer un programa de ajedrez y enseñar a un niño a jugar. Una vez que son conocidas las reglas de juego, alguien debe servir de guía. En el caso de un niño es el entrenador, que vaya dirigiendo el proceso de aprendizaje hasta conseguir que las jugadas realizadas se ajusten a la lógica y naturaleza de la posición en cada momento. De igual forma, un programa de ajedrez necesita esa guía externa que le indique como descartar los errores de los aciertos, que camino seguir y cual es el objetivo final del juego. Ésto es lo verdaderamente difícil de conseguir, tanto en la práctica como en la información accesible, y que esconden como una reliquia los más avezados programadores de programas de ajedrez. Sin embargo, a lo largo de este trabajo y en la medida de lo posible se intentará dar las claves más importantes. Aquellas que realmente diferencian unos programas de otros y que nos permitirá disfrutar de todos ellos una vez conozcamos su naturaleza. 4 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... 2.- Evolución histórica Uno de los mayores pecados capitales de la humanidad es nuestra clara tendencia a autodenominarnos seres inteligentes. Cuestionar nuestra inteligencia es zarandear nuestra fibra más sensible, es llegar a lo más hondo de nuestro ser, es, en definitiva, cuestionar nuestra propia existencia. No es casualidad que desde ese punto de vista, y debido al estereotipo asociado a nuestro juego que envuelve a los jugadores que lo practican en un halo de seso y una gran capacidad analítica, ha motivado que ciertas personas quisieran romper esa barrera que cuestionara esa realidad y provocara el asombro de todos. Imagen 1. El turco Uno de estos personajes que ha pasado a la historia por intentarlo fue el Barón Wolgang von Kempelen, que en el año 1769, nada más y nada menos, realizó una máquina (Imagen 1) capaz de vencer a los mejores jugadores locales de donde se iba mostrando el invento. Incluso el célebre Napoleón perdió contra ella, arrojando todas las piezas al suelo en un ataque de ira. Pero, ¿que había de cierto en ello?. Después de mas de un siglo, fue en Filadelfia, cuando entre el tumulto de personas que coreaban la máquina, alguien grito “¡fuego!” y se desveló el autentico secreto de tan maravilloso ingenio. El experto ajedrecista que se escondía en su interior no dudó en ponerse a salvo descubriéndose así uno de los engaños más celebres de la historia. Por suerte la inquietud de imaginar una máquina que jugara al ajedrez no desapareció y en 1890 se diseñó la primera máquina que realmente fue capaz de realizar jugadas de ajedrez. Realizada por el Ingeniero español Leonardo Torres Quevedo, mediante un sistema electromecánico, fue capaz de crear una máquina que forzara el mate en finales de Torre y Rey contra Rey. Aún se puede observar en la universidad complutense de Madrid. Y no es casualidad este hecho, ya que su carrera estaba íntimamente relacionada con el mundo de las telecomunicaciones en aquél entonces, introduciendo 5 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... muchas novedades en este campo, entre ellas las operaciones en punto flotante que actualmente emplean todos los dispositivos electrónicos. Imagen 2. Máquina de Torres Quevedo La evolución en este campo durante la segunda mitad el siglo XX ha ido estrechamente relacionada con la evolución electrónica, y con la enorme especialización de los diferentes campos matemáticos. Hacer un repaso de esta etapa solo aportaría a este trabajo la evolución que la inteligencia artificial ha sufrido hasta nuestros días. Y siendo estrictos, llegaríamos a la decepcionante conclusión de que, más que evolucionar los ingenios creados por el hombre para jugar al ajedrez han ido involucionando, a pesar de su más que evidente superioridad. A día de hoy existe un margen muy pequeño para la creatividad dentro de este campo, los programas abusan de libros de aperturas, llegando incluso a realizar hasta 30 jugadas dentro de líneas teóricas. Abusan también de las tablas de finales. Gracias a las tablas de Nalimov es posible conocer de antemano cualquier resultado para cualquier jugada en posiciones donde existan hasta 6 piezas en el tablero. ¿Acaso no son los programas actuales versiones modernas de la máquina creada por Kempelen?. Sólo la valoración del medio juego, y la eficacia en el cálculo, diferencian unos programas de otros en la actualidad. Y al igual que nadie se plantea competir en velocidad con un Formula I, la tendencia en ajedrez es, que las competiciones se vayan sectarizando entre máquinas por un lado y humanos por otra, evitando la confrontación directa entre ambos colectivos. 6 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... 3.- El Reto Para hacer un programa de ajedrez es necesario conocer cuales son los requerimientos previos y necesarios para afrontar el reto. Es necesario comprender que en la tarea de enseñar a nuestra computadora confluyen diferentes disciplinas, y que analizadas por separado no nos aportan ninguna pista de cómo hacerlo, pero que interrelacionadas entre sí dejan entrever cuales son los pasos a seguir. Imagen 3. Extracto de código ensamblador Obviamente cuando hablamos de hacer un programa, sea de lo que fuere, es necesario conocer alguna herramienta que nos ofrezca la capacidad de generar código para la máquina. En nuestro caso, esta herramienta es conocida como lenguaje de programación. Y en la actualidad, hay mucho donde elegir. Cobol, Fortran, Python, C/C++, Basic, Java, Javascript, etc, son algunos de ellos. En un principio los programas se realizaban directamente introduciendo los op-codes (códigos de operación) de cada máquina, y que rápidamente fueron sustituidos por los lenguajes ensambladores que permitían de una forma sencilla sustituir los códigos nemotécnicos por su homólogos op-codes. En esta primera etapa de programación, y desde un punto de vista actual, la tarea de programación podría convertirse en una autentica tarea de chinos, y si a ello le añadimos la escasa capacidad de las primeras computadoras, el resultado era auténticamente desastroso y el debate de si las máquinas alcanzarían el nivel de juego humano estaba servido. Aún así, se consiguieron hacer buenos programas, algunos de ellos como fue el caso de “Chess 4.6” en el año 1977 llegó a alcanzar una fuerza de aproximadamente 2000 puntos ELO y con un tiempo de respuesta entre jugada y jugada de 3 minutos venciendo por primera vez a un Maestro Internacional. El agraciado con este honor fue el MI David Levy que perdió, para su fortuna, en una simultanea. En la actualidad, es difícil poner en duda la superioridad de las máquinas sobre el ser humano. Solo unos pocos son capaces de jugar “de tu a tu” contra ellas. Y a diferencia de lo que ocurría antaño, la programación de este tipo de software también ha 7 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... evolucionado. Ahora se prefieren lenguajes de más alto nivel donde la lógica es mucho más fácil de implementar, y debido a la enorme potencia de los ordenadores actuales, la falta de optimización en el código no supone una merma en la respuesta de juego del programa. Una segunda disciplina a conocer para hacer un buen programa, son las más que temidas matemáticas. Desafortunadamente, al igual que el hecho de saber escribir no es garante de saber escribir un buen libro, el hecho de saber programar tampoco lo es de hacer un buen programa. Sin embargo, como es conocido, el conocimiento suple el talento, y en nuestro caso una muy moderna rama de las matemáticas puede ayudarnos a conseguir nuestro objetivo de hacer que la computadora juegue al ajedrez. La teoría de juegos, que a pesar de su lúdico nombre, es una de las ramas más importantes en el mundo de las matemáticas en la actualidad. Y a pesar de lo que podamos pensar, no está realmente orientada al juego, sino a maximizar las ganancias en cualquier ámbito de la vida. Sirva de ejemplo el mundo empresarial. La complejidad de esta teoría es tan grande, que aplicada a nuestro juego se queda en una simple tarea de niños. No obstante, esta relativa sencillez permite que cualquiera con unos mínimos conocimientos y algo de inquietud pueda optar por hacerse su propio juego. Finalmente, y aunque parezca una verdad de perogrullo, para hacer un buen programa de ajedrez es necesario saber jugar al ajedrez. No es casualidad que los programadores de la DEEP BLUE avisaran al Gran Maestro Miguel Illescas cuando se preparaba uno de los enfrentamientos más épicos de la historia de la computación ajedrecística entre la mencionada computadora y Gran Maestro Gary Kasparov. Miguel Illescas no solo es capaz de jugar bien al ajedrez, lo que es obvio, sino además y debido a su formación, tiene extensos conocimientos en fundamentos de la programación, por lo que era candidato ideal para asesorar a los creadores de DEEP BLUE en su tarea de mejorar el estilo de juego de la máquina. Por tanto, para atreverse con este reto, es necesario saber programar, no importa en que lenguaje, tener unos mínimos fundamentos matemáticos, y por supuesto saber disfrutar del ajedrez. 8 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... 4.- Técnica orientada a la programación Cuando alguien programa de ajedrez empezar?. Y es que, concepto claro de lo se enfrenta a la larga tarea de hacer un siempre se hace la misma pregunta. ¿por dónde para afrontar este reto es necesario tener un que se quiere conseguir. Imagen 4. Programador (chessprogramming.wikispaces.com) Siendo minimalistas, y desde un punto de vista meramente ajeno a los entresijos de la programación de juegos de ajedrez, lo que cualquiera puede observar en ellos es que los programas de ajedrez se comportan de un forma cíclica: se introduce el movimiento, se calcula la respuesta y se ejecuta la mejor opción para la computadora. ¿Pero como se comporta realmente la máquina? Aunque las etapas de cálculo están suficientemente diferenciadas dentro del código fuente lo cierto es que existe una interrelación entre ellas que va más allá de lo que se puede observar desde la cómoda posición del usuario. Todo programa tiene al menos dos funciones (o rutinas) que hace la mayor parte del trabajo, y aunque no lo hacen de una forma compensada, ambas son igualmente importantes. Estas funciones son: la función generadora de movimientos y la función evaluadora de posiciones. 4.1.- La función generadora de movimientos Es necesario comenzar haciendo notar que las reglas de ajedrez se enseñan a través de una función, rutina, que sea capaz de generar todos los movimientos lícitos para cada posición. Estos movimientos, que por razones evidentes deben ser almacenados en la memoria de la máquina (bien directamente, o a través de tablas o arrays, o incluso en soportes magnéticos, ¿por qué no?) y además utilizados para dos finalidades concretas: por un lado verificar que los movimientos introducidos por el usuario son legales, y por 9 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... otro, generar las diferentes posiciones, que a la postre, debe evaluar la computadora. Obsérvese que el número de movimientos lícitos posibles en cada posición, nos indica a su vez la movilidad, la libertad de movimiento, que cada bando tiene. Existen en internet varios programas, muy pequeños, que haciendo uso de esta evaluación de movilidad y añadiéndole un simple conteo de piezas para conocer el equilibrio o desequilibrio de material pueden jugar al ajedrez. El mexicano Oscar Toledo tiene el honor de haber hecho el programa de ajedrez más pequeño del mundo, en tan solo 1Kb (y mediante código C ofuscado) ha sido capaz de hacer un verdadero programa de ajedrez. Su versión en Java es algo mayor, 5kb, y es jugable online en su web www.nanochess.com. A pesar de la sencillez del planteamiento, y como suele ocurrir habitualmente, la realidad es bien distinta. Para que esta función pueda ser utilizada de una forma sencilla y genérica debe fabricar los movimientos pseudo-lícitos, esto es, permitir generar movimientos sin tener en cuenta los jaques. La explicación es sencilla, con esto se evita una excesiva tendencia de la máquina a dar jaque. Nótese que cuando un bando está en jaque la cantidad de movimientos legales se reducen a muy pocos, del orden de 3 o 4 jugadas, frente a los más de 60 jugadas lícitas que como media existen en cada posición. 4.2.- Las estrategias de cálculo La estrategia de cálculo es sin duda el tema más importante a la hora de valorar hacer un programa de ajedrez. Aunque en la actualidad todos los programas que suelen estar en circulación, y que se precien dignos, tienden a usar la misma estrategia y algorítmica, el mundo de la programación de juegos de ajedrez empezó con el matemático Claude Shannon que entre 1949 y 1950 escribió un artículo llamado “Programación de un ordenador para jugar al ajedrez”, estableciendo así las bases actuales para desarrollar con éxito un programa de ajedrez. En su artículo hablaba de una primera estrategia, hoy conocida como Shannon A, en la que se analiza cada posición a una profundidad fija, independientemente de su naturaleza, y que comúnmente se le añade el bonito calificativo de “fuerza bruta”. 10 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... Figura 1 Pronto observó que esta forma de proceder produce una más que evidente miopía en la computadora. Como se puede observar en la figura 1 si cortamos de raíz el análisis a una profundidad fija de movimientos, la máquina puede llegar a la conclusión de que la jugada DxA o TxA de las negras es una ganancia de material sin tener en cuenta la recaptura que se produce mediante el caballo y por último con la dama invirtiendo la báscula a favor del bando blanco. Obsérvese también, que este defecto no es subsanable incrementando la profundidad en el cálculo pues siempre existiría la posibilidad de encontrarse en el análisis con una posición similar. Así, y siendo consciente de esta situación C.Shannon elaboró una nueva estrategia que se conoce como Shannon B, y en la que hace una distinción entre posiciones tranquilas (estáticas) y posiciones violentas(aquellas en las que hay intercambio de material). El análisis debe realizarse a una profundidad variable de forma que sólo se computen las posiciones del tipo estático. A pesar de la sencillez de este segundo planteamiento, las dificultades técnicas para realizar un programa de este tipo y la dificultad para homogeneizar valoraciones a diferentes niveles de profundidad son grandes. Existe una tercera estrategia, C, que Herber E. Bruderer propuso en su libro “Proceso de datos no numéricos” que complementa el trabajo de C.Shannon basada en los principios estratégicos en los que se funda el juego del ajedrez. Desafortunadamente no es muy conocida debido a la falta de éxitos de los programas que funcionan bajo esta estrategia. Como curiosidad, el programa “Pioner” del campeón del mundo M. Botvinnik funcionaba bajo esta base. 4.3.- Corrigiendo la estrategia Shannon A ¿Existe más estrategias? Pues básicamente no. Lo que hay es una combinación de las arriba mencionadas, o en algunos casos modificaciones y rectificaciones de las mismas. Para el aficionado a la programación puede ser muy sencillo usar la estrategia 11 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... Shannon A (y la realidad es que ha sido la estrategia más utilizada hasta finales de los 90 aprovechando la potencia y mejora electrónica), debido a que con un algoritmo sencillo de reiteración se puede emplear sin más la fuerza bruta. Si además corregimos la miopía en el cálculo que se produce en posiciones violentas podemos obtener un programa de ajedrez más que digno. La tendencia a modificar dicha miopía es a través de la formulación matemática. Si encontramos la expresión exacta que evalúe la posición turbulenta si necesidad de profundizar más allá, tendremos resuelto el problema de forma sencilla, eficaz y rápida. Para un escaque donde existe una pieza que está atacada por más piezas de las que es defendida, podemos aplicar una expresión del tipo siguiente: valoración = cte/(valor_pieza_a_capturar – valor_pieza_a_mover) garantizando así la captura en dicho punto cuando existe desequilibrio de fuerzas, aunque en contrapartida, se podría hacer con la pieza erronea. Y tal es así, que la vía más segura para garantizar la captura correcta es conocer de antemano el tren de ataque y defensa en dicho punto. Definiendo cono tren de ataque y defensa la ordenación por valor (de menor a mayor) de las piezas que dominan dicho punto. Así, mediante la expresión siguiente: valoración=pieza_a_mover–(pieza_a_capturar+pieza_defensora_de_menor_valor) se garantiza, ahora sí, la captura con la pieza de menor valor. Figura 2 La figura 2 muestra como de las tres piezas negras que pueden capturar en la casilla d4, solo la de menor valor (el peón) es la más rentable. Aplicando la última expresión, y usando la valoración estándar y arbitraria de las piezas (peon=1, alfil=4, caballo=3, torre=5 y dama=9), lo podemos comprobar. 12 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... Captura con peón: 1 – (1 + 3) = - 3 Captura con alfil: 4 – (1 + 3) = 0 Captura con dama: 9 – (1 + 3) = 5 Teniendo en cuenta el criterio comúnmente aceptado de que valores negativos son beneficiosos para el bando negro, y los positivos lo son para el bando blanco, podemos observar claramente que la captura con el peón da la máxima ventaja al programa. 4.4.- El método MiniMax Elegida la estrategia debemos encontrar una forma de saber como elegir el mejor movimiento para la computadora. El método MiniMax se extrae directamente de la teoría de juegos y para el caso del ajedrez, cuya información para valorar la posición es totalmente transparente a ambos bandos (se dice que es completa), es muy sencillo de aplicar. Desde un punto de vista meramente conceptual consiste en enseñar a la computadora a elegir aquél movimiento que dá menos opciones al contrario. Como cualquier jugador de ajedrez conoce, no debe basarse el movimiento sobre el tablero en un supuesto error del contrario, sino todo lo contrario, hay que hacerlo pensando que la respuesta va a ser la más fuerte de todas las posibles. El método MiniMax es precisamente esto, pero desde un punto de vista estrictamente formal y puramente matemático. Suponiendo una posición cualquiera, la máquina debe hacer un cálculo, en primer lugar, para valorar que posiciones son más beneficiosas para el adversario de entre las generadas en el árbol de análisis a determinada profundidad (mínimo valor desde el punto de vista de la computadora), y en segundo lugar, de entre todas ellas debe elegir la de mayor beneficio para la computadora (máximo) llevando a cabo el concepto de proceder en base a que el contrario realizará la mejor jugada y no cometerá error al mover. De aquí el nombre MiniMax, elegir el valor máximo de todos los mínimos posibles. Figura 3 13 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... Aplicando la idea a la posición mostrada, figura 3, imaginemos que analizamos las posibilidad de capturar el peón de 'd4' con piezas negras (movimiento computadora). Sin tener en cuenta la recaptura para simplificar el ejemplo, que por otro lado es un situación que se presenta en la práctica en el desarrollo de un motor de ajedrez, y que se clasifican como posiciones violentas, (ver Estrategias de cálculo), y teniendo en cuenta como criterio de valoración el meramente material atendiendo a la arbitraria valoración de piezas ya establecida, podemos generar un mini árbol cuyas ramas finales terminan en la valoración indicada en la siguiente tabla: Posición de juego (figura 3) Variante A (1.Axd4) Variante B (1.Txd4) Variante C (1.Dxd4) Resp 1 Resp 2 Resp 3 Resp 1 Resp 2 Resp 3 Resp 1 Resp 2 Resp 3 1. … 1. … 1. … 1. … 1. … 1. … 1. … 1. … 1. … Axd4 Cexd4 Cfxd4 Axd4 Cexd4 Cfxd4 Axd4 Cexd4 Cfxd4 0 -1 -1 -1 -2 -2 -5 -6 -6 Tabla 1 Obsérvese que para la variante A el movimiento más beneficioso para el bando blanco es recapturar con caballo, de momento es indiferente con cuál pues solo se tiene en cuenta la valoración material, así el valor mínimo (desde el punto de vista de la computadora, máximo desde el punto de vista del oponente) es -1: Valor mínimo en variante A = -1 Aplicando la misma idea en las variantes B y C, obtenemos que: Valor mínimo en variante B = -2 Valor mínimo en variante C = -6 De todos ellos, el valor máximo es el -1, correspondiente al valor mínimo de la variante A. Así, de las opciones analizadas, el movimiento más beneficioso para las negras (conducidas por la máquina) sería 1.Axd4. Sirviendo este sencillo ejemplo como muestra del funcionamiento del método MiniMax. 4.5.- Alfa-Beta (mejora del método MiniMax) El algoritmo Alfa-Beta esta basado en dejar de analizar aquellas posiciones que ya quedan demostradas como peores sin necesidad de verificar todas las posibilidades. Detrás de esta definición, quizás un poco confusa, hay una increíble sencillez lógica. Si observamos atentamente la tabla 1 del epígrafe anterior podemos observar que la valoración que se dio para la variante A, 14 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... el movimiento 1. Axd4, después de analizar todas las posibles respuestas, fue de -1. Continuando el análisis para la Variante B, 1. Txd4, observamos que la primera respuesta produce una valoración -1, que claramente es la misma puntuación que la mínima obtenida para la variante A. Esta es la clave del algoritmo AlfaBeta, ya no es necesario seguir analizando la posición pues ya se sabe que al menos hay una valoración igual o peor que la obtenida previamente (en nuestro ejemplo la variante A), sin importar el resto, pues es de suponer que el adversario siempre optará por buscar la jugada que más le beneficie. Aplicando el mismo razonamiento para la variante C, llegaríamos a la misma conclusión. Y finalmente sin necesidad de examinar detalladamente todos los movimientos llegaríamos a la conclusión de que el movimiento mejor valorado es 1. Axd4, correspondiente a la variante A. Por tanto, el algoritmo Alfa-Beta supone una simplificación del árbol de variantes y un enorme ahorro tiempo. Imaginando que una posición cualquiera hay más de 60 movimientos posibles (como media), el árbol de posiciones a una profundidad de 4 movimientos puede llegar a crecer hasta la nada desdeñable cifra de aproximadamente 13.000.000 (que es aproximadamente 60 elevada a su cuarta potencia). En la actualidad, y con la potencia de cálculo de los actuales procesadores, dicha cifra es una nimiedad, sin embargo no hace mucho esto suponía un tremendo esfuerzo. Como ejemplo se puede acudir a los obsoletos procesadores de Zilog. El Z80 funcionaba con una frecuencia de aproximadamente 3,5 Mhz (3.500.000 ciclos por segundo), cada operación realizada por el procesador (instrucción) consume una media de 7 u 8 ciclos, lo que supone que a esa frecuencia el procesador solo puede realizar una media (mal contada) de 500.000 operaciones por segundo. Haciendo una simple división, 13.000.000/500.000, podemos concluir que solamente el conocimiento de todas las posiciones le cuesta a la computadora la cantidad de 26 segundos. Sin contar el resto de esfuerzos necesarios para hacer que la máquina juegue, entre los que están el valorar cada una de las posiciones previstas, que sin duda es el de mayor consumo. 4.6.- Poda anticipada Todavía es posible mejorar la búsqueda para encontrar la mejor valoración. En este caso, se busca una simplificación en el árbol en su sentido longitudinal (y no trasversal como en el algoritmo Alfa-Beta). 15 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... Figura 4 Supongamos la siguiente línea de análisis, que aunque totalmente ingenua, es una posibilidad real para la computadora: 1. … Rd7 2. dxe4 Rc7 3. e5 Rb7 4. e6 (valoración -9) Obviamente la computadora ha previsto que esta línea basada en el movimiento de Rey produce una valoración muy desfavorable, pues pierde la dama. Ahora supongamos otra línea de análisis, solamente hasta su segundo movimiento: 1. … Rf7 2. dxe4 (valoración -9) Comprobamos que después de 2. dxe4, cualquier movimiento del Rey negro no hará que varíe la valoración (pues seguirá existiendo una perdida clara de material), por tanto no es rentable seguir indagando en dicha línea. Obviamente esta forma de proceder hace que el ordenador adquiera un sentido muy materialista de la posición, sin tener en cuenta posibles sacrificios, sin embargo acelera el cálculo notablemente. 4.7.- Otros métodos de búsqueda En la práctica existen muchos algoritmos que ayudan a encontrar el mejor movimiento de la computadora, y que a modo de información se muestran a continuación: - La heurística vencedora: basada en la búsqueda de movimientos que refuten el generado por el ordenador, de forma que, comparando dicho movimiento con los siguientes generados por la máquina, permite valorar si los nuevos movimientos son rentables. - La ventana Alfa-Beta: teniendo en cuenta que no es habitual 16 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... que se obtenga una ganancia muy grande para una posición dada, se puede reducir el análisis descartando aquellas ramas que produzcan ganancias (o perdidas) muy exageradas, o fuera, de los valores Alfa y Beta que forman la ventana. - La reiteración: consiste en ir analizando la posición por niveles de profundidad, de forma que se ajuste al tiempo establecido de juego. - Otros algoritmos de mejora Alfa-Beta: Movimiento Nulo (Chrilly Donniger, 1993), Aspiration Search, Negamax, Negascout, Algoritmo SSS*, Scout (Judea Pearl), Algoritmo MTD, etc. En definitiva, a pesar de la gran cantidad de algoritmos que se pueden encontrar, todos están basados en las estrategias creadas por C. Shannon hace más de medio siglo y en el concepto de MiniMax extraído de la Teoría de Juegos. 17 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... 5.- Valoración de posiciones La valoración de las posiciones es la parte de un programa de ajedrez más compleja. Es también la más próxima al entrenamiento de personas, pues mientras que la técnica de programación (veáse los anteriores apartados) depende en gran medida de la habilidad o virtuosismo del programador, el saber transmitir cómo valorar una posición depende de la capacidad de enseñar a jugar, entendiendo como jugar, el paso que va más allá del simple movimiento de las piezas y conocimiento de las reglas. A pesar de que se puede suscitar un gran debate al respecto, lo cierto y verdad, y a diferencia de lo que se tiende a pensar, la capacidad de enseñar no depende de los conocimientos del instructor, sino del nivel que se pretende alcanzar y de la capacidad para transmitir ideas de una forma clara y sencilla. En este aspecto y al igual que ocurre en el entrenamiento, enseñar a jugar a una computadora, es saber transmitir los conceptos correctos a un código legible por la máquina. Actualmente es fácil encontrar mucha información en relación a las técnicas empleadas para programar un buen juego de ajedrez. Por el contrario existe muy poca, y a veces difícil de obtener, información en relación a cómo se debe valorar las posiciones que deben ser analizadas por el programa. Tanto es así, que la mayor parte de los programas que circulan en internet, por ejemplo en la modalidad de código abierto, se limitan a un simple conteo de material y movilidad a una profundidad fija. Otros incluyen en su código tablas rectificadoras que permiten dar un añadido más a la valoración relativa de las piezas en función de su posición. Pero en el fondo, nadie desvela los secretos de cómo hacer que un programa de ajedrez pueda jugar como un Gran Maestro. Esto es lo realmente entretenido del asunto, pues al igual que a un niño se le va explicando como debe ir realizado las jugadas, en qué detalles debe fijarse o que criterios seguir cuando la posición parece muerta (en ideas), el diseño y programación de un juego de ajedrez está basado en las mismas ideas extrapoladas a un lenguaje mas abstracto y simbólico, a un lenguaje matemático. 5.1.- El libro de aperturas Como ya se reseñó al principio de este trabajo, los actuales programas son en realidad pequeños engaños que pretenden hacernos creer que saben jugar al ajedrez desde el principio hasta el fin. Sin embargo, todos ellos abusan de la gran capacidad de computo y almacenamiento, y el más sencillo ejemplo es la enorme capacidad que todos tienen para acudir a la teoría de aperturas para 18 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... emplearla directamente en el juego. Es fácil comprobar, como ya en la década de los noventa, programas como el “Genius Chess” para el obsoleto sistema operativo MS DOS que se hizo famoso por su pequeño tamaño y preciso juego, era capaz de seguir la teoría hasta casi alcanzar la jugada 30 en variantes de la siciliana, como por ejemplo la variante Nardof que popularizó el ex campeón mundial B.Fischer. Esta forma de proceder en la programación de juegos de ajedrez garantiza la creación de un fuerte rival para los grandes jugadores, pero que deja poco disfrute para el aficionado que pronto se ve sumido en la desolación de sus continuas derrotas, sin caer en la cuenta de que en nadie en su sano juicio es capar de almacenar tal cantidad de información al modo en que lo hacen las computadoras actuales. El libro de aperturas en realidad no fue creado en un principio para vencer desde las primeras jugadas, sino para romper el determinismo al que tiende la máquina, pues sin un mínimo de aleatorización en las jugadas la máquina tendería a repetir una y otra vez las mismas jugadas ante posiciones idénticas. Algo que además se ha extrapolado al medio juego, permitiendo al programa elegir de una forma totalmente aleatoria entre varias jugadas supuestamente igual de aceptables. Poco más hay que añadir, pues en realidad desde un punto de vista meramente técnico no tiene complicación. Existen infinidad de criterios para la creación de un libro de apertura, siendo el más simple la creación de una tabla de donde leer la información formateada según algunos de los actuales protocolos de comunicación entre motores e interfaces, como xboard o UCI (Universal Chess Interfaces). e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 e2e4 g8f6 c7c6 c7c6 c7c6 c7c6 c7c6 c7c6 c7c5 c7c5 c7c5 c7c5 c7c5 c7c5 c7c5 c7c5 c7c5 c7c5 c7c5 c7c5 c7c5 c7c5 c7c5 c7c5 e4e5 d2d4 d2d4 d2d4 d2d4 d2d4 d2d4 b1c3 g1f3 g1f3 g1f3 g1f3 g1f3 g1f3 g1f3 g1f3 g1f3 g1f3 g1f3 g1f3 g1f3 g1f3 g1f3 f6d5 d7d5 d7d5 d7d5 d7d5 d7d5 d7d5 b8c6 b8c6 b8c6 b8c6 b8c6 b8c6 b8c6 b8c6 b8c6 d7d6 d7d6 d7d6 d7d6 d7d6 d7d6 d7d6 d2d4 b1c3 b1c3 b1d2 b1d2 e4d5 e4e5 g2g3 f1b5 d2d4 d2d4 d2d4 d2d4 d2d4 d2d4 d2d4 f1b5 d2d4 d2d4 d2d4 d2d4 d2d4 d2d4 d7d6 d5e4 d5e4 d5e4 d5e4 c6d5 c8f5 g7g6 g1f3 c3e4 c3e4 d2e4 d2e4 c2c4 c5d4 c5d4 c5d4 c5d4 c5d4 c5d4 c5d4 f3d4 f3d4 f3d4 f3d4 f3d4 f3d4 f3d4 g8f6 g8f6 g8f6 g8f6 e7e6 e7e6 g7g6 b1c3 b1c3 b1c3 b1c3 b1c3 b1c3 d7d6 d7d6 d7d6 e7e5 d8c7 a7a6 c1g5 e7e6 d1d2 f8e7 e1c1 e8g8 c1g5 e7e6 d1d2 a7a6 e1c1 h7h6 f1c4 d4b5 d7d6 c5d4 c5d4 c5d4 c5d4 c5d4 c5d4 f3d4 f3d4 f3d4 f3d4 f3d4 f3d4 g8f6 g8f6 g8f6 g8f6 g8f6 g8f6 b1c3 b1c3 b1c3 b1c3 b1c3 b1c3 b8c6 b8c6 b8c6 a7a6 a7a6 a7a6 c1g5 c1g5 f1c4 c1e3 c1g5 f1e2 b8d7 c8f5 e4g3 f5g6 h2h4 h7h6 b8d7 c8f5 e4g3 f5g6 h2h4 h7h6 g8f6 b1c3 e7e6 g1f3 f1g2 f8g7 e7e6 d1d2 f8e7 e1c1 e8g8 e7e6 d1d2 a7a6 e1c1 h7h6 e7e6 f2f4 e7e5 d4b3 f8e7 Tabla 2 19 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... La tabla 2 muestra un extracto del fichero book.txt del libro de aperturas creado por Tom Kerrigan para su educativo programa de Ajedrez TSCP (Tom Kerrigan Simple Chess Program, 1997). En este caso el autor optó por incluir el libro de aperturas en archivo indepediente, y por fortuna para los aficionados totalmente transparente, pues podemos modificar a placer su contenido añadiendo o eliminado variantes. Otras opciones son generar archivos más complejos, o incluso comprimidos, o si se opta por un libro no muy extenso incluirlo como parte del código del programa. 5.2.- Finales La otra parte del engaño de los actuales programas de ajedrez son los finales. Desde los orígenes de la programación de juegos de ajedrez, los finales han sido el caballo de batalla debido a la enorme complicación conceptual que conlleva poder matematizarlos de una forma genérica. Incluso en los finales más simples se requiere especificar mediante código concreto las acciones para poder llevar a buen término la victoria por parte de la computadora. Cualquier final de Dama y Rey contra Rey requeriría la siguiente secuencia de código: 1. Reducir la distancia entre la pieza mayor y el Rey contrario 2. si no es posible el punto 1, acercar el Rey atacante al Rey contrario De esta forma se consigue, poco a poco, arrinconar al Rey en minoría con Dama y Rey hasta alcanzar la posición de mate. Sin embargo, para el caso de que la pieza mayor sea la Torre el anterior criterio debe modificarse en el sentido de tener en cuenta las posibles amenazas a la Torre y tener la precaución de mantener el Rey a salto de caballo, lo cual a su vez puede necesitar una pérdida de tiempo de la Torre. Pensar en términos de finales de Alfiles, o Alfil y Caballo, para dar mate se excede en mucho del objetivo de este trabajo. Y si además añadimos más elementos, otras piezas o simplemente peones, mantener el objetivo de juego se convierte en algo difuso, difícilmente cuantificable desde un criterio meramente matemático. En la actualidad todos los motores de ajedrez que pretendan presumir de seriedad acuden a lo que se conocen como tablas de finales. Por ejemplo, las “Tablas de Nalimov”, que no son más que una gigantesta base de datos generada de forma inversa y que indican el resultado que se obtendría en cualquier posición para cualquier movimiento. Estas tablas desde su creación han ido creciendo hasta conocer de antemano el resultado de posiciones 20 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... formadas por seis piezas. En Internet existen varios sitios online donde se puede verificar el resultado de un final concreto, la siguiente dirección http://www.lokasoft.nl/tbweb.aspx es un claro ejemplo, y un ejemplo de como no es posible competir humanamente con máquinas que usan como criterio de cálculo el obtener información de enormes bases de datos. Por tanto, la ardua tarea del final está encomendada a la simple consulta en una base de datos. Sin embargo, para el aficionado, tanto al ajedrez como a la programación, este asunto, lejos de ser algo tedioso, puede convertirse en algo divertido, y ayuda a comprender los entresijos de los finales a medida que se van modificando los criterios de valoración. 5.3.- El Medio Juego Por suerte, no todo esta precocinado de antemano, y la parte más determinante de un programa de ajedrez radica principalmente en la valoración del medio juego (suponiendo que la programación se realiza de forma eficaz). Pero, ¿qué debemos valorar? ¿y cómo? Las respuestas a estas preguntas no son sencillas, si lo fueran, hacía tiempo que podríamos haber disfrutado de buenos programas de ajedrez. Obviamente, y como ya se ha indicado, el equilibrio de material y la capacidad de expansión (movilidad) son fundamentales en un primer análisis, pero para querer ir más allá se deben considerar otros muchos factores como son: el desarrollo de las piezas, la estructura de peones, el derecho a enroque, la seguridad del rey, la capacidad de ataque, en definitiva cualquier criterio que deduzcamos puede intervenir en la posición. Además, hay que ser consciente de la importancia del valor relativo de las piezas, que como es sabido, dependen en gran medida de la naturaleza de la posición. Generalmente la valoración de los criterios elegidos se hacen por separado, y finalmente se ponderan conjuntamente mediante una expresión similar a la siguiente: Vt = K1 * C1 + K2 * C2 + K3 * C3 + K4 * C4 + K5 * C5 + ... + Kn * Cn Donde los factores C corresponden al valor absoluto de cada criterio, y los factores K corresponden al peso específico en la valoración total. A modo de ejemplo, se suele considerar como válido que la movilidad represente el 10% del material. En nuestra expresión anterior, si K1 representa el peso específico del material podemos 21 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... asignarle un valor K1=1 , y si K2 representa el peso específico de la movilidad podemos asignarle un valor de K2=0.1. El valor relativo de las piezas es otro de los aspectos importantes a tener en cuenta, y la manera habitual de rectificar el valor original de cada pieza es mediante tablas de consulta. Es conocido que un Alfil o un Caballo situado en alguna de las casillas centrales es mucho más valioso que otro escorado en un flanco o en los rincones, por tanto hay que dar un valor añadido a cada pieza en estas posiciones, o restar en caso contrario. | | | | | | | | 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 1 3 3 3 3 1 0 0 1 3 5 5 3 1 0 0 1 3 5 5 3 1 0 0 1 3 3 3 3 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 | | | | | | | | La matriz 8x8 arriba representada podría corresponder a los valores que habría que añadir a las piezas menores para rectificar su valor en función de su posición. Donde se premia el ocupar casillas centrales. Este sistema de valoraciones (con otro tipo de valores, obviamente) es ampliamente utilizado en los programas reales de ajedrez. Se puede utilizar para fomentar el avance de los peones en finales, por ejemplo, si establecemos los siguientes valores: | | | | | | | | 5 2 1 1 1 0 0 0 5 2 1 1 1 0 0 0 5 2 1 1 1 0 0 0 5 2 1 1 1 0 0 0 5 2 1 1 1 0 0 0 5 2 1 1 1 0 0 0 5 2 1 1 1 0 0 0 5 2 1 1 1 0 0 0 | | | | | | | | Obsérvese que los valores no tienen porque ser graduales, pues tanto un peón que mueve desde su casilla de origen a e4, es premiado con un punto extra al igual que un peón que pasa de e4 a e5, sin embargo cuando el peón esta próximo a coronar el incremento de su valor relativo aumenta. Los valores de las matrices son totalmente arbitrarios en este trabajo, pero aquí radica la auténtica belleza de fabricar un programa de ajedrez, pues no está al alcance de cualquiera conocer los verdaderos valores que los programas profesionales asignan a este tipo de tablas. El sistema tabulado de valores que se ha indicado es muy 22 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... ventajoso en tiempo de desarrollo, sin embargo, hay muchas ocasiones en las que este tipo de tablas deben construirse dinámicamente, en tiempo de ejecución. Un ejemplo más que evidente es cuando se trata de conocer las posibilidades reales de ataque al Rey. | | | | | | | | 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 3 3 3 1 0 0 0 0 5 5 3 1 0 0 0 0 8 5 3 1 0 0 0 0 5 5 3 1 0 0 0 0 3 3 3 1 0 0 0 0 1 1 1 1 0 0 0 0 | | | | | | | | | | | | | | | | tabla dinámica para rey en e8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 3 3 3 1 0 0 0 0 5 5 3 1 0 0 0 0 8 5 3 1 0 0 0 0 5 5 3 1 0 0 0 0 | | | | | | | | tabla dinámica para rey enrocado Como se muestran en las anteriores tablas, se fomenta la ocupación de casillas próximas al rey y para ello es necesario que el programa se encargue de construirlas a partir de la posición real del Rey enemigo. Por desgracia para el programador no todo depende de la geometría del tablero, hay criterios que son muy difíciles de cuantificar. Uno de ellos, por ejemplo, es el desarrollo de las piezas. A pesar de que puede parecer más que evidente que se deben mover las piezas menores acercándolas al centro y buscar el enroque, lo cierto es que formular dicha situación es mucho más compleja de lo que parece. El propio David Levy, que en los primeros apartados de este trabajo se presentó como el hombre que tuvo el gran honor de ser el primero en perder contra una computadora, dejó escrita la siguiente formula aplicable al desarrollo: Desarrollo = D/3 – U/4 – (K * C) donde, D, es el número de piezas menores que no están en sus escaques iniciales U, que toma el valor cero si la dama no ha sido movida o ha sido capturada, y si se ha movido toma el valor de las piezas que aún no han sido desarrolladas, incluidas las torres. C, igual a dos si el contrario tiene aún la dama sobre el tablero. K, toma valor en función a los derechos a enrocar, cero, por ejemplo si se ha enrocado. 23 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... 6.- Protocolos de Comunicación Actualmente, y debido a la enorme evolución de los sistemas informáticos, los programas de ajedrez han ido evolucionando hasta tal punto que existe una clara división de tareas entre lo que es el interface gráfico y el motor de ajedrez propiamente dicho. De esta forma se puede especializar a los diferentes programadores de manera que por un lado exista un trabajo intensivo en la creación de un entorno amigable de juego y por otro, mucho más especializado, dedicado a la programación del motor (engine). Tenemos así que, en realidad, el software actual dedicado al ajedrez esta formado por dos programas independientes, el interface y el engine, de forma que podemos introducir mejoras en el programa de juego sin necesidad de modificar todo el entorno, o viceversa. Sin embargo para que este sistema de trabajo pueda funcionar correctamente deben existir unas normas que garanticen la correcta comunicación entre ambos programas. Estas normas se conocen como protocolos de comunicación. Al principio, estos protocolos estaban establecidos a nivel de empresa, pero gracias al software libre y a los esfuerzos realizados para dotar de un interface gráfico al programa de ajedrez gnuchess, se han ido diversificando y creciendo hasta establecerse como auténticos estandares en el mundo de la programación de programas de ajedrez. Los protocolos más utilizados en la actualidad son el Universal Chess Interfaces (UCI) creado por Rudolf Huber y Stefan Meyer-Kahlen en el año 2000 y el protocolo Xboard/Winboard que en su versión 2 fue desarrollado por Tim Mann y H.G. Muller en septiembre del año 1999, y que aún sigue en desarrollo. El primero de ellos, UCI, goza de mayor fama programas de ajedrez por ser ampliamente utilizado por comerciales, sin embargo Xboard/Winboard es, en teoría, fácil de implementar y está ampliamente difundido debido cantidad de sofware abierto existente que lo aplica. entre los programas mucho más a la gran ¿Pero como funcionan realmente estos protocolos? La filosofía de funcionamiento es mucho más fácil de entender que implementar en código, en palabras de Tim Mann. Sin embargo, se hace necesario su implementación si no se quiere desarrollar, con todo lo que conlleva, un entorno gráfico personalizado para el motor. La primera parte del protocolo es crear un canal de comunicación entre el interface y el engine, que por suerte para el desarrollador de programas de ajedrez, se encarga el propio interface. Hecho esto, simplemente hay que saber enviar la información correcta desde el engine y recibirla desde el entorno 24 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... gráfico, atendiendo a las normas del protocolo. Tanto UCI como Xboard utilizan la salida y entrada setandar para comunicarse, por lo que es muy fácil implementar el código para realizar esta labor. Aún así, es posible encontrar dificultades al usar diferentes sistemas operativos, pues en el caso de Windows, por ejemplo, no se dispone de un sistema eficaz para este tipo de tareas, y que en sistemas unix es muy sencillo de realizar debido a las denominadas tuberías de comunicación o “pipes”. De cualquier modo, siempre es más fácil implementar el protocolo en el motor de ajedrez, que crear un interface gráfico, con la ventaja evidente de poder usar cualquier entorno de los disponibles tanto de forma gratuita como de forma comercial. Para poder conectar un motor de ajedrez al interface xboard, en sistemas Linux, hay que ejecutar el siguiente comando desde la consola #linux> xboard -fcp “engine” siendo “engine” el path o ruta completa hasta el archivo donde se encuentre el engine ejecutable, y xboard el interface gráfico que es necesario tener instalado en el ordenador, no confundir con el protocolo xboard. Y si queremos hacer competir dos motores, hacemos, #linux> xboard -fcp “engine1” -scp “engine2” En sistemas windows es tan sencillo conectar motores al interface como cambiar xboard por winboard. Estos protocolos están tan extendidos que como curiosidad existe un tercer programa, denominado PolyGlot, que permite conectar un motor basado en UCI a un interface gráfico basado en xboard/winboard, actuando como intermediario entre ambos. Aunque, salvo excepciones, lo habitual es que tanto los motores como los interfaces puedan conectarse indistintamente en ambos protocolos. 25 José Javier Franco Benítez 2012 Cómo entrenar a una computadora ... 7.- Conclusiones De todo lo expuesto es posible deducir que no es fácil hacer un programa de ajedrez, aunque en verdad y a pesar de lo que parece, lo verdaderamente difícil es hacer uno que juegue bien. Hay una parte de programación técnica que es necesario conocer para poder realizar el software, pero hay otra, que depende de nuestra total y absoluta imaginación. Y es aquí donde entra en juego la auténtica diversión del programador. Ver la evolución del programa desde sus primeros pasos hasta su definitivo desarrollo es un autentico placer. Y la diversión está garantizada, pues existen infinidad de formas de ir enseñando al programa a jugar correctamente. Como se ha visto, podemos acudir a bases de datos de información, tablas de valores, fórmulas matemáticas, en definitiva, cualquier cosa que se nos ocurra es posible plasmarla en el código, y quién sabe si funcionará. En el fondo no existe diferencia alguna entre el entrenamiento personal de futuros jugadores y la creación de programas de ajedrez, pues salvando las distancias en lo que a relaciones humanas se refiere, es necesario enseñar a jugar, analizar errores, y volver a enseñar hasta alcanzar los objetivos planteados. En la actualidad existe tendencia a creer que los futuros grandes jugadores de ajedrez serán en realidad grandes alumnos de las máquinas. Y es más que evidente que la posibilidad real de poder vencer, al más que numeroso ejercito de computadoras que saben jugar al ajedrez, es una tarea que está reservada a tan solo unos pocos privilegiados, quedando el resto de aficionados como meros espectadores ante el asombroso espectáculo que nos ofrecen los ordenadores. Así pues, si el futuro esta en el software, ¿por qué no entender su funcionamiento? 26 José Javier Franco Benítez 2012
© Copyright 2025 ExpyDoc