Algoritmo MiniMax

25
Algoritmo MiniMax DEFINICION El algoritmo MiniMax es el algoritmo más conocido (y utilizado) para juegos de 2 adversarios, movimientos alternos (“ahora tu, ahora yo”). No se puede utilizar en juegos donde hay “azar”, sino perfectamente definido como las tres en raya y el ajedrez. En teoría de juegos, Minimax es un método de decisión para minimizar la pérdida máxima esperada en juegos con adversario. Este cálculo se hace de forma recursiva. El funcionamiento de Minimax puede resumirse como elegir el mejor movimiento para ti mismo suponiendo que tu contrincante escogerá el peor para ti. Se utilizará una estrategia de profundidad limitada para explorar el conjunto de jugadas. Como es imposible hacer una exploración exhaustiva de todas las jugadas, se hace una búsqueda limitada en profundidad. Significa que en lugar de estudiar todas las posibles situaciones hasta el fin de la partida, se buscaran por ejemplo todas las situaciones de aquí 3 turnos (un modo de poda). FUNCIONAMIENTO DEL ALGORITMO MINIMAX Aclaraciones Iniciales Identificaremos a cada jugador como el jugador MAX y el jugador MIN. MAX será el jugador que inicia el juego, el cual supondremos que somos nosotros, y nos marcaremos como objetivo encontrar el conjunto de movimientos que proporcionen la victoria a MAX (nosotros) independientemente de lo que haga el jugador MIN. Deberá existir una función de evaluación heurística que devuelva valores elevados para indicar buenas situaciones, y valores negativos para indicar situaciones favorables al oponente. La calidad de nuestras jugadas vendrá determinada por la profundidad a la que lleguemos en cada exploración. Cuanto mas profunda sea, mejor jugaremos, pero mayor coste tendrá el algoritmo.

description

Forma Algoritmica

Transcript of Algoritmo MiniMax

Page 1: Algoritmo MiniMax

Algoritmo MiniMax

DEFINICION                              El algoritmo MiniMax es el algoritmo más conocido (y utilizado) para juegos de 2 adversarios, movimientos alternos (“ahora tu, ahora yo”). No se puede utilizar en juegos donde hay “azar”, sino perfectamente definido como las tres en raya y el ajedrez.En teoría de juegos, Minimax es un método de decisión para minimizar la pérdida máxima esperada en juegos con adversario. Este cálculo se hace de forma recursiva.El funcionamiento de Minimax puede resumirse como elegir el mejor movimiento para ti mismo suponiendo que tu contrincante escogerá el peor para ti.Se utilizará una estrategia de profundidad limitada para explorar el conjunto de jugadas. Como es imposible hacer una exploración exhaustiva de todas las jugadas, se hace una búsqueda limitada en profundidad. Significa que en lugar de estudiar todas las posibles situaciones hasta el fin de la partida, se buscaran por ejemplo todas las situaciones de aquí 3 turnos (un modo de poda).

FUNCIONAMIENTO DEL ALGORITMO MINIMAX                              

Aclaraciones Iniciales

Identificaremos a cada jugador como el jugador MAX y el jugador MIN.  MAX será el jugador que inicia el juego, el cual supondremos que somos nosotros, y nos marcaremos como objetivo encontrar el conjunto de movimientos que proporcionen la victoria a MAX (nosotros) independientemente de lo que haga el jugador MIN.

Deberá existir una función de evaluación heurística que devuelva valores elevados para indicar buenas situaciones, y valores negativos para indicar situaciones favorables al oponente.

La calidad de nuestras jugadas vendrá determinada por la profundidad a la que lleguemos en cada exploración. Cuanto mas profunda sea, mejor jugaremos, pero mayor coste tendrá el algoritmo.En este juego de las tres en raya se puede llegar a la profundidad máxima puesto que se trata de 9 movimientos fijos, en otros como el ajedrez o las

Page 2: Algoritmo MiniMax

damas es muy necesario limitar la profundidad y aplicar medidas que aumenten la eficiencia.Funcionamiento del algoritmo

1. Generación del árbol de juego. Se generarán todos los nodos hasta llegar a un estado terminal o determinando una profundidad concreta (poda o corte). Se considera el nodo raíz como la situación actual del juego.Vamos aplicando el algoritmo por un número fijo de iteraciones hasta alcanzar una determinada profundidad. En estas aplicaciones la profundidad suele ser el número de movimientos o los incluso el resultado de aplicar diversos pasos de planificación en un juego de estrategia. En este caso el número máximo es 9.

