Clase 7 Búsqueda con adversarios: minimax, alfa–beta y evaluación

Pregunta central

¿Cómo elegir una acción cuando el resultado no depende solo de mí, sino también de un oponente que intenta perjudicarme?

Respuesta breve

En un juego determinista, de suma cero y con información perfecta, minimax asigna a cada estado el resultado que MAX puede garantizar si MIN responde óptimamente. Los valores se calculan desde las hojas hacia la raíz: MAX conserva máximos y MIN conserva mínimos. La poda alfa–beta evita ramas que ya no pueden cambiar la decisión, y las funciones de evaluación estiman posiciones no terminales cuando no hay recursos para llegar al final.

Cómo estudiar esta nota: formaliza primero el juego, identifica quién controla cada nivel y practica la propagación minimax. Después aprende qué significan y ; solo entonces recorre la poda. Al final estudia la búsqueda con profundidad limitada y las funciones de evaluación.

Fuente y alcance: la nota integra las 29 diapositivas del PDF AI 7 Búsqueda con adversarios y amplía sus explicaciones con CS 188, capítulos 3.1–3.2. Los árboles numéricos de minimax y alfa–beta provienen de las diapositivas 17 y 24. Los laboratorios, las tablas de seguimiento y las precisiones son ampliaciones didácticas. La diapositiva 1 solo menciona “Dudas de tarea 1”; como no contiene las dudas concretas, aquí no se inventan.

flowchart LR
  G["Formalizar el juego"] --> T["Construir el árbol"]
  T --> M["Minimax: valor con rival óptimo"]
  M --> AB["Alfa–beta: mismo valor, menos ramas"]
  AB --> L["Límite de recursos"]
  L --> E["Evaluar estados no terminales"]
  E --> A["Elegir una acción ahora"]

1. De una búsqueda ordinaria a una búsqueda con adversarios

En las búsquedas anteriores, el agente controlaba todas sus decisiones y el ambiente respondía mediante un modelo de transición conocido. El algoritmo podía producir un plan, es decir, una secuencia de acciones. En un juego, después de nuestra acción aparece una decisión ajena: no podemos fijar de antemano todo el camino.

Búsqueda de un agenteBúsqueda con adversarios
El agente selecciona todas las acciones del planCada jugador controla solo sus propios turnos
Se busca una ruta hacia una metaSe compara el resultado de distintas respuestas posibles
Una solución puede ser una secuencia fijaLa solución es una estrategia condicionada al estado
El valor suele venir del costo del caminoEl valor viene de utilidad terminal o de una evaluación

Una estrategia del jugador puede escribirse como

No dice “siempre juega a la izquierda”; dice qué acción tomar para cada estado que pudiera alcanzarse. Durante una partida solo se ejecuta una rama, pero para elegirla se razona sobre muchas respuestas posibles.

Precisión sobre el apunte rápido

Minimax no convierte el problema en la “habitación china” ni es, por sí mismo, un agente reflejo. La acción finalmente elegida puede verse como una entrada estado acción, pero fue calculada mediante deliberación sobre consecuencias y respuestas del rival. Un agente reflejo simple no realiza necesariamente ese razonamiento.

1.1 Ejes para clasificar juegos

EjePosibilidadesConsecuencia algorítmica
Resultado de una acciónDeterminista / estocásticoCon azar aparecen nodos de expectativa
InformaciónPerfecta / imperfectaCon información oculta no basta un estado totalmente observable
JugadoresDos / más de dosPuede haber varios turnos y distintas utilidades
Relación de utilidadesSuma cero / juego generalEn suma cero, lo que gana uno lo pierde el otro

Esta clase se concentra en juegos deterministas, por turnos, de dos jugadores, de suma cero y con información perfecta, como gato, ajedrez y damas bajo su formulación clásica. En un juego de suma cero de dos jugadores puede usarse una sola escala:

MAX intenta aumentar esa escala y MIN intenta reducirla. Esto es un convenio de nombres, no un juicio sobre quién es “bueno” o “malo”.


2. Definición formal de un juego

