Intermedio 0 resueltos 0% de aceptación

Poda alfa-beta

Evalúa un árbol de juego con minimax y poda alfa-beta, y cuenta cuántas hojas examina realmente la búsqueda.

Lo que aprenderás

  • Seguir las cotas alfa y beta
  • Saltar ramas que no pueden cambiar el resultado
  • Medir cuánto trabajo ahorra la poda

Problema

Ver original (inglés)

La poda alfa-beta da la misma respuesta que minimax mientras se salta las ramas que no pueden cambiar el resultado. Lleva dos cotas: alpha, la mejor puntuación que MAX ya tiene asegurada, y beta, la mejor puntuación que MIN ya tiene asegurada.

El árbol de juego es completo: cada nodo interno tiene branching hijos y todas las hojas están a la misma profundidad. leaves lista las puntuaciones de las hojas de izquierda a derecha. La raíz es un nodo MAX y los niveles se alternan MAX, MIN, MAX, …

Recorre los hijos de izquierda a derecha, empezando con alpha = -∞ y beta = +∞:

  • 'En un nodo MAX, después de cada hijo: best = max(best, value), luego alpha = max(alpha, best).'
  • 'En un nodo MIN, después de cada hijo: best = min(best, value), luego beta = min(beta, best).'
  • En cuanto alpha ≥ beta, sáltate los hijos restantes del nodo.

Implementa alpha_beta(leaves, branching).

Entrada

leaves: Las puntuaciones de las hojas, de izquierda a derecha; la longitud es una potencia de branching.

branching: Hijos por nodo interno.

Salida

Devuelve [value, evaluated]: el valor minimax de la raíz y cuántas hojas se evaluaron.

Restricciones

2 ≤ branching ≤ 5, longitud de leaves = branching^depth con 1 ≤ depth ≤ 8, como máximo 10.000 hojas

-1.000 ≤ cada hoja ≤ 1.000

Ejemplos

Ejemplo 1
Entrada:
leaves = [3, 12, 8, 2, 4, 6, 14, 5, 2]
branching = 3

Salida esperada:
expected = [3, 7]
Entrada:
std::vector<long long> leaves = {3, 12, 8, 2, 4, 6, 14, 5, 2};
long long branching = 3;

Salida esperada:
std::vector<long long> expected = {3, 7};
Entrada:
long[] leaves = new long[] {3, 12, 8, 2, 4, 6, 14, 5, 2};
long branching = 3;

Salida esperada:
long[] expected = new long[] {3, 7};

Explicación

El primer nodo MIN ve 3, 12, 8 y devuelve 3, así que alpha = 3. El segundo nodo MIN ve 2, beta = 2 ≤ alpha, así que se saltan 4 y 6. El tercero ve 14, 5, 2 y devuelve 2. El valor de la raíz es max(3, 2, 2) = 3 tras 7 de las 9 hojas.

Ejemplo 2
Entrada:
leaves = [5, 6, 7, 4]
branching = 2

Salida esperada:
expected = [5, 4]
Entrada:
std::vector<long long> leaves = {5, 6, 7, 4};
long long branching = 2;

Salida esperada:
std::vector<long long> expected = {5, 4};
Entrada:
long[] leaves = new long[] {5, 6, 7, 4};
long branching = 2;

Salida esperada:
long[] expected = new long[] {5, 4};

Explicación

El nodo MIN izquierdo evalúa 5 y 6 y devuelve 5, así que alpha = 5. El nodo MIN derecho evalúa 7 (beta = 7) y luego 4 (beta = 4 ≤ 5). Se evalúan las 4 hojas y el valor es 5.

Referencias

Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.

Aprende de otros

Soluciones de la comunidad

Aún no hay soluciones publicadas. Resuelve este reto para compartir la primera.