·         2. Cálculo de los valores de la función de utilidad para cada nodo terminal.Para cada resultado final, cómo de beneficioso me resulta si estamos en MAX o cuanto me perjudicará si estamos en MIN. 3. Calcular el valor de los nodos superiores a partir del valor de los inferiores. Alternativamente se elegirán los valores mínimos y máximos representando los movimientos del jugador y del oponente, de ahí el nombre de Minimax. 4. Elegir la jugada valorando los valores que han llegado al nivel superior.El algoritmo explorará los nodos del árbol asignándoles un valor numérico mediante una función de utilidad, empezando por los nodos terminales y subiendo hacia la raíz.La función de utilidad como se ha comentado, definirá lo buena que es la posición para un jugador cuando la alcanza.Versiones más avanzadas como el minimax con poda alfa beta hacen que se reduzca considerablemente el número de nodos a visitar por lo que el tiempo de cálculo se reduce ampliamente.Al aplicar el algoritmo, se suceden una serie de estados que se resumen en la fotografía. Un estado -1 significa que MAX gana, 0 empate o -1 pierde.

Page 3: Algoritmo MiniMax

Resumen El minimax aporta una herramienta de proceso recursiva muy útil Se pueden aplicar modificaciones al algoritmo para hacerlo más eficienteEn el juego de las tres en raya: Gana el +1, pierde el -1 y empate 0 La profundidad máxima es de 9, como el número de jugadas posible No hay restricciones sobre la validez de un movimiento, simplemente que no se haya hecho antes, por lo que el coste del cálculo es bajo (no hay que aplicar reglas complejas). Almacenar las soluciones intermedias no es excesivamente complejo Generar los diferentes tableros con las soluciones intermedias a explorar no es costoso pero podría ser un problema en otros juegos y limitar la profundidad por memoria La máquina nunca pierde, el juego está completado Las partidas entre jugadores máquina siempre quedan en tablas.

Explicación más detallada del funcionamiento del algoritmo.

Supongamos un partida de las tres en raya y que ahora le toca el turno del ordenador. Como nodo padre (raíz) ponemos la situación del tablero, y como nodo hijos los posibles movimientos que puede hacer el ordenador (el ordenador es el jugador MAX). En el siguiente nivel, por cada movimiento que

Page 4: Algoritmo MiniMax

ha hecho el ordenador en el nivel anterior, suponemos los posibles movimientos que puede hacer el jugador humano (Jugador MIN). Así seguiremos hasta llegar a un nodo terminal, que es cuando hay un desenlace de la partida (fin de la misma). Puede pasar que gane el ordenador, el humano o empate. Como se puede apreciar a cada nivel se alterna el humano y la maquina, es por eso que se llame el algoritmo Minimax.

Vamos a suponer con un cuadrado  los nodos MAX y con un círculo los nodos MIN.

  Cada vez que llegamos a un nodo terminar hay que realizar un evaluación (mediante una función) y lo que hace esa evaluación es sopesar que tal buena es  la solución a la que conduce el nodo terminal, y para poder valorarla se le asigna un valor numérico. En este caso de las tres en raya podríamos utilizar estos valores:

·         +1. Cuando gana el Ordenador·         0    Cuando se produce empate·         -1 . Cuando gana el Humano.

Page 5: Algoritmo MiniMax

 El algoritmo de la imagen superior evalúa  cada nivel del árbol de abajo a arriba. Y en los niveles MAX  elegirá los caminos que le lleven a puntuaciones de la evaluación más alta, que en este caso MAX es lo que favorece al ordenador. En los niveles MIN tratará de elegir los caminos donde la evaluación sea mas baja para perjudicar al jugador humano.

El Algoritmo empieza la evaluación del último nivel. Podemos ver que gana la maquina en el primero y cuarto nodo. Subimos al nivel superior MAX, por lo que podemos al padre el valor superior, en este caso como solo hay un nodo se pone el valor. Cuando subimos al siguiente nivel que es Min, ponemos el de  valor menor (Min es el jugador Humano). Y como el nodo Padre es MAX, selecciona el de valor mayor, en este caso el nodo de la derecha con valor 0, por lo que el siguiente movimiento es el indicado en ese nodo.