Podemos representar el juego mediante

ComponenteSignificadoEjemplo en gato
Conjunto de estadosTodos los tableros legales y el turno
Estado inicialTablero vacío; juega X
Jugadores
Jugador que mueve en X u O según el turno
Acciones legalesCasillas vacías
Estado después de aplicar Colocar la marca y cambiar turno
¿La partida terminó?Hay tres en línea o no quedan casillas
Resultado terminal para Para X: ganar, empatar, perder
stateDiagram-v2
  [*] --> TurnoMAX: s0
  TurnoMAX --> TurnoMIN: MAX elige a
  TurnoMIN --> TurnoMAX: MIN responde
  TurnoMAX --> Terminal: victoria, derrota o empate
  TurnoMIN --> Terminal: victoria, derrota o empate
  Terminal --> [*]: Utility conocida

2.1 Paso a paso: formular una posición de gato

Supón que X es MAX y le toca jugar.

  1. Estado: guarda las nueve casillas y el dato turno = X.
  2. Acciones: enumera las casillas vacías; una ocupada no es sucesor legal.
  3. Transición: para cada acción, coloca X y cambia el turno a O.
  4. Prueba terminal: revisa si X u O formó una línea; si no, revisa si el tablero se llenó.
  5. Utilidad: solo si es terminal, asigna , o desde la perspectiva de X.
  6. Estrategia: elige la acción cuyo sucesor tenga el mejor valor minimax, no necesariamente la acción que “se vea” mejor de inmediato.

El estado debe incluir el turno

El mismo arreglo de piezas no se interpreta igual si mueve MAX o MIN. La función evita adivinar el tipo de nodo por su profundidad.


3. El valor de un estado y el principio minimax

El valor minimax es la utilidad que MAX puede garantizar desde si ambos jugadores eligen óptimamente. La definición es recursiva:

La frase “suponer que ocurrirá lo peor” significa algo preciso: en los nodos de MIN se supone que el rival elegirá el sucesor de menor utilidad para MAX. No significa escoger siempre el resultado global más pequeño; MAX todavía controla sus propios nodos.

3.1 Ejemplo completo de propagación

La raíz es MAX y sus tres acciones llevan a nodos de MIN:

flowchart TD
  R["MAX"] --> A["MIN"]
  R --> B["MIN"]
  R --> C["MIN"]
  A --> A1["3"]
  A --> A2["12"]
  A --> A3["8"]
  B --> B1["2"]
  B --> B2["4"]
  B --> B3["6"]
  C --> C1["14"]
  C --> C2["5"]
  C --> C3["2"]
PasoOperaciónValor propagadoInterpretación
13Si MAX toma la rama izquierda, MIN fuerza 3
22La rama central garantiza solo 2
32MIN no permitirá que MAX reciba 14
43MAX elige la rama izquierda

No debe elegirse directamente la hoja 14: para llegar a ella MIN tendría que cooperar, y minimax supone que no lo hará.

3.2 La pregunta de examen: ¿empieza el oponente o yo?

La operación de la raíz depende de quién mueve en el estado que se está analizando, no de quién inició históricamente toda la partida.

  • Si mueve MAX en la raíz: hijos MIN; en el árbol anterior el resultado es .
  • Si mueve MIN en la raíz: hijos MAX; esos hijos valen , y , y la raíz vale .

Regla mecánica

  1. Escribe MAX o MIN junto a la raíz.
  2. Alterna por turnos, o consulta si hay más agentes.
  3. Empieza por las hojas.
  4. En cada nodo aplica únicamente la operación escrita en ese nodo.

El laboratorio reproduce el árbol de la diapositiva 17. Cambia quién controla la raíz y avanza una operación a la vez.

Idea central aunque el laboratorio no cargue: con raíz MAX se propagan y se elige 3; con raíz MIN se propagan y se elige 6.


4. Implementación de minimax

Minimax realiza una búsqueda en profundidad y calcula los valores en postorden: primero resuelve los sucesores y después el padre.

4.1 Versión con despachador

