13.05.2013 Views

Árboles de juego y el esquema Minimax

Árboles de juego y el esquema Minimax

Árboles de juego y el esquema Minimax

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Árboles</strong> <strong>de</strong> <strong>juego</strong>: tic-tac-toe<br />

Estudio <strong>de</strong> ciertos <strong>juego</strong>s <strong>de</strong> estrategia<br />

que pue<strong>de</strong>n representarse mediante<br />

árboles:<br />

– cada nodo se correspon<strong>de</strong> con una configuración<br />

posible <strong>de</strong>l <strong>juego</strong> (por ejemplo, estado <strong>de</strong> un<br />

tablero), y<br />

– cada arco es una transición legal, o jugada, <strong>de</strong>s<strong>de</strong><br />

una configuración posible a una <strong>de</strong> sus<br />

sucesoras.<br />

Por simplificar, consi<strong>de</strong>remos que:<br />

– hay dos jugadores que juegan alternadamente,<br />

– los dos jugadores están sometidos a las mismas<br />

reglas (<strong>juego</strong> simétrico),<br />

– <strong>el</strong> azar no interviene (<strong>juego</strong> <strong>de</strong>terminista),<br />

– una partida no pue<strong>de</strong> durar in<strong>de</strong>finidamente, y<br />

– ninguna configuración tiene un número infinito<br />

<strong>de</strong> posibles sucesoras.


<strong>Árboles</strong> <strong>de</strong> <strong>juego</strong>: tic-tac-toe<br />

– La configuración inicial <strong>de</strong>l <strong>juego</strong> es la raíz <strong>de</strong>l<br />

árbol correspondiente.<br />

– Las hojas <strong>de</strong>l árbol correspon<strong>de</strong>n a las configuraciones<br />

terminales <strong>de</strong>l <strong>juego</strong>, en las que no existe<br />

jugada siguiente<br />

bien porque uno <strong>de</strong> los jugadores ha ganado<br />

bien porque no ha ganado ninguno<br />

(situación <strong>de</strong> empate)<br />

– Los niv<strong>el</strong>es impares <strong>de</strong>l árbol están asociados con<br />

las configuraciones en las que <strong>de</strong>be jugar uno <strong>de</strong><br />

los dos jugadores, mientras que los niv<strong>el</strong>es pares<br />

se asocian a las configuraciones en las que <strong>de</strong>be<br />

jugar <strong>el</strong> otro.


<strong>Árboles</strong> <strong>de</strong> <strong>juego</strong>: tic-tac-toe<br />

– A cada nodo <strong>de</strong>l árbol se le asocia una etiqueta<br />

llamada función <strong>de</strong> utilidad.<br />

– Por ejemplo, una función <strong>de</strong> utilidad habitual<br />

toma tres valores posibles:<br />

“configuración ganadora”,<br />

“configuración per<strong>de</strong>dora” y<br />

“configuración empatadora o nula”.<br />

– Interpretación:<br />

Situación (o posibilida<strong>de</strong>s) que tiene <strong>el</strong> jugador<br />

(tomamos partido por uno <strong>de</strong> <strong>el</strong>los) en esa configuración,<br />

suponiendo que ninguno <strong>de</strong> los dos<br />

jugadores se equivocará y ambos realizarán en lo<br />

sucesivo la mejor jugada posible.<br />

– La función <strong>de</strong> utilidad pue<strong>de</strong> asignarse <strong>de</strong> forma<br />

sistemática.


<strong>Árboles</strong> <strong>de</strong> <strong>juego</strong>: tic-tac-toe<br />

Ejemplo: <strong>el</strong> <strong>juego</strong> <strong>de</strong>l tic-tac-toe.<br />

– Una especie <strong>de</strong> tres en raya con más <strong>de</strong> tres<br />

fichas por jugador.<br />

– Llamaremos a los dos jugadores “él” y “yo”.<br />

– Supondremos, por ejemplo, que empieza “yo”.<br />

– El árbol tiene la forma siguiente:<br />

niv<strong>el</strong> 0<br />

mueve “yo”<br />

•<br />

•<br />

•<br />

niv<strong>el</strong> 6<br />

mueve “yo”<br />

niv<strong>el</strong> 7<br />

