INTELIGENCIA ARTIFICIAL        TEORÍA DE JUEGOS                 AJEDREZ                    Enrique Sánchez               3...
Índice1. Ancedecentes                       –   Minimax  1.       Primeras ideas             –   Alpha – Beta       •     ...
Antecedentes
1. Primeras ideas  •   Torres Quevedo  •   Shannon  •   Turing2. Trabajos posteriores3. Actualidad  •   Kasparov – DeepBlue
El turco (1769 - 1839)
Charles Babbage                                   “The life of a Philosopher”:                                   “En la pr...
LEONARDO TORRES Y                                           QUEVEDO El ajedrecista hizo su debut  durante la Feria de Par...
Alan Turing En 1952 Turing escribió un programa de  ajedrez. TUROCHAMP. Primera partida,  Turochamp vs Machiavelli (Donal...
Claude Shannon“Programing of a computer for Playing Chess”Consideraciones de Shannon:   Ventaja Material   Estructura de...
El número de Shannon10120Estimación de lacomplejidad delajedrez: Número deposiciones legalesentre 1043 y 1050Número de áto...
Trabajos posterioresEl programa del laboratorio científico de los álamos (Proyecto Manhattan), en una computadora MANIAC...
La apuesta de LevyEn 1968, el MI David Levy realizó una famosa apuesta, en lacual afirmaba que ninguna computadora de ajed...
Kasparov - DeepBlue Feng-hsiung Hsu y Murray Campbell desarrollaron un  chip dedicado al cálculo de jugadas llamado ChipT...
Kasparov - DeepBlueDeep blue vs Kasparov19961997
Un video yseguimoshttp://youtu.be/7XUKVj328z0
1. Antecedentes2. Representación del juego   (Bitboards)3. Generación de movimientos4. La función de evaluación
Representación del juego (Bitboards)La propuesta de Shannon: Cada casilla puede tomar 13 valores distintos. Bitboards Algu...
¿Bitboard?-> VelocidadLa forma básica de cómo generar movimientos con mapas de bits se describe acontinuación: Utilizar e...
BitboardPAWN_ATTACKS= ((WP << 7) & ~RANK_A) & ((WP <<9) &~RANK_H)for (int i=0; i<56; i++){                 if (board[i]= W...
Generación de movimientos Generación Selectiva : (Shannon) Examinar el tablero y obtener una serie de  movimientos "bueno...
La función de evaluaciónLas puntuaciones generalmente              Evaluación posicional:asignadas a cada pieza son relati...
Un video yseguimoshttp://youtu.be/K0sdsJz5QeY
1.       Ancedecentes2.       Representación del juego (Bitboards)3.       Generación de movimientos4.       La función de...
Minimax• Objetivo: búsqueda de la mejor jugada• Nos centraremos en un juego genérico.   – Dos jugadores, jugando por turno...
Minimax• Estado(N): configuración del juego en un momento dado.• Árbol de juego. Cada arista de ese árbol indica un posibl...
Minimax
Minimax• Imposible generar todo el árbol de búsqueda   – Generar hasta un determinado nivel de profundidad.   – Aplicar al...
Minimax
Minimax
Minimax
Minimax
Minimax• Representación de todas las posibles situaciones que  se pueden dar en el juego, a partir de un estado dado• Cada...
Minimax• La propagación de valores se hace según  el principio minimax:  – MAX siempre escogerá lo mejor para MAX y    MIN...
Minimax
Minimax
Minimax• Función de evaluación estática:   – Dado un estado del juego y un turno, es una estimación de la bondad      de t...
Minimax• Implementación:  – En lo que sigue, asumiremos que en lugar de una    función f-utilidad(estado, turno), disponem...
Minimax
Minimax
Minimax• Complejidad:   – Sea r es el factor de ramificación y m el nivel de profundidad.   – Complejidad en tiempo: O(rm)...
PODA ALFA-BETA
Poda Alfa - Beta
Poda Alfa - Beta
Poda Alfa - Beta• Idea:   • Cada nodo se analiza teniendo en cuenta el valor que por el      momento tiene y el valor que ...
Poda Alfa - Beta
Poda Alfa - Beta
Poda Alfa - Beta• Complejidad:  – Sea r es el factor de ramificación y m el nivel de    profundidad.  – Complejidad en tie...
Poda Alfa - Beta• Esto hace que en el mismo tiempo se puedan  considerar el doble de jugadas por adelantado  (haciendo a l...
•   Ordenación•   Killer moves•   El efecto horizonte•   El movimiento nulo
Ordenación La eficiencia en la búsqueda bajo Minimax depende del orden de los  movimientos en que se realiza esta operaci...
Killer moves• Varias estrategias existen para guardar los  movimientos asesinos. Lo más simple es  mantener una lista bast...
El efecto horizonte• Uno de los mayores dolores de cabeza de los  programadores de máquinas de ajedrez en  relación a la b...
El efecto horizontePor ejemplo:El efecto horizonte puede entenderse con este ejemplo: supongamos un hombre y una máquina q...
El movimiento nulo Null-move forward prunning permite a un programa de  ajedrez reducir de forma drástica el factor de ra...
Ya acabamos…
1.       Ancedecentes2.       Representación del juego (Bitboards)3.       Generación de movimientos4.       La función de...
Aperturas• El ajedrez aleatorio de  Fischer es una variante  del ajedrez propuesta por Bobby Fischer en la  que la posició...
Tablas de transposiciónEl método de ZOBRIST
Tablas de finales En 1977 Thompson se presentó en el Campeonato Mundial  de Computadoras de Toronto con una base de datos...
El tiempo de reflexión• ¿Cuanto tiempo asignar al análisis de la  posición? Posiciones de fácil determinación  requieren u...
¿QUÉ MAS PODEMOSESPERAR?
Upcoming SlideShare
Loading in …5
×

Ia chess-pt

742 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
742
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
18
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Ia chess-pt

  1. 1. INTELIGENCIA ARTIFICIAL TEORÍA DE JUEGOS AJEDREZ Enrique Sánchez 30 de Marzo de 2012 http://www.alfilchess.es
  2. 2. Índice1. Ancedecentes – Minimax 1. Primeras ideas – Alpha – Beta • Torres Quevedo – Ordenación • Shannon – Killer moves • Turing – El efecto horizonte 2. Trabajos posteriores – El movimiento nulo 3. Actualidad • Kasparov – DeepBlue 6. Otros avances2. Representación del juego – Aperturas (Bitboards) – Tablas de transposición (Zobrist)3. Generación de – Tablas de finales (Nalimov) movimientos – Uso eficiente del tiempo4. La función de evaluación5. Heurística
  3. 3. Antecedentes
  4. 4. 1. Primeras ideas • Torres Quevedo • Shannon • Turing2. Trabajos posteriores3. Actualidad • Kasparov – DeepBlue
  5. 5. El turco (1769 - 1839)
  6. 6. Charles Babbage “The life of a Philosopher”: “En la primera parte de mi estudio, pronto llegué a la conclusión de que cualquier juego de inteligencia es susceptible de ser practicado por un autómata” Estimó para el siglo XIX que existiría ya un sistema deKonrad búsqueda analítica para el ajedrezSuzeDescribió un generador demovimientos en su libro “Calculoplano”, pero sin evaluación ni
  7. 7. LEONARDO TORRES Y QUEVEDO El ajedrecista hizo su debut durante la Feria de París de 1914. Hubo una extensa primera mención en la Scientific American como "Torres and His Remarkable Automatic Device“. Jugaba automáticamente el final rey y torre contra rey desde cualquier posición sin ninguna intervención humana.
  8. 8. Alan Turing En 1952 Turing escribió un programa de ajedrez. TUROCHAMP. Primera partida, Turochamp vs Machiavelli (Donald Michie). Trató de implementar TuroChamp en la computadora Ferranti Mark 1 pero no lo completo. A falta de una computadora lo suficientemente potente como para ejecutarlo, él simulaba el funcionamiento de la computadora, tardando más de hora y media en efectuar un movimiento. “Uno no puede programar una máquina para que juegue mejor de lo que uno juega”
  9. 9. Claude Shannon“Programing of a computer for Playing Chess”Consideraciones de Shannon: Ventaja Material Estructura de peones Peones Aislados y retrasados. Control relativo del centro. Peones en color opuesto al alfil propio. Peones pasados Posición de las piezas. Caballos avanzados, protegidos o atacados. Torres en columnas abiertas o semiabiertas. Torres en séptima fila. Torres dobladas. Posibilidades de ataque. Piezas que protegen a otras piezas. Ataques sobre otras piezas. Ataques sobre casillas adyacentes al rey enemigo. Clavadas. Movilidad, medida por el número de movimientos legales posibles.
  10. 10. El número de Shannon10120Estimación de lacomplejidad delajedrez: Número deposiciones legalesentre 1043 y 1050Número de átomos enel universo: 4*1078 y6*1079.Determinó las búsquedas de Tipo A y Tipo B que veremos mas adelante:
  11. 11. Trabajos posterioresEl programa del laboratorio científico de los álamos (Proyecto Manhattan), en una computadora MANIACEl programa Berstein (IBM 704)Programas soviéticos (Kurochkin)El programa NSS (Newel, Shaw y Simon) (Universidad Carnegie Mellon)El programa Kotok (Instituto de tecnología de Massachusset) y McCarthy (profesor del MIT) (1961) Estrategia de búsqueda de tipo B. Perdió el match contra el programa ITEP ruso, pero incentivo el estudio del ajedrez por computadora.
  12. 12. La apuesta de LevyEn 1968, el MI David Levy realizó una famosa apuesta, en lacual afirmaba que ninguna computadora de ajedrez seríacapaz de derrotarle en diez años, bajo condiciones detorneo. Ganó la apuesta en 1978, venciendo por 35-15 Hacen su aparición CRAYBLITZ (Rober Hyatt) y DEEPTHOUGHT. En 1989 Levy perdió la apuesta 4-0 con DEEPTHOUGHT
  13. 13. Kasparov - DeepBlue Feng-hsiung Hsu y Murray Campbell desarrollaron un chip dedicado al cálculo de jugadas llamado ChipTest. Escrito en C, era capaz de evaluar 200 millones de posiciones por segundo.
  14. 14. Kasparov - DeepBlueDeep blue vs Kasparov19961997
  15. 15. Un video yseguimoshttp://youtu.be/7XUKVj328z0
  16. 16. 1. Antecedentes2. Representación del juego (Bitboards)3. Generación de movimientos4. La función de evaluación
  17. 17. Representación del juego (Bitboards)La propuesta de Shannon: Cada casilla puede tomar 13 valores distintos. Bitboards Algunos de los bitboard que la mayoría de las computadoras utilizan son :  64 mapas los cuales representan las casillas atacadas por cualquier pieza (si hay alguna) que ocupa una casilla en particular.  64 mapas que representan, inversamente al anterior, las casillas desde las cuales hay piezas atacando una casilla en particular.  2 mapas que representan las casillas atacadas por cada bando (blancas y negras).  12 mapas cada uno de los cuales representa las casillas ocupadas por cada tipo de pieza de cada bando (por ejemplo, Caballos blancos).
  18. 18. ¿Bitboard?-> VelocidadLa forma básica de cómo generar movimientos con mapas de bits se describe acontinuación: Utilizar el mapa de bits para todas las piezas por color. Si encontramos que una pieza de ese color está ubicada en la casilla correspondiente sus movimientos deben ser generados. Si no, ir al siguiente bit. Determinar si la pieza en cuestión es un peón. Esto se realiza mediante la operación lógica AND entre el bitmap de la posición actual y el de la ubicación de los peones. Determinar las casillas a las cuales la pieza en cuestión puede mover legalmente. Si es un peón el programa inicia la operación con el bitmap de destinos de peones y casillas de captura, sino inicia con el bitmap de casillas atacadas desde la casilla considerada. El bitmap para ubicaciones de piezas de igual color es complementado o invertido con tal de entregar un mapa de las casillas no ocupadas por piezas del mismo color. La intersección de este bitmap con el de los destinos de peones o de ataque entrega el bitmap de casillas a las cuales la pieza puede mover.
  19. 19. BitboardPAWN_ATTACKS= ((WP << 7) & ~RANK_A) & ((WP <<9) &~RANK_H)for (int i=0; i<56; i++){ if (board[i]= WHITE_PAWN) { if ((i+1) % 8 != 0) pawnAttacks[i+9]= true; if ((i+1) % 8 != 1) pawnAttacks[i+7]= true; }}
  20. 20. Generación de movimientos Generación Selectiva : (Shannon) Examinar el tablero y obtener una serie de movimientos "buenos" descartando el resto. Generación Incremental : Generar algunos movimientos, esperando que alguno de ellos será lo suficientemente bueno o malo tal que la búsqueda a lo largo de esa línea de juego pueda ser terminada antes de generar las otras. Generación Completa : Generar todos los posibles movimientos, esperando que la tabla de transposición contendrá información suficientemente relevante para hacer la búsqueda lo más eficiente posible. Hardware: DEEP THOUGHT
  21. 21. La función de evaluaciónLas puntuaciones generalmente Evaluación posicional:asignadas a cada pieza son relativos alvalor del peón, con los valores:  Pieza sin defensa Movilidad Caballo 3 peones  Estructura de Peones Alfil 3 peones  Puntuaciones asignadas a cada Torre 5 peones pieza. Dama 9 peones  Puntuaciones asignadas en el final de partidaEl Rey en algunos programas no tieneun valor asignado si bien en otros seasigna un valor infinito con tal decambiar drásticamente la evaluaciónmaterial en caso de su captura. El valorde un peón es un valor arbitrario quegeneralmente va entre 50 y 100puntos.
  22. 22. Un video yseguimoshttp://youtu.be/K0sdsJz5QeY
  23. 23. 1. Ancedecentes2. Representación del juego (Bitboards)3. Generación de movimientos4. La función de evaluación5. Heurística • Minimax • Alpha – Beta • Ordenación • Killer moves • El efecto horizonte • El movimiento nulo
  24. 24. Minimax• Objetivo: búsqueda de la mejor jugada• Nos centraremos en un juego genérico. – Dos jugadores, jugando por turnos. – Cada jugador está perfectamente informado de las reglas del juego y conoce en todo momento la configuración de cada jugada (no hay azar). – De estos dos jugadores cada uno intenta ganar para sí. Si decimos que un jugador gana, el otro pierde y viceversa. Puede existir un estado de empate. – Etiquetamos a los jugadores con MAX y MIN. Por norma siempre empezará a jugar MAX y vamos a querer que gane dicho jugador.
  25. 25. Minimax• Estado(N): configuración del juego en un momento dado.• Árbol de juego. Cada arista de ese árbol indica un posible movimiento. Una rama completa contempla una posible jugada.• En cada nivel se van alternando los jugadores.• Factor de ramificación: número de posibles movimientos que se pueden realizar.
  26. 26. Minimax
  27. 27. Minimax• Imposible generar todo el árbol de búsqueda – Generar hasta un determinado nivel de profundidad. – Aplicar alguna función de evaluación f(N). • Devuelve un valor numérico cómo de bueno es un estado. • MAX maximizará esta función y MIN minimizará dicha función. • En algunos casos la función nos puede devolver valores como PIERDE, GANA o EMPATA, siempre referidos a MAX. • Objetivo del análisis del árbol: determinar valor del nodo raíz (inicio de la jugada). A este valor se le denomina valor MiniMax.
  28. 28. Minimax
  29. 29. Minimax
  30. 30. Minimax
  31. 31. Minimax
  32. 32. Minimax• Representación de todas las posibles situaciones que se pueden dar en el juego, a partir de un estado dado• Cada nivel corresponde a un jugador (el primero para MAX).• El problema de decidir el movimiento adecuado.• En su turno, la máquina debe decidir que movimiento hacer.• Idea: – En cada turno, construir el árbol de juego completo cuyo nodo raíz sea la situación actual, desarrollándolo hasta los estados finales. – Valorar los finales según la función de utilidad. – Propagar hacia arriba los valores de la función. – Elegir el movimiento que lleve al estado sucesor del actual con mejor valoración.
  33. 33. Minimax• La propagación de valores se hace según el principio minimax: – MAX siempre escogerá lo mejor para MAX y MIN lo peor para MAX. – Un nodo de MAX toma el valor del sucesor con mayor valor. – Un nodo de MIN toma el valor del sucesor con menor valor
  34. 34. Minimax
  35. 35. Minimax
  36. 36. Minimax• Función de evaluación estática: – Dado un estado del juego y un turno, es una estimación de la bondad de tal situación respecto de MAX – En los estados finales, deberá coincidir con la de utilidad – Esta función heurística codifica todo el conocimiento que poseemos acerca del juego – Cuanto mayor el valor, mejor el estado para MAX – Lo importante es la comparación del valor entre los estados• Calidad de la f.e.: – En estados terminales f.e.=f.u. – ¡Su cálculo no debe ser muy lento!. Compromiso precisión-costo en tiempo. – La f.e. debe reflejar con precisión las posibilidades reales de ganar.
  37. 37. Minimax• Implementación: – En lo que sigue, asumiremos que en lugar de una función f-utilidad(estado, turno), disponemos de una función f-e-estatica(estado, turno), definida sobre todos los estados – También necesitaremos dos variables: *máximo- valor* y *mínimo-valor* almacenando, respectivamente, cotas para el mayor y el menor valor que puede tomar la función de evaluación estática
  38. 38. Minimax
  39. 39. Minimax
  40. 40. Minimax• Complejidad: – Sea r es el factor de ramificación y m el nivel de profundidad. – Complejidad en tiempo: O(rm). – Complejidad en espacio: O(rm).• Aún es ineficiente en la práctica: – En el ajedrez, con 150 segundos por turno, solo sería posible analizar 150000 nodos, luego sólo se podría generar un árbol de profundidad menor que 4 – Por tanto, la calidad del juego de la máquina será muy baja (un jugador humano medio puede planificar al menos 6 jugadas por adelantado)• La poda alfa-beta mejora : – En algunos casos, es posible podar el árbol sin que afecte a la decisión que se toma finalmente
  41. 41. PODA ALFA-BETA
  42. 42. Poda Alfa - Beta
  43. 43. Poda Alfa - Beta
  44. 44. Poda Alfa - Beta• Idea: • Cada nodo se analiza teniendo en cuenta el valor que por el momento tiene y el valor que por el momento tiene su padre • Esto determina en cada momento un intervalo de posibles valores que podría tomar el nodo• Significado intuitivo de en cada momento: • Nodos MAX: es el valor actual del nodo (que tendría eso o más) y es el valor actual del padre (que tendría eso o menos) • Nodos MIN: es el valor actual del nodo (que tendría eso o menos) y es el valor actual del padre (que tendría eso o más)• La poda se produce si en algún momento : • Y no hace falta analizar los restantes sucesores del nodo • En nodos MIN, se denomina poda y en los nodos MAX, poda
  45. 45. Poda Alfa - Beta
  46. 46. Poda Alfa - Beta
  47. 47. Poda Alfa - Beta• Complejidad: – Sea r es el factor de ramificación y m el nivel de profundidad. – Complejidad en tiempo: O(r3m/4). – Complejidad en espacio: O(rm). – En la práctica, si los sucesores se exploran en orden de valor minimax (creciente o decreciente dependiendo de si es un nodo MIN o MAX, resp.), se produce la máxima poda, y en ese caso la complejidad temporal es O(rm/2)
  48. 48. Poda Alfa - Beta• Esto hace que en el mismo tiempo se puedan considerar el doble de jugadas por adelantado (haciendo a la máquina más competitiva)• Métodos (aproximados) para generar los sucesores en orden: – Usar el valor de la función de evaluación estática para ordenar – Usar búsqueda en profundidad iterativa y guardar los valores minimax calculados en cada iteración
  49. 49. • Ordenación• Killer moves• El efecto horizonte• El movimiento nulo
  50. 50. Ordenación La eficiencia en la búsqueda bajo Minimax depende del orden de los movimientos en que se realiza esta operación. Desafortunadamente, ordenar los movimientos de la mejor forma implica encontrar los mejores y buscar primero sobre estos, lo cual es una tarea bastante difícil de lograr. Capturas Coronaciones Jaques Killer-moves El resto Por ejemplo, el orden podría iniciarse con capturas, coronaciones de peón (las cuales cambian dramáticamente el balance de material) o jaques (los cuales a menudo permiten pocas respuestas legales), siguiendo con movimientos que causaron recientes cortes en otras variantes a la misma profundidad (denominadas jugadas-asesinas, killer-moves) y entonces observar el resto de los movimientos.
  51. 51. Killer moves• Varias estrategias existen para guardar los movimientos asesinos. Lo más simple es mantener una lista bastante corta de a lo más dos movimientos de profundidad.• Ejemplo: La figura ilustra el funcionamiento de esta heurística. Si es el turno de mover de las blancas éstas intentarían el movimiento 1.Cxh6 debido a que captura la torre. Luego de examinar las réplicas del negro encontrará que este movimiento es refutado por la respuesta 1... Ta1 mate. Entonces, cuando el programa examine nuevos movimientos para el blanco el primer movimiento negro que tomará como respuesta sera 1... Ta1 debido a que es un movimiento legal que genero un corte en una variante anterior
  52. 52. El efecto horizonte• Uno de los mayores dolores de cabeza de los programadores de máquinas de ajedrez en relación a la búsqueda es el llamado "efecto horizonte", descrito en principio por Hans Berliner.• Numerosas técnicas se han desarrollado para evitar el efecto horizonte: búsqueda de "Posiciones Estables" y las "Extensiones Singulares" desarrolladas en Deep Blue son algunas de las más populares.
  53. 53. El efecto horizontePor ejemplo:El efecto horizonte puede entenderse con este ejemplo: supongamos un hombre y una máquina que seencuentran en la ventana de un rascacielos, digamos en el piso 46. Una persona, podría considerar el tirarsepor dicha ventana. Sus cálculos serían muy simples: al principio caería a la altura del piso 45. Eso no seríagrave. Pero a partir de ahí, dada la altura a la que se encuentra, y la presumible aceleración, el resultadoapunta a que sería muy doloroso.El ordenador iría más lejos en sus cálculos. Consideraría la situación de caída, a la altura del piso 45. No leparecería preocupante. Luego vería que se llegaría a la altura del piso 44. Y luego al 43. En principio,calcularía la velocidad creciente de caída, pero no detectaría ningún peligro. El ordenador podría continuarsus cálculos hasta llegar al piso 20, o al piso 10 y ahí detener sus cálculos. Su conclusión final sería: unasensación muy fresca, del viento en la cara. Y saltaría.
  54. 54. El movimiento nulo Null-move forward prunning permite a un programa de ajedrez reducir de forma drástica el factor de ramificación con un cierto riesgo de perder información importante. Chrilly Donniger, 1993. La idea es dar al oponente una jugada de ventaja, y si tu posición sigue siendo buena, (alfa mayor que beta), se asume que el alfa real seguirá siendo mayor que beta y por tanto podamos esa rama y seguimos examinando otros nodos. No se suelen permitir dos movimientos nulos seguidos. Inestabilidad en la búsqueda. Los valores de beta pueden cambiar.
  55. 55. Ya acabamos…
  56. 56. 1. Ancedecentes2. Representación del juego (Bitboards)3. Generación de movimientos4. La función de evaluación5. Heurística6. Otros avances • Aperturas • Tablas de transposición (Zobrish) • Tablas de finales (Nalimov) • Uso eficiente del tiempo
  57. 57. Aperturas• El ajedrez aleatorio de Fischer es una variante del ajedrez propuesta por Bobby Fischer en la que la posición de salida de las piezas se determina aleatoriamente, aunque con ciertas restricciones. Fue anunciado el 19 de junio de 1996, en el Pasaje Dardo Rocha de la ciudad de La Plata, Argentina. También se lo nombra por sus denominaciones en inglés: Fischer Random Chess, Chess960, Fischerandom chess, FR chess, o FRC.
  58. 58. Tablas de transposiciónEl método de ZOBRIST
  59. 59. Tablas de finales En 1977 Thompson se presentó en el Campeonato Mundial de Computadoras de Toronto con una base de datos que jugaba en forma perfecta el final de R+D v/s R+T Fueron la clave contra Kasparov Nalimov: Las tablas de Nalimov son ”casi” perfectas porque toman en cuenta la captura en paso.
  60. 60. El tiempo de reflexión• ¿Cuanto tiempo asignar al análisis de la posición? Posiciones de fácil determinación requieren un menor tiempo que aquellas que son de difícil decisión o cálculo. Por supuesto, decidir qué es una posición de "fácil determinación" y una de "difícil determinación" es un problema.• Robert Hyatt describe como CRAY BLITZ administra su tiempo en su documento publicado en 1984.
  61. 61. ¿QUÉ MAS PODEMOSESPERAR?

×