La versión recomendada en clase separa tres responsabilidades. VALUE detecta terminales y despacha según el jugador; MAX-VALUE y MIN-VALUE combinan los resultados.

MINIMAX-DECISION(s):
    devolver argmax_a VALUE(Result(s, a))
 
VALUE(s):
    si Terminal(s): devolver Utility(s, MAX)
    si Player(s) = MAX: devolver MAX-VALUE(s)
    si Player(s) = MIN: devolver MIN-VALUE(s)
 
MAX-VALUE(s):
    v ← −∞
    para cada a en Actions(s):
        v ← max(v, VALUE(Result(s, a)))
    devolver v
 
MIN-VALUE(s):
    v ← +∞
    para cada a en Actions(s):
        v ← min(v, VALUE(Result(s, a)))
    devolver v
flowchart TD
  V["VALUE(s)"] --> T{"¿Terminal?"}
  T -->|Sí| U["Utility(s, MAX)"]
  T -->|No| P{"Player(s)"}
  P -->|MAX| X["MAX-VALUE: máximo de VALUE(sucesor)"]
  P -->|MIN| N["MIN-VALUE: mínimo de VALUE(sucesor)"]
  X --> V2["Llamada recursiva a VALUE"]
  N --> V2

El despachador evita acoplar el algoritmo a una alternancia rígida de dos funciones. Con varios adversarios consecutivos, Player(s) puede enviar varios niveles a un combinador MIN antes de volver a MAX. Esto es correcto si esos adversarios comparten el objetivo de minimizar la misma utilidad de MAX. Si cada jugador tiene una utilidad independiente, el juego deja de ser el minimax escalar estudiado aquí.

4.2 Traza de llamadas sobre una rama

Para la rama izquierda del ejemplo:

  1. VALUE(A) detecta que A pertenece a MIN.
  2. MIN-VALUE(A) inicializa .
  3. La hoja 3 hace .
  4. La hoja 12 mantiene .
  5. La hoja 8 mantiene .
  6. A devuelve 3 a la raíz.

La raíz repite el proceso con las demás ramas y conserva el máximo.

4.3 Propiedades

Sean el factor de ramificación y la profundidad hasta estados terminales.

PreguntaRespuesta bajo los supuestos de la clase
¿Es completo?Sí, si el árbol es finito y se exploran todos los sucesores
¿Es óptimo?Sí frente a un rival óptimo, usando utilidades terminales correctas
Tiempo
Espacio con DFS recursiva: un camino y los sucesores pendientes por nivel

En un juego con ciclos o duración no acotada hace falta una regla adicional: detectar repetidos, definir empates, limitar profundidad o aplicar otra formulación. Frente a un rival imperfecto, minimax conserva una garantía de peor caso, aunque puede ser demasiado conservador para explotar errores del oponente.


5. Poda alfa–beta

Alfa–beta produce el mismo valor y la misma decisión que minimax, pero deja de explorar una región cuando demuestra que ya no puede influir en una elección anterior.

Durante una llamada se mantiene una ventana :

  • : mejor valor —límite inferior— que MAX ya puede garantizar en el camino actual;
  • : mejor valor —límite superior— que MIN ya puede garantizar en el camino actual.

Mientras , la rama todavía podría importar. Cuando , aparece un corte.

Tipo de nodoActualizaciónCorte equivalente
MAX;
MIN;

5.1 ¿Por qué es seguro podar?

Supón que la raíz MAX ya encontró una acción con valor 10; por tanto . Al explorar otra acción llega a un nodo MIN y uno de sus hijos vale 2. El valor de ese MIN será a lo sumo 2, aunque sus otros hijos valgan 1000. MAX ya prefiere 10, así que terminar de calcular esa rama no cambiará su decisión.

flowchart LR
  R["MAX ya garantiza 10<br/>α = 10"] --> A["acción conocida: 10"]
  R --> B["nuevo nodo MIN"]
  B --> C["primer hijo: 2<br/>β = 2"]
  B -. "β ≤ α: podar" .-> D["hijos restantes"]

5.2 Ejercicio de la diapositiva 24, paso a paso