mueve “él”<br />

niv<strong>el</strong> 8<br />

mueve “yo”<br />

niv<strong>el</strong> 9<br />

yo yo yo<br />

yoél<br />

él él<br />

GANA “yo”<br />

yoélyo yo yoél<br />

él él<br />

yoélyo yo yoél<br />

élyoél EMPATE<br />

yo yo<br />

yoél<br />

él él<br />

yo yo<br />

yo yo<br />

yo yoél<br />

yo él<br />

él él<br />

•<br />

•<br />

•<br />

1<br />

yo yo<br />

yo yoél<br />

él él él<br />

GANA “él”<br />

•••<br />

0<br />

•<br />

•<br />

•<br />

yoélyo yoél<br />

élyoél élyo él<br />

yo yo<br />

élyoél<br />

élyoél yoélyo yo yo yo<br />

yo yoél<br />

élyoél<br />

élyoél EMPATE<br />

función <strong>de</strong><br />

utilidad “empatadora<br />

función <strong>de</strong><br />

utilidad “ganadora”<br />

función <strong>de</strong><br />

utilidad “per<strong>de</strong>dora”<br />

1 -1 0<br />

0 -1 0 1<br />

0 0 1<br />

élyoél GANA “yo”


<strong>Árboles</strong> <strong>de</strong> <strong>juego</strong>: tic-tac-toe<br />

Cálculo <strong>de</strong> la utilidad:<br />

– Se da valor, en primer lugar, a las hojas:<br />

la utilidad en una hoja vale 1, 0 ó -1 si la<br />

configuración <strong>de</strong>l <strong>juego</strong> correspon<strong>de</strong> a una<br />

victoria, empate o <strong>de</strong>rrota, respectivamente,<br />

<strong>de</strong>l jugador por <strong>el</strong> que hemos tomado<br />

partido (“yo”).<br />

– Los valores <strong>de</strong> la función <strong>de</strong> utilidad se<br />

propagan hacia arriba <strong>de</strong>l árbol <strong>de</strong> acuerdo a la<br />

siguiente regla (estrategia minimax):<br />

si un nodo correspon<strong>de</strong> a una configuración<br />

<strong>de</strong>l <strong>juego</strong> en la que juega “yo” (niv<strong>el</strong> 0 ó<br />

par), se supone que ese jugador hará la<br />

mejor jugada <strong>de</strong> entre las posibles y, por<br />

tanto, <strong>el</strong> valor <strong>de</strong> la función <strong>de</strong> utilidad en la<br />

configuración actual coinci<strong>de</strong> con <strong>el</strong> valor <strong>de</strong><br />

esa función en la configuración <strong>de</strong> la mejor<br />

jugada posible (para “yo”) que se pue<strong>de</strong><br />

realizar <strong>de</strong>s<strong>de</strong> la actual (nodo max);<br />

si un nodo correspon<strong>de</strong> a una configuración<br />

<strong>de</strong>l <strong>juego</strong> en la que juega “él” (niv<strong>el</strong> impar<br />

<strong>de</strong>l árbol), se supone que ese jugador hará la<br />

mejor jugada <strong>de</strong> entre las posibles y, por<br />

tanto, <strong>el</strong> valor <strong>de</strong> la función <strong>de</strong> utilidad en la<br />

configuración actual coinci<strong>de</strong> con <strong>el</strong> valor <strong>de</strong><br />

esa función en la configuración <strong>de</strong> la peor<br />

jugada posible (para “yo”) (nodo min).


<strong>Árboles</strong> <strong>de</strong> <strong>juego</strong>: tic-tac-toe<br />

– Si la raíz tuviera <strong>el</strong> valor 1, entonces “yo” tendría<br />

una estrategia que le permitiría ganar siempre<br />

(no es <strong>el</strong> caso <strong>de</strong>l tic-tac-toe).<br />

– En <strong>el</strong> tic-tac-toe la función <strong>de</strong> utilidad <strong>de</strong> la raíz<br />

vale 0 (ningún jugador tiene una estrategia<br />

ganadora):<br />

si no se cometen errores, se pue<strong>de</strong> garantizar<br />

al menos un empate.<br />

– Si la raíz tuviera un valor -1, <strong>el</strong> otro jugador<br />