Una vez el jugador humano seleccione casilla, se vuelve a realizar este proceso.

VENTAJAS ALGORITMO MINIMAX

Capacidad de aprender de acuerdo a una base de datos histórica de movimientos realizados. Algoritmo casi infalible

Page 6: Algoritmo MiniMax

DESVENTAJAS ALGORITMO MINIMAX

Algoritmo de complejidad elevada a la hora de implementar. Es de aprendizaje lento       Solo vale para enfrentarse a un oponente a la vez.

MEJORAS DEL ALGORITMO MINIMAX

Hay  muchas técnicas para mejoras la “inteligencia” y el rendimiento del algoritmo minimax, como puede ser por ejemplo:

Poda Alfa-beta

Para juegos con un factor de ramificación elevado, esta profundidad no podrá ser muy grande, ya que el cálculo necesario para cada decisión será prohibitivo. Su tiempo de exploración será muy grande. Para mejorarlo hay que utilizar heurísticos con poda, es decir  se utilizará una técnica de ramificación y poda.

Poda de inutilidades, es una evolución de la Poda Alfa-beta Búsqueda Sesgada Algoritmo NegaMax, se trata de una versión mas compacta del minimax. En vez de utilizar dos rutinas(una para Max y otra para MIN),  lo que hace es utilizar la puntuación negada utilizando la relación matemática:

Max(a,b) = -min(-a,-b)Aunque es una versión reducida de minimax es posible aplicarle la poda Alfa-Beta. Continuación Heurística Bajada progresiva Etc.

Page 7: Algoritmo MiniMax

En teoría de juegos, Minimax es un método de decisión para minimizar la pérdida máxima esperada en juegos con adversario y con información perfecta. Este cálculo se hace de forma recursiva.

El funcionamiento de Minimax puede resumirse como elegir el mejor movimiento para ti mismo suponiendo que tu contrincante escogerá el peor para ti.

La receta del algoritmo Minimax:

1. Generación del árbol de juego. Se generarán todos los nodos hasta llegar a un estado terminal o determinando una profundidad concreta.

Vamos aplicando el algoritmo por un número fijo de iteraciones hasta alcanzar una determinada profundidad. En estas aplicaciones la profundidad suele ser el número de movimientos o los incluso el resultado de aplicar diversos pasos de planificación en un juego de estrategia.

2. Cálculo de los valores de la función de utilidad para cada nodo terminal.

Para cada resultado final, cómo de beneficioso me resulta si estamos en MAX o cuanto me perjudicará si estamos en MIN.

3. Calcular el valor de los nodos superiores a partir del valor de los inferiores. Alternativamente se elegirán los valores mínimos y máximos representando los movimientos del jugador y del oponente, de ahí el nombre de Minimax.

Page 8: Algoritmo MiniMax

4 . Elegir la jugada valorando los valores que han llegado al nivel superior.

El algoritmo explorará los nodos del árbol asignándoles un valor numérico mediante una función de utilidad, empezando por los nodos terminales y subiendo hacia la raíz. La función de utilidad como se ha comentado, definirá lo buena que es la posición para un jugador cuando la alcanza.

Versiones más avanzadas como el minimax con poda alfa beta hacen que se reduzca considerablemente el número de nodos a visitar por lo que el tiempo de cálculo se reduce ampliamente.

Y para terminar comentar un ejemplo cásico, el tres en raya (juego del gato, tatetí, triqui, tres en gallo, michi, la vieja o tic tac toe). Se trata de hacer una fila de tres para ganar y evitar que el oponente la haga antes que tu.

Al aplicar el algoritmo, se suceden una serie de estados que se resumen en la fotografía. Un estado -1 significa que MAX gana, 0 empate o -1 pierde.

Se distinguen los nodos terminales con jugada finalizada y los del trayecto. En este juego se puede llegar a la profundidad máxima puesto que se trata de 9

Page 9: Algoritmo MiniMax

movimientos fijos, en otros como el ajedrez o las damas es muy necesario limitar la profundidad y aplicar medidas que aumenten la eficiencia.

El código se adjunta en python muy comentado. El bloque principal, y a partir de ahi todo lo demás en el documento adjunto, es el siguiente:

?010203040506070809101112

b = Board()turn = 1while True:    print “Turno %i.” % turn    jugadorHumano(b, Jugador_X)    if b.gameOver():        break     jugadorMaquina(b, Jugador_O)    if b.gameOver():    break    turn += 1

