Árboles de juego y el esquema Minimax
Árboles de juego y el esquema Minimax
Árboles de juego y el esquema Minimax
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