(“él”) tendría una estrategia ganadora.


<strong>Árboles</strong> <strong>de</strong> <strong>juego</strong>: tic-tac-toe<br />

– La función <strong>de</strong> utilidad pue<strong>de</strong> tener un rango más<br />

amplio (por ejemplo, los números enteros).<br />

– Ejemplo: Ajedrez<br />

se ha estimado que <strong>el</strong> árbol <strong>de</strong>l <strong>juego</strong> tiene<br />

más <strong>de</strong> 10 100 nodos<br />

si un computador pudiera generar 10 11<br />

nodos por segundo, necesitaría más <strong>de</strong> 10 80<br />

años para construirlo<br />

es imposible dar valor a la función <strong>de</strong><br />

utilidad <strong>de</strong> cada nodo <strong>de</strong> abajo hacia arriba<br />

(como en <strong>el</strong> caso <strong>de</strong>l tic-tac-toe)<br />

para cada configuración actual <strong>de</strong>l <strong>juego</strong>, se<br />

toma dicha configuración como raíz <strong>de</strong>l<br />

árbol<br />

se construyen varios niv<strong>el</strong>es <strong>de</strong>l árbol<br />

(<strong>el</strong> número <strong>de</strong>pen<strong>de</strong> <strong>de</strong> la v<strong>el</strong>ocidad <strong>de</strong>l<br />

computador o pue<strong>de</strong> ser s<strong>el</strong>eccionado por <strong>el</strong><br />

usuario)<br />

la mayor parte <strong>de</strong> las hojas <strong>de</strong>l árbol construido<br />

son ambiguas (no indican triunfos,<br />

<strong>de</strong>rrotas ni empates)<br />

la función <strong>de</strong> utilidad <strong>de</strong> las posiciones <strong>de</strong>l<br />

tablero intenta estimar la probabilidad <strong>de</strong><br />

que <strong>el</strong> computador gane <strong>de</strong>s<strong>de</strong> esa posición


<strong>Árboles</strong> <strong>de</strong> <strong>juego</strong>: tic-tac-toe<br />

Implementación (±) <strong>de</strong>tallada:<br />

– representación <strong>de</strong> una configuración <strong>de</strong>l <strong>juego</strong><br />

(<strong>de</strong>finición <strong>de</strong>l tipo <strong>de</strong> dato configuración)<br />

– enumeración <strong>de</strong> las configuraciones accesibles<br />

<strong>de</strong>s<strong>de</strong> una dada mediante la ejecución <strong>de</strong> una<br />

jugada, y<br />

– cálculo <strong>de</strong> la función <strong>de</strong> utilidad para una<br />

configuración dada, sabiendo quién juega en ese<br />

momento


<strong>Árboles</strong> <strong>de</strong> <strong>juego</strong>: tic-tac-toe<br />

algoritmo juegaElComputador(e/s c:config)<br />

{c {c es es una una configuración configuración no no final; final; <strong>el</strong> <strong>el</strong> algoritmo algoritmo<br />

realiza realiza la la mejor mejor jugada jugada posible posible a partir partir <strong>de</strong> <strong>de</strong> c, c,<br />

la la comunica comunica al al usuario usuario y y actualiza actualiza c} c}<br />

variables maxUtilidad,laUtilidad:entero;<br />

i:1..maxEntero;<br />

mejorJugada,unaJugada:config<br />

principio<br />

i:=1; i:=1;<br />

{cálculo {cálculo <strong>de</strong> <strong>de</strong> la la 1ª 1ª config. config. accesible accesible <strong>de</strong>s<strong>de</strong> <strong>de</strong>s<strong>de</strong> c} c}<br />

jugada(c,i,unaJugada);<br />

mejorJugada:=unaJugada;<br />

maxUtilidad:=utilidad(mejorJugada,falso);<br />

{"falso" {"falso" indica indica que que cuando cuando la la configuración<br />

configuración<br />

sea sea "mejorJugada", "mejorJugada", no no <strong>juego</strong> <strong>juego</strong> yo} yo}<br />

mq mqnot notesLaUltimaJugada(c,i) esLaUltimaJugada(c,i) hacer hacer<br />

i:=i+1; i:=i+1;<br />

jugada(c,i,unaJugada);<br />

laUtilidad:=utilidad(unaJugada,falso);<br />

si silaUtilidad>maxUtilidad laUtilidad>maxUtilidad entonces<br />

mejorJugada:=unaJugada;<br />

maxUtilidad:=laUtilidad<br />

fsi fsi<br />

fmq; fmq;<br />

comunicaAlUsuario(mejorJugada);<br />

c:=mejorJugada<br />

fin fin


algoritmo jugada(ent c:config;<br />

ent enti:1..maxEntero; i:1..maxEntero;<br />

sal salunaJugada:config) unaJugada:config)<br />

{Pre: {Pre: c c admite admite al al menos menos i i jugadas jugadas diferentes.} diferentes.}<br />

{Post: {Post: unaJugada unaJugadaes es la la i-ésima i-ésimajugada jugada posible posible<br />

<strong>de</strong>s<strong>de</strong> <strong>de</strong>s<strong>de</strong> c.} c.}<br />

... ...<br />

algoritmo esLaÚltimaJug(ent c:config;<br />

ent enti:0..maxEntero) i:0..maxEntero)<br />

<strong>de</strong>vu<strong>el</strong>ve booleano<br />

{Devu<strong>el</strong>ve {Devu<strong>el</strong>ve verdad verdad si si y y sólo sólo si si c c admite admite<br />

exactamente exactamente i i jugadas jugadas diferentes.} diferentes.}<br />

... ...<br />

algoritmo comunicaAlUsuario(ent c:config)<br />

{Muestra {Muestra en en pantalla pantalla la la configuración configuración c.} c.}<br />

... ...<br />

algoritmo utilidadFinal(ent c:config)<br />

<strong>de</strong>vu<strong>el</strong>ve entero entero<br />

{Pre: {Pre: c c es es una una configuración configuración final final <strong>de</strong>l <strong>de</strong>l <strong>juego</strong>.} <strong>juego</strong>.}<br />

{Post: {Post: <strong>de</strong>vu<strong>el</strong>ve <strong>de</strong>vu<strong>el</strong>ve la la utilidad utilidad <strong>de</strong> <strong>de</strong> c.} c.}<br />

... ...<br />

<strong>Árboles</strong> <strong>de</strong> <strong>juego</strong>: tic-tac-toe


<strong>Árboles</strong> <strong>de</strong> <strong>juego</strong>: tic-tac-toe<br />

algoritmo utilidad(ent c:config;<br />

ent ent<strong>juego</strong>Yo:booleano) <strong>juego</strong>Yo:booleano)<br />

<strong>de</strong>vu<strong>el</strong>ve entero entero<br />

{Calcula {Calcula la la utilidad utilidad <strong>de</strong> <strong>de</strong> c c teniendo teniendo en en cuenta cuenta<br />

quién quién juega.} juega.}<br />

variables laUtilidad:entero;<br />

i:1..maxEntero;<br />

unaJugada:config<br />

principio<br />

si siesLaUltimaJug(c,0) esLaUltimaJug(c,0)<br />

entonces<br />

<strong>de</strong>vu<strong>el</strong>ve utilidadFinal(c)<br />

sino sino<br />

i:=1; i:=1;<br />

jugada(c,i,unaJugada);<br />

laUtilidad:=<br />

utilidad(unaJugada,not <strong>juego</strong>Yo);<br />

... ...


<strong>Árboles</strong> <strong>de</strong> <strong>juego</strong>: tic-tac-toe<br />

... ...<br />

mq mqnot notesLaUltimaJug(c,i) esLaUltimaJug(c,i) hacer hacer<br />

i:=i+1; i:=i+1;<br />

jugada(c,i,unaJugada);<br />

si si<strong>juego</strong>Yo <strong>juego</strong>Yo<br />

entonces<br />

laUtilidad:=<br />

max(laUtilidad,<br />

utilidad(unaJugada,falso))<br />

sino sino<br />

laUtilidad:=<br />

min(laUtilidad,<br />

utilidad(unaJugada,verdad))<br />

fsi fsi<br />

fmq; fmq;<br />

<strong>de</strong>vu<strong>el</strong>ve laUtilidad<br />

fsi fsi<br />

fin fin

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!