Donde se crea una instancia del tablero, necesaria para detallar los elementos que intervienen en juego y e ir aplicando el algoritmo. Se pueden intercambiar jugadores o incluso hacer que jueguen dos máquinas o dos humanos simplemente modificando estas lineas de arriba.

En resumen.

o El minimax aporta una herramienta de proceso recursiva muy útil

o Se pueden aplicar modificaciones al algoritmo para hacerlo más eficiente

En el tres en raya:

o Gana el 1, pierde el -1 y empate 0

o La profundida máxima es de 9, como el número de jugadas posible

Page 10: Algoritmo MiniMax

o La cota superior de nodos a visitar es en el peor caso (primer movimiento) 9 factoria -A> 9!

o No hay restricciones sobre la validez de un movimiento, simplemente que no se haya hecho antes, por lo que el coste del cálculo es bajo (no hay que aplicar reglas complejas).

o Almacenar las soluciones intermedias no es excesivamente complejo

o Generar los diferentes tableros con las soluciones intermedias a explorar no es costoso pero podría ser un problema en otros juegos y limitar la profundidad por memoria

o La máquina nunca pierde, el juego está completado

o Las partidas entre jugadores máquina siempre quedan en tablas.

El tiempo que tarda un jugador pc en procesar la primera jugada es de 4047,181 ms en un ordenador medio, el que tarda cuando procesa la jugada que lo hace ganador en el último movimiento 0,568 ms y cuando procesa la que lo deja en tablas 0,337. La diferencia de tiempo de cálculo entre los primeros movimientos cuando quedan muchas opciones y el resto es 8000 veces mayor, por lo que el tema de la eficiencia habrá que tocarlo.

Page 11: Algoritmo MiniMax

ALGORITMO MINIMAX

Algoritmo de decision para minimizar la pérdida maxima aplicada en juegos de adversarios

Información completa (cada jugador conoce el estado del otro) Elección del mejor movimiento para cada jugador, suponiendo que el

contrincante escogerá el peor El espacio de estados se representa mediante árboles alternados,

donde:

o Nodo: Representa una situación del juego

o Sucesores de un nodo:

Situaciones del juego a las que se accede por movimientos legales aplicando sus reglas

o Nivel: Contiene todas las situaciones posibles para uno de los jugadores

El algoritmo Minimax es un procedimiento recursivo y el corte de la recursión está dado por alguna de las siguientes condiciones:

o Gana algún jugador

o Se han explorado N capas, siendo N el límite establecido

o Se ha agotado el tiempo de exploración

o Se ha llegado a una situación estática donde no hay grandes cambios de un nivel a otro.

Representación de los juegos

Posición inicial.

Conjunto de operadores o reglas del juego (definen movimientos legales)

Estado terminal

Page 12: Algoritmo MiniMax

Función de utilidad, ej. gana, pierde, empata

Pasos del Algoritmo Minimax

1. Generación del árbol de juego. Se generarán todos los nodos hasta llegar a un estado terminal.

2. Cálculo de los valores de la función de utilidad para cada nodo terminal.

3. Calcular el valor de los nodos superiores a partir del valor de los inferiores. Alternativamente se elegirán los valores mínimos y máximos representando los movimientos del jugador y del oponente, de ahí el nombre de Minimax.

4. Elegir la jugada valorando los valores que han llegado al nivel superior.

El algoritmo explorará los nodos del árbol asignándoles un valor numérico mediante una función de utilidad, empezando por los nodos terminales y subiendo hacia la raíz.

Colocar 0 ó 1 en los nodos terminales dependiendo si gana MIN o MAX

La función de utilidad definirá lo buena que es la posición para un jugador cuando la alcanza.

Se requiere de una estrategia que garantice llegar a estados terminales ganadores independientemente de lo que haga el oponente.

Page 13: Algoritmo MiniMax

Un valor positivo indica la ventaja de un jugador y uno negativo la ventaja del otro.

El jugador que espera valores positivos se conoce como maximizador

El jugado que espera valores negativos se conoce como Minimizador

El maximizador busca movimientos que lo conduzcan al mayor número positivo

El minimizador busca movimientos que lo conduzcan al menor número negativo

P. ejemplo:

Nivel MAX

Nivel MIN

Nivel MAX

El maximizador:

O puede esperar a llegar a un valor de 8 o Sabe que el minimizador puede escoger un movimiento que lo lleve a un valor de 1

Desde el punto de vista de el maximizador, el minimizador puede escoger 2 ó 1

8172

12

Page 14: Algoritmo MiniMax

Los resultados de un nivel determinan la acción y el resultado del nivel inmediato superior

Cálculo de valores de la función de utilidad

EJEMPLO

Funcionamiento de Minimax en un árbol generado para un juego imaginario.

Los posibles valores de la función de utilidad tienen un rango de [1-9].

En los movimientos del contrincante suponemos que escogerá los movimientos que minimicen nuestra utilidad

… , V(Jn)]

de izq a derEvalúa V(J1), V(J2), … , V(Jn)SI J es nodo Max ENTONCES

V(J) max[V(J1), V(J2),

SI J es nodo Min ENTONCES

V(J) min[V(J1),

Calcular el valor

minimax del nodo J: V(J)SI J es Terminal, V(J) ev(J)

SI NO

Genera los sucesores de J: J1, J2, … Jn

Page 15: Algoritmo MiniMax

En nuestros movimientos suponemos que escogeremos los movimientos que maximizan nuestra utilidad.

1er. Paso: Calcular los nodos terminales, en verde.

Page 16: Algoritmo MiniMax

2º. Paso: Calcular el cuarto nivel, movimiento MIN, minimizando lo elegido (5, 2 y 1).

3er. Paso: Calcular el tercer nivel, movimiento MAX, maximizando la utilidad (5, 9).

El segundo nivel es un movimiento MIN (5, 3 y 1).

Finalmente llegamos al primer nivel, el movimiento actual, elegiremos el nodo que maximize nuestra utilidad (5).

Page 17: Algoritmo MiniMax

Aplicación: El Juego del Gato

Dos jugadores MIN y MAX

Los jugadores colocan fichas en un tablero de 3 X 3

MAX usa las fichas X

MIN usa las fichas O

Reglas:

Inicialmente el tablero está vacío MAX empieza y se alternan los

movimientos

MAX gana si obtiene una línea de 3 X’s MIN gana si obtiene una línea de 3 O’s Existe la posibilidad de empate

¡ MAX gana ¡

O O X

O X O

O X X

¡ MIN gana ¡

X O X

O X O

O X O

¡ Empate ¡

X O XO X OX O X

Page 18: Algoritmo MiniMax

Espacio de Estado para el juego del gato

Procedimiento

Se desarrolla una búsqueda por niveles, generando los nodos del cada nivel Se aplica una función de evaluación a cada nodo La función de evaluación considera los siguientes factores:

o Número de casillas restantes

Page 19: Algoritmo MiniMax

o Posición de casillas vacías

La función de evaluación devolverá los siguientes valores:

o Positivos altos: Si la situación de uno de los jugadores es ventajosa

o Negativos altos: Si la situación del otro jugador es ventajosa

o Cero: Si ninguno de los jugadores tiene ventaja

Función de evaluación para el juego del gato

Si s no es ganadora para cualquiera de los jugadores (MAX o MIN):

esto es:

Si s es ganadora para el jugador MAX

f(s)=No. filas abiertas para MAX - No. Filas,

columnas o diagonales abiertas para MIN

f(s)= No. Líneas que no contiene una “O” – No.

Líneas que no contienen una “X

f(s)= (mayor número positivo posible)

Page 20: Algoritmo MiniMax

Si s es ganadora para el jugador MIN

MAX elegirá los nodos de mayor evaluación MIN elegirá los nodos de menor evaluación

Caso práctico de Función de evaluación para el juego del

Se define la función de evaluación:

f(s)= -(mayor número negativo posible)

MIN (donde aúnpuede

para

abiertasganar)

diagonales abiertas para MAX (dondeaún

puede ganar)NMIN(s): No. de filas, columnas o diagonales

ocolumnas

filas,de

No.NMAX(s):

f(s)=NMAX(s)-NMIN(s)donde:S: Situación o distribución del tablero

f(s): Función de evaluación deltablero (nodo del espacio de estados)

Page 21: Algoritmo MiniMax

1ª.Etapa del Espacio de Estados

Page 22: Algoritmo MiniMax

2ª. Etapa del Espacio de Estados

3ª. Etapa del Espacio de Estados

Page 23: Algoritmo MiniMax