Se recorre de izquierda a derecha. La raíz es MAX; debajo hay MIN y después MAX. Las hojas son .

PasoCálculo o relevanteConsecuencia
1Primer MAX: En el MIN izquierdo, Su primera opción vale 10
2Segundo MAX ve 100En ese MAX, Se poda la hoja 8
3MIN izquierdo devuelve En la raíz, MAX ya garantiza 10
4Primer MAX derecho: En el MIN derecho, Esa rama vale a lo sumo 2
5Corte en el MIN derechoSe poda el subárbol con 20 y 4
6Raíz: —Resultado final 10

Se visitan 5 de 8 hojas: . Se podan 8, 20 y 4. Recorrer en otro orden puede reducir la cantidad de cortes, pero nunca cambia el valor minimax.

Idea central aunque el laboratorio no cargue: una poda aparece cuando el valor parcial de una rama ya es peor que una alternativa disponible para un ancestro. El HTML permite comparar el orden izquierda→derecha, que visita 5 hojas, con derecha→izquierda, que visita las 8 en este árbol.

5.3 Propiedades y efecto del orden

AspectoResultado
Valor de la raízIgual que minimax
Peor orden, sin mejora asintótica
Orden ideal, aproximadamente el doble de profundidad con el mismo presupuesto
EspacioMismo orden que la búsqueda DFS,

Los nodos cortados no necesitan un valor exacto. En algunas implementaciones, un retorno temprano representa una cota suficiente para decidir, no una evaluación completa del nodo. Esta es la lectura precisa de la observación de clase de que los valores intermedios “pueden tener errores”: la raíz sigue siendo correcta aunque algunos valores internos no se hayan calculado exactamente.

Buenas jugadas primero sube o baja antes más podas. Por eso el ordenamiento de acciones, la búsqueda iterativa y tablas de transposición pueden mejorar el rendimiento práctico.


6. Juegos demasiado grandes: profundidad limitada

En ajedrez, Go y muchos juegos reales, hace imposible llegar a todas las hojas terminales. La solución práctica combina:

  1. Corte por profundidad o tiempo: explorar solo hasta un horizonte manejable.
  2. Función de evaluación: estimar el valor de los estados no terminales del horizonte.
  3. Profundización iterativa: completar profundidad 1, luego 2, luego 3, etc.; si se agota el tiempo, usar la última decisión terminada.

La recurrencia limitada a profundidad queda:

flowchart TD
  I["Profundidad d = 1"] --> S["Ejecutar alfa–beta hasta d"]
  S --> C{"¿Terminó dentro del presupuesto?"}
  C -->|Sí| G["Guardar mejor acción completa"]
  G --> D["d ← d + 1"]
  D --> S
  C -->|No| R["Devolver la última acción guardada"]

Efecto horizonte

Una búsqueda superficial puede valorar una ganancia inmediata sin ver la pérdida que ocurre justo después del corte. Profundizar suele reducir este problema, pero aumenta exponencialmente el costo y no vuelve perfecta una mala evaluación.


7. Funciones de evaluación

Una función de evaluación estima el valor minimax de una posición no terminal:

La forma lineal más común combina rasgos medibles:

  • extrae una propiedad: diferencia de material, movilidad, seguridad, distancia a una meta.
  • expresa su importancia y su dirección.
  • Una buena evaluación asigna valores mayores a posiciones normalmente mejores para MAX.

7.1 Ejemplo en damas

El ejemplo de Berkeley usa

donde cuenta damas o reyes y fichas normales. Para una posición con , , y :

El valor positivo favorece a MAX según este modelo; no garantiza que la posición sea una victoria. La evaluación ignora, por ejemplo, movilidad, amenazas y estructura.

Precisión sobre los pesos

Los pesos no necesitan pertenecer a ni sumar 1. Si se usan rasgos separados para las piezas propias y rivales, los del rival suelen recibir pesos negativos. Si el rasgo ya es una diferencia, puede usarse un peso positivo. Multiplicar todos los pesos por una constante positiva conserva el orden de posiciones, aunque puede afectar otros umbrales del programa.

7.2 Diseñar y comprobar una evaluación

  1. Elegir la perspectiva: aquí, valores altos favorecen a MAX.
  2. Proponer rasgos baratos de calcular y relevantes para ganar.
  3. Normalizar escalas si un rasgo domina solo por usar números mayores.
  4. Elegir pesos mediante conocimiento, datos o experimentación.
  5. Probar posiciones conocidas y revisar si su orden es razonable.
  6. Medir partidas completas; acertar ejemplos aislados no basta.

El laboratorio permite cambiar los pesos, las cantidades de piezas y el horizonte. También muestra cómo crece con un solo nivel adicional.

Idea central aunque el laboratorio no cargue: evaluar más profundo reduce la dependencia de la estimación, pero el número de hojas crece exponencialmente. Alfa–beta compra profundidad adicional sin alterar minimax; Eval compra una decisión aproximada cuando ni siquiera esa profundidad es suficiente.

7.3 Utilidad terminal no es evaluación heurística

Utilidad terminalFunción de evaluación
Se aplica cuando el resultado ya se conoceSe aplica a un corte no terminal
Es parte de las reglas del problemaEs una estimación diseñada por nosotros
Permite la garantía óptima de minimax completoPuede ordenar estados incorrectamente
Ejemplo: ganar Ejemplo: ventaja de material

8. Errores frecuentes y cómo evitarlos

  1. Elegir la mejor hoja para MAX sin considerar a MIN. Propaga nivel por nivel.
  2. Suponer que la raíz siempre es MAX. Lee Player(s); si mueve el rival, la raíz es MIN.
  3. Confundir quién inició la partida con quién mueve ahora. Solo importa el jugador del estado analizado.
  4. Aplicar mínimo y máximo de arriba hacia abajo. Los valores nacen en hojas y suben.
  5. Creer que alfa–beta es aproximado. La poda exacta conserva la decisión de minimax; la aproximación aparece al cortar por recursos y usar Eval.
  6. Pensar que pertenece siempre al nodo MAX más cercano y al MIN más cercano. Son cotas acumuladas de decisiones en todo el camino actual.
  7. Creer que un nodo podado “vale cero”. Su valor queda desconocido o acotado; no se sustituye por cero.
  8. Mezclar escalas de jugadores. Toda la recurrencia de dos jugadores usa la utilidad desde la misma perspectiva, normalmente MAX.

9. Mapa de decisiones

flowchart TD
  P{"¿Hay adversario?"}
  P -->|No| BUS["Búsqueda ordinaria"]
  P -->|Sí| Z{"¿Determinista y suma cero?"}
  Z -->|Sí| OPT{"¿Se llega a terminales?"}
  OPT -->|Sí| MM["Minimax"]
  OPT -->|No| DL["Minimax limitado + Eval"]
  MM --> AB["Añadir alfa–beta para podar"]
  DL --> AB2["Añadir alfa–beta e iteración"]
  Z -->|Azar conocido| EX["Expectimax · siguiente tema relacionado"]
  Z -->|Utilidades independientes| GG["Juego general · otra formulación"]

Resumen después de clase

La búsqueda con adversarios devuelve una estrategia porque cada jugador controla solo una parte del árbol. Minimax calcula, desde las hojas, el mejor resultado que MAX puede garantizar contra un MIN óptimo. Alfa–beta mantiene cotas y para omitir ramas irrelevantes sin cambiar la respuesta; un buen orden aumenta las podas. Cuando no se puede llegar a estados terminales, se limita la profundidad y se usa una función de evaluación, sacrificando la garantía de optimalidad a cambio de una decisión dentro del presupuesto.

Referencias

Acciones adicionales

  • Resolver el árbol de minimax empezando con MAX y después con MIN sin mirar la solución.
  • Recorrer el ejercicio alfa–beta de la diapositiva 24 en ambos órdenes y anotar cada actualización de y .
  • Diseñar tres rasgos para evaluar posiciones de gato y explicar qué errores puede cometer cada uno.