Solución del parcial Determinación de grupos para el TPO Introducción al backtracking Programación III Ricardo Wehbe UADE 8 de octubre de 2019 Ricardo Wehbe Programación III - Clase 09 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto Introducción Hay problemas para los cuales no se conoce un algoritmo eficiente de resolución. En estos casos, la única solución posible es la exploración directa de todas las posibilidades (brute force). La técnica de backtracking es un método de búsqueda de soluciones exhaustivo sobre grafos acíclicos. Este método puede optimizarse con la “poda” de alternativas que no conduzcan a una solución. Los grafos representan las posibles alternativas por ser evaluadas. Ricardo Wehbe Programación III - Clase 09 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto Backtracking . Esquema general Se representan todas las posibilidades en un árbol (como ya sabemos, decir que un grafo conexo es acíclico equivale a decir que es un árbol). Se busca la solución recorriendo el árbol (de una determinada forma según la estrategia). Hay partes del árbol (sub-árboles) que se evitan porque no pueden contener soluciones (poda). La solución del problema se presenta en una lista ordenada (x1 , x2 , . . . , xn ). Cada elemento xi de la lista se escoge entre un conjunto de candidatos. Cada lista representa un estado. A veces se buscan todas las soluciones; a veces, nos conformamos con una (“estado solución”). A veces no existe ninguna solución. Ricardo Wehbe Programación III - Clase 09 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto Elementos del algoritmo general de backtracking Para aplicar backtracking debemos proveer los datos S de cada instancia particular y cinco parámetros: root, reject, accept, first y next. root(T ) devuelve el candidato parcial en la raíz del árbol de búsqueda T . reject(T , c) devuelve true si no vale la pena completar el candidato c. accept(T , c) devuelve true si el candidato c es una solución de T y false si no. first(T , c) genera la primera extensión del candidato c. next(T , c) genera la siguiente extensión luego de c. Ricardo Wehbe Programación III - Clase 09 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El algoritmo general de backtracking Se comienza con la llamada backtracking (T , root(T )). El pseudo-código es el siguiente: 1 2 3 4 5 6 7 8 9 10 11 12 algorithm backtracking (T , c) if reject(T , c) return endif if accept(T , c) return (T , c) endif s ← first(T , c) while s 6= NULL backtracking (T , s) s ← next(T , c) endwhile Ricardo Wehbe Programación III - Clase 09 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas La dama (o reina) es la pieza más poderosa en el juego del ajedrez. Se puede mover a cualquier casilla situada en su misma fila, columna o diagonales. El problema consiste en ubicar n damas en un tablero de n × n casillas (con n ≥ 4) de tal manera que ninguna esté en el radio de acción de otra. Por lo tanto, las damas deben ubicarse una en cada fila y cada columna. Ricardo Wehbe Programación III - Clase 09 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Q Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Q Q Q Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Q Q 7Q Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Q Q 7Q Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Q Q Q 7Q Q Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Q Q Q 7Q Q Q Q Q Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Q Q Q 7Q Q Q 7 Q Q Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Q Q Q 7Q Q Q 7 Q Q Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Q Q Q 7Q Q Q 7 Q Q Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Q Q Q 7Q Q Q 7 Q Q Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Q Q Q Q 7Q Q Q 7 Q Q Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Q Q Q Q Q 7Q Q Q 7 Q Q Q Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Q Q Q Q Q 7Q Q Q Q Q 7 Q Q Q Q Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Q Q Q Q Q 7Q Q Q Q Q 7 Q Q Q Q Q Q Q Q Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de las n damas. Un ejemplo con n = 4 Q Q Q Q Q 7Q Q Q X Q Q 7 Q Q Q Q Q Q Q Q Ricardo Wehbe Programación III - Clase 09 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto Un algoritmo para el problema de las n damas Teniendo en cuenta que nunca puede haber más de una dama en una fila o en una columna, se puede expresar la solución en un vector de n posiciones donde se indique, para cada fila, en qué columna se encuentra la dama correspondiente. Cada posición contendrá entonces un número de 1 a n. No es necesario verificar las filas, pues no puede haber más de una dama en cada posición del vector; para chequear las columnas, es necesario verificar que no haya repeticiones. Para verificar las diagonales, observemos que las casillas diagonales que “ve” una dama situada en la fila i y la columna j son las que se encuentran en las filas i ± k (en nuestro caso sólo nos interesarán los valores mayores) y columnas j ± k. Ricardo Wehbe Programación III - Clase 09 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto Un algoritmo para el problema de las n damas. Parte 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 algorithm Queens input: S array [1..n] of integer; e: integer output: boolean ok ← false S[e] ← 0 while (S[e] < n + 1 and not(ok)) S[e] ← S[e] + 1 if DamaOK (S, e) if e = n ok ← true else ok ← Queens(S, e + 1) endif endif endwhile return ok Ricardo Wehbe Programación III - Clase 09 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto Un algoritmo para el problema de las n damas. Parte 2 1 2 3 4 5 6 7 8 9 algorithm DamaOK input: S array [1..n] of integer; e: integer output: boolean for i = 1 to e − 1 if S[i] = S[e] or |S[i] − S[e]| = |i − e| return false endif endfor return true Ricardo Wehbe Programación III - Clase 09 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto Un algoritmo para el problema de las n damas. Parte 2 1 2 3 4 5 6 7 8 9 algorithm DamaOK input: S array [1..n] of integer; e: integer output: boolean for i = 1 to e − 1 if S[i] = S[e] or |S[i] − S[e]| = |i − e| return false endif endfor return true Observe: aquí tenemos O(n); tenemos además a = n, b = 1; Por lo tanto, estamos en O(nn ). Horrible. Ricardo Wehbe Programación III - Clase 09 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El problema de la suma del subconjunto El problema se puede plantear así: dado un conjunto de n números C y un valor v , mostrar todos los subconjuntos de C en los cuales la suma de sus elementos sea v . Puesto que en una solución cada elemento de C está o no está, la solución puede expresarse como un vector booleano con n posiciones. Ricardo Wehbe Programación III - Clase 09 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto Antes de seguir. Un ejemplo C = {5, 10, 6, 7} v = 11 0 5 0 15 5 21 28 15 21 22 10 11 15 18 5 11 12 0 16 5 23 10 16 17 6 10 13 0 6 7 0 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto Antes de seguir. Un ejemplo C = {5, 10, 6, 7} v = 11 0 5 0 15 5 21 28 15 21 22 10 11 15 18 5 11 12 0 16 5 23 10 16 17 6 10 13 0 6 7 0 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto Antes de seguir. Un ejemplo C = {5, 10, 6, 7} v = 11 0 5 0 15 5 21 28 15 21 22 10 11 15 18 5 11 12 0 16 5 23 10 16 17 6 10 13 0 6 7 0 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto Antes de seguir. Un ejemplo C = {5, 10, 6, 7} v = 11 0 5 0 15 5 21 15 10 11 28 21 22 15 7 7 7 7 18 5 11 12 0 16 5 23 10 16 17 6 10 13 0 6 7 0 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto Antes de seguir. Un ejemplo C = {5, 10, 6, 7} v = 11 0 5 0 15 5 21 15 10 11 28 21 22 15 7 7 7 7 18 5 11 12 0 16 5 23 10 16 17 6 10 13 0 6 7 0 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto Antes de seguir. Un ejemplo C = {5, 10, 6, 7} v = 11 0 5 0 15 5 21 15 10 11 28 21 22 15 7 7 7 7 18 5 11 12 0 16 5 23 10 16 17 6 10 13 0 6 7 0 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto Antes de seguir. Un ejemplo C = {5, 10, 6, 7} v = 11 0 5 0 15 5 21 15 10 11 5 28 21 22 15 18 11 7 7 7 7 7 X 12 0 16 5 23 10 16 17 6 10 13 0 6 7 0 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto Antes de seguir. Un ejemplo C = {5, 10, 6, 7} v = 11 0 5 0 15 5 21 15 10 11 5 0 16 10 6 0 28 21 22 15 18 11 12 5 23 16 17 10 13 6 7 0 7 7 7 7 7 X 7 7 7 7 7 7 7 7 7 7 Ricardo Wehbe Programación III - Clase 09 Solución del parcial Determinación de grupos para el TPO Introducción al backtracking El problema de las n damas Suma de subconjunto El algoritmo para la suma del subconjunto 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 algoritmo SubSetSum input v , ActSol : array [1..n] of integer; m, etapa, ActSum: integer for i = 0 to 1 ActSol [etapa] ← i ActSum ← ActSum + v [etapa] ∗ i if etapa = n if ActSum = m display (ActSol ) endif else if ActSum < m SubSetSum(v , ActSol , m, etapa + 1, ActSum) endif endif endfor Observe que a = 2; b = 1 y k = 0. Tenemos entonces O(2n ). Ricardo Wehbe Programación III - Clase 09 Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Partición en mitades iguales Dada una colección de n números enteros, se desea encontrar, si existe, una partición de la colección en dos sub-colecciones disjuntas tales que la suma de ambas es igual y que cualquier elemento de la colección original se encuentra en una u otra de las sub-colecciones. La estrategia consistirá en colocar todos los elementos originalmente en una de las sub-colecciones e ir haciendo pasar selectivamente algunos elementos a la otra y verificar si las respectivas sumas de elementos son iguales. Ricardo Wehbe Programación III - Clase 10 Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Antes de seguir. Un ejemplo (2, 5, 8, 3, 2) Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Antes de seguir. Un ejemplo (2, 5, 8, 3, 2) 0:20 Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Antes de seguir. Un ejemplo (2, 5, 8, 3, 2) 2 0:20 2:18 0:20 Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Antes de seguir. Un ejemplo (2, 5, 8, 3, 2) 7:13 5:15 2 0:20 5 2:18 2:18 5 0:20 0:20 Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Antes de seguir. Un ejemplo (2, 5, 8, 3, 2) 15:5 13:7 8 8 7:13 5:15 2 7:13 0:20 5 2:18 5:15 5 0:20 10:10 8:12 8 2:18 2:18 8 0:20 0:20 Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Antes de seguir. Un ejemplo 18:2 (2, 5, 8, 3, 2) 3 13:7 15:5 8 13:7 8 7:13 10:10 16:4 3 15:5 5:15 3 2 7:13 8:12 3 0:20 5:15 7:13 5:15 5 13:7 2:18 3 5 0:20 8:12 10:10 8 2:18 5:15 3 2:18 2:18 11:9 3 10:10 8:12 8 0:20 3:17 3 0:20 0:20 Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Antes de seguir. Un ejemplo 2 20:0 2 18:2 2 17:3 (2, 5, 8, 3, 2) 3 18:2 15:5 15:5 8 10:10 13:7 5:15 3 2 15:5 13:7 2 10:10 9:11 2 8 7:13 2 12:8 16:4 13:7 15:5 18:2 16:4 3 2 7:13 8:12 3 0:20 10:10 8:12 5:15 2 7:13 7:13 5:15 7:13 5:15 2 15:5 5 13:7 2 12:8 2:18 3 13:7 8 2:18 2 5:15 3 5:15 2 2:18 2:18 0:20 2:18 13:7 11:9 3 11:9 8:12 10:10 4:16 2 10:10 10:10 7:13 5 2 10:10 8:12 8 8:12 0:20 2 5:15 3:17 3 3:17 0:20 2 2:18 0:20 0:20 Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Antes de seguir. Un ejemplo 2 20:0 2 18:2 2 17:3 (2, 5, 8, 3, 2) 3 18:2 15:5 15:5 8 10:10 13:7 5:15 3 2 15:5 13:7 2 10:10 9:11 2 8 7:13 2 12:8 16:4 13:7 15:5 18:2 16:4 3 2 7:13 8:12 3 0:20 10:10 8:12 5:15 2 7:13 7:13 5:15 7:13 5:15 2 15:5 5 13:7 2 12:8 2:18 3 13:7 8 2:18 2 5:15 3 5:15 2 2:18 2:18 0:20 2:18 13:7 11:9 3 11:9 8:12 10:10 4:16 2 10:10 10:10 7:13 5 2 10:10 8:12 8 8:12 0:20 2 5:15 3:17 3 3:17 0:20 2 2:18 0:20 0:20 Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Antes de seguir. Un ejemplo 2 20:0 2 18:2 2 17:3 (2, 5, 8, 3, 2) 3 18:2 15:5 15:5 8 10:10 13:7 5:15 3 2 15:5 13:7 2 10:10 9:11 2 8 7:13 2 12:8 16:4 13:7 15:5 18:2 16:4 3 2 7:13 8:12 3 0:20 10:10 8:12 5:15 2 7:13 7:13 5:15 7:13 5:15 2 15:5 5 13:7 2 12:8 2:18 3 13:7 8 2:18 2 5:15 3 5:15 2 0:20 11:9 2 10:10 8:12 8 8:12 0:20 2 5:15 3:17 3 2:18 13:7 11:9 3 8:12 10:10 4:16 2 10:10 10:10 7:13 5 3:17 0:20 2:18 2 2:18 0:20 2:18 0:20 Ricardo Wehbe Programación III - Clase 10 Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad El algoritmo para la partición en partes iguales 1 2 3 3 4 algoritmo Partition input v : array [1..n] of integer initializeArray(s): [1..n] of integer PartitionRec(v,s,1) end 1 2 3 4 5 6 7 8 9 10 11 12 13 algoritmo PartitionRec input v ,s: array [1..n] of integer, e: integer for i = 0 to 1 s[e] ← i if e = n s1 ← 0 ; s2 ← 0 for j = 1 to n if s[j] = 0 // subconjunto izquierdo s1 ← s1 + v [j] else // subconjunto derecho s2 ← s2 + v [j] endif endfor 14 15 16 17 18 19 20 21 a = 2, b = 1, k = 1 if s1 = s2 print(s) endif else PartitionRec(v , s, e + 1) endif endfor end Ricardo Wehbe O(n2n ) Programación III - Clase 10 Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en grafos Para el recorrido de todos los nodos de un grafo existen dos criterios de búsqueda. La búsqueda en amplitud (breadth-first search, o BFS): comienza la búsqueda por un nodo, toma luego sus adyacentes, visita cada uno de ellos y luego los adyacentes de los adyacentes. La búsqueda en profundidad (depth-first search, o DFS): comienza la búsqueda por un nodo, toma luego sus adyacentes y a partir de uno de ellos realiza a su vez la búsqueda en profundidad. Cuando termina la búsqueda para ese nodo adyacente continúa con el siguiente. Ricardo Wehbe Programación III - Clase 10 Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en grafos Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en grafos Ricardo Wehbe Programación III - Clase 10 Repaso de la clase anterior Algunos ejemplos de backtracking Búsqueda en profundidad Partición en partes iguales Búsqueda en profundidad Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B nodo actual: adyacentes: F D C visitados: pila: Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D C nodo actual: ninguno adyacentes: ∅ visitados: ∅ pila: ∅ Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D C nodo actual: A adyacentes: {B, C , D, E } visitados: {A} pila: ∅ Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D C nodo actual: B adyacentes: {C , F } visitados: {A, B} pila: A : {C , D, E } Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D C nodo actual: C adyacentes: {D, E } visitados: {A, B, C } pila: B : {F } A : {C , D, E } Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D C nodo actual: D adyacentes: {E } visitados: {A, B, C , D} pila: C : {E } B : {F } A : {C , D, E } Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D C nodo actual: E adyacentes: ∅ visitados: {A, B, C , D, E } pila: D :∅ C : {E } B : {F } A : {C , D, E } Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D C nodo actual: D adyacentes: ∅ visitados: {A, B, C , D, E } pila: C : {E } B : {F } A : {C , D, E } Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D C nodo actual: C adyacentes: {E } visitados: {A, B, C , D, E } pila: B : {F } A : {C , D, E } Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D C nodo actual: C adyacentes: ∅ visitados: {A, B, C , D, E } pila: B : {F } A : {C , D, E } Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D C nodo actual: B adyacentes: {F } visitados: {A, B, C , D, E } pila: A : {C , D, E } Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D nodo actual: F adyacentes: {E } visitados: {A, B, C , D, E , F } pila: B :∅ A : {C , D, E } C Ricardo Wehbe Programación III - Clase 10 Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D nodo actual: F adyacentes: ∅ visitados: {A, B, C , D, E , F } pila: B :∅ A : {C , D, E } C Ricardo Wehbe Programación III - Clase 10 Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D C nodo actual: B adyacentes: ∅ visitados: {A, B, C , D, E , F } pila: A : {C , D, E } Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D C nodo actual: A adyacentes: {C , D, E } visitados: {A, B, C , D, E , F } pila: ∅ Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D C nodo actual: A adyacentes: {D, E } visitados: {A, B, C , D, E , F } pila: ∅ Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D C nodo actual: A adyacentes: {E } visitados: {A, B, C , D, E , F } pila: ∅ Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad Búsqueda en profundidad A E B F D C nodo actual: A adyacentes: ∅ visitados: {A, B, C , D, E , F } pila: ∅ Repaso de la clase anterior Algunos ejemplos de backtracking Partición en partes iguales Búsqueda en profundidad El algoritmo de búsqueda en profundidad 1 2 3 4 algoritmo Depth-First Search input G : graph, v : node DFS(G , v , ∅) end 1 2 3 4 5 6 7 8 9 10 11 12 13 algoritmo DFS input G : graph, v : node, visitados: set agregarElemento(visitados, v ) print(v ) ady ← adyacentes(G , v ) while ady 6= ∅ a ← elegir (ady ) eliminar (ady , a) if not (pertenece(visitados, a)) DFS(G , a, visitados) endif endwhile end Ricardo Wehbe a = n, b = 1, k = 1 O(nn ) Programación III - Clase 10 Repaso de la clase anterior Juegos. El algoritmo MiniMax Juegos y árboles Numerosos juegos que tienen un número finito de estados (ajedrez, damas, ta-te-ti, nim, cuatro-en-línea, &c.) pueden ser modelados por árboles y permiten la aplicación de la técnica de backtracking . Cada nivel del árbol corresponde a una etapa y al turno de un jugador. Supondremos dos jugadores hipotéticos, Alicia y Bruno (que llamaremos A y B), que efectuarán una jugada por turno, comenzando siempre (ladies first) A. Es decir, en la raíz del árbol (nivel 0) juega A; en el nivel 1, responde B; en el nivel 2 responde A y así sucesivamente. En síntesis, un árbol de juego es un árbol dirigido donde cada vértice representa una posición o estado y cada arista una movida. Ricardo Wehbe Programación III - Clase 11 Repaso de la clase anterior Juegos. El algoritmo MiniMax Un ejemplo. El juego de los corchos Dos amigos resuelve jugar al siguiente juego con los once corchos de las botellas Château d’Yquem (Sauternes, cosecha 2000) que acaban de tomarse. Se juega por pares. Se colocan los once corchos sobre la mesa y cada jugador debe retirar uno, dos o tres corchos del grupo. Ningún jugador puede “pasar”. Pierde el jugador que retira el último corcho. El juego se representa por un árbol (en nuestro caso un grafo) cuyos vértices están anotados con el número actual de corchos que quedan. Ricardo Wehbe Programación III - Clase 11 Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 6 6 MAX 5 4 3 4 3 2 1 3 2 1 0 2 1 0 1 0 MIN MAX 0 0 MIN MAX MIN MAX Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 6 6 MAX 5 4 3 4 3 2 1 3 2 1 0 2 1 0 MAX 1 0 MIN gana MIN 0 MAX gana MIN MAX 0 MIN MAX Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 6 6 MAX 5 4 3 4 3 2 1 3 2 1 0 2 1 0 MAX 1 0 MIN gana MIN 0 MAX gana MIN MAX 0 MIN MAX Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 6 6 MAX 5 4 3 4 3 2 1 3 2 1 0 2 1 0 MAX 1 0 MIN gana MIN 0 MAX gana MIN MAX 0 MIN MAX Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 6 6 MAX 5 4 3 4 3 2 1 3 2 1 0 2 1 0 MAX 1 0 MIN gana MIN 0 MAX gana MIN MAX 0 MIN MAX Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 6 6 MAX 5 4 3 4 3 2 1 3 2 1 0 2 1 0 MAX 1 0 MIN gana MIN 0 MAX gana MIN MAX 0 MIN MAX Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 6 6 MAX 5 4 3 4 3 2 1 3 2 1 0 2 1 0 MAX 1 0 MIN gana MIN 0 MAX gana MIN MAX 0 MIN MAX Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 6 6 MAX 5 4 3 4 3 2 1 3 2 1 0 2 1 0 MAX 1 0 MIN gana MIN 0 MAX gana MIN MAX 0 MIN MAX Ricardo Wehbe Programación III - Clase 11 Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 11 11 MAX 10 9 8 9 8 7 6 8 7 6 5 7 6 5 6 5 MIN MAX 5 MIN MAX MIN Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 11 11 MAX 10 9 8 9 8 7 6 8 7 6 5 7 6 5 6 5 MIN MAX MAX gana MIN gana 5 MIN MAX MIN Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 11 11 MAX 10 9 8 9 8 7 6 8 7 6 5 7 6 5 6 5 MIN MAX MAX gana MIN gana 5 MIN MAX MIN Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 11 11 MAX 10 9 8 9 8 7 6 8 7 6 5 7 6 5 6 5 MIN MAX MAX gana MIN gana 5 MIN MAX MIN Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 11 11 MAX 10 9 8 9 8 7 6 8 7 6 5 7 6 5 6 5 MIN MAX MAX gana MIN gana 5 MIN MAX MIN Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 11 11 MAX 10 9 8 9 8 7 6 8 7 6 5 7 6 5 6 5 MIN MAX MAX gana MIN gana 5 MIN MAX MIN Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 11 11 MAX 10 9 8 9 8 7 6 8 7 6 5 7 6 5 6 5 MIN MAX 5 MIN MAX MIN MAX gana Los vértices azules se marcan con +1 MIN gana Los vértices rojos se marcan con -1 Repaso de la clase anterior Juegos. El algoritmo MiniMax El juego de los corchos a partir de la posición 11 MAX +1 MIN -1 +1 -1 -1 +1 +1 +1 -1 -1 -1 +1 +1 +1 -1 -1 +1 MAX -1 MIN MAX MIN MAX gana Los vértices azules se marcan con +1 MIN gana Los vértices rojos se marcan con -1 Ricardo Wehbe Programación III - Clase 11 Repaso de la clase anterior Juegos. El algoritmo MiniMax El algoritmo MiniMax Un nodo en el que A gana se marca con +1; un nodo en el que B gana se marca con −1. Se mira el resultado (beneficio) desde el punto de vista de A. Si A gana, el beneficio es positivo; si B gana, el beneficio es negativo. Entonces A busca maximizar el resultado; B busca minimizarlo. Usualmente se utiliza la nomenclatura estándar MAX y MIN. Ricardo Wehbe Programación III - Clase 11 Repaso de la clase anterior Juegos. El algoritmo MiniMax Algoritmo MiniMax de backtracking para juegos 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 algorithm MiniMax input e: estado, n: nivel // estado es un vértice; nivel es MAX o MIN if hoja(e, n) return result(e, n) // Calcula la solución; devuelve -1, +1 o 0 else if n = MAX valor ← −∞ else valor ← +∞ endif foreach sig ← hijo(e) do if n = MAX valor ← max(valor , MiniMax(sig , MIN)) else valor ← min(valor , MiniMax(sig , MAX )) endif endforeach endif returnvalor end Ricardo Wehbe Programación III - Clase 11 Repaso de la clase anterior Juegos. El algoritmo MiniMax Un algoritmo para el juego de los corchos 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 algorithm CorkBack input e, n: integer // e estado (cantidad de corchos; n jugador (+1 o -1) output juego: array of integer if e = 0 return n // si no quedan corchos, el jugador de turno gana else prox ← 1 // próxima jugada valor ← −1 ∗ n poda ← false while (prox ≤ 3) and (prox ≤ e) and not poda e ← e − prox if n = 1 valor ← max(valor , MatchesBack(e, −1 ∗ n)) else valor ← min(valor , MatchesBack(e, −1 ∗ n)) endif if (n ∗ valor ) = 1 // n = 1 y valor = 1 o n = −1 y valor = −1 poda ← true else e ← e + prox endif prox ← prox + 1 endwhile endif return valor end Tenemos a ≤ 3, b ≤ 3 y k = 0. Entonces Θ(3n ). Ricardo Wehbe Programación III - Clase 11 Repaso de la clase anterior Juegos. El algoritmo MiniMax Back to classics. Ta-te-ti El Ta-te-ti es un juego en el que dos jugadores juegan entre sí sobre un tablero de 3 × 3, cada uno con un tipo de ficha. El jugador que logra cubrir una fila, columna o diagonal con sus fichas gana el juego. Puede haber empate. Ricardo Wehbe Programación III - Clase 11 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ (alfa-beta) No es un algortmo nuevo sino sólo una optimización del algoritmo MiniMax. Cada nodo tiene dos parámetros adicionales, α y β. α es el mejor valor que puede obtener MAX y β es el mejor valor que puede obtener MIN. Los parámetros α y β se pasan hacia abajo, pero no retornan hacia arriba. La idea principal es que si α ≥ β, entonces ambos jugadores saben que su rival no tomará ese camino, pues la otra rama le promete un mejor valor. Ricardo Wehbe Programación III - Clase 11 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- B:- C:- D:- H:3 E:- I:5 J:6 F:- K:9 L:1 G:- M:2 N:0 O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- α = −∞ β = +∞ B:- C:- D:- H:3 E:- I:5 J:6 F:- K:9 L:1 G:- M:2 El proceso comienza con el nodo A. Los valores iniciales son α = −∞ y β = +∞. N:0 O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- D:- H:3 B:- α = −∞ β = +∞ α = −∞ β = +∞ E:- I:5 J:6 α = −∞ β = +∞ α = −∞ β = +∞ K:9 F:- L:1 C:- α = −∞ β = +∞ α = −∞ β = +∞ G:- M:2 El proceso comienza con el nodo A. Los valores iniciales son α = −∞ y β = +∞. Estos valores se pasan al resto de los vértices. N:0 α = −∞ β = +∞ O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- D:- H:3 B:- α = −∞ β = +∞ α = −∞ β = +∞ E:- I:5 J:6 α = −∞ β = +∞ α = −∞ β = +∞ K:9 F:- L:1 C:- α = −∞ β = +∞ α = −∞ β = +∞ G:- M:2 N:0 α = −∞ β = +∞ O:-1 El nodo A elige el máximo de B y C ; llama primero a B. Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- D:- H:3 B:- α = −∞ β = +∞ α = −∞ β = +∞ E:- I:5 J:6 α = −∞ β = +∞ α = −∞ β = +∞ K:9 F:- L:1 C:- α = −∞ β = +∞ α = −∞ β = +∞ G:- M:2 N:0 El nodo B elige el mínimo de D y E ; llama primero a D. α = −∞ β = +∞ O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- D:- H:3 B:- α = −∞ β = +∞ α = −∞ β = +∞ E:- I:5 J:6 α = −∞ β = +∞ α = −∞ β = +∞ K:9 F:- L:1 C:- α = −∞ β = +∞ α = −∞ β = +∞ G:- M:2 N:0 El nodo D elige el máximo de H e I ; llama primero a H. α = −∞ β = +∞ O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- D:- H:3 B:- α = −∞ β = +∞ α=3 β = +∞ E:- I:5 J:6 D: α = max(−∞, 3) = 3 α = −∞ β = +∞ α = −∞ β = +∞ K:9 F:- L:1 C:- α = −∞ β = +∞ α = −∞ β = +∞ G:- M:2 N:0 α 6≥ β El nodo H devuelve 3. El valor de α se actualiza a max(−∞, 3) = 3. Como la condición α ≥ β no se cumple, se llama a I . α = −∞ β = +∞ O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- D:- H:3 B:- α = −∞ β = +∞ α=5 β = +∞ E:- I:5 J:6 α = −∞ β = +∞ α = −∞ β = +∞ K:9 F:- L:1 C:- α = −∞ β = +∞ α = −∞ β = +∞ G:- M:2 D: α = max(−∞, 3) = 3 α 6≥ β α = max(3, 5) = 5 α 6≥ β El nodo I devuelve 5. El valor de α se actualiza a max(3, 5) = 5. N:0 α = −∞ β = +∞ O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- D:5 H:3 B:- α = −∞ β = +∞ α=5 β = +∞ E:- I:5 J:6 α = −∞ β = +∞ α = −∞ β = +∞ K:9 F:- L:1 El valor de D es max(3, 5) = 5 C:- α = −∞ β = +∞ α = −∞ β = +∞ G:- M:2 N:0 α = −∞ β = +∞ O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- D:5 H:3 B:- α = −∞ β =5 α=5 β = +∞ E:- I:5 J:6 B: β = min(+∞, 5) = 5 α = −∞ β = +∞ α = −∞ β = +∞ K:9 F:- L:1 C:- α = −∞ β = +∞ α = −∞ β = +∞ G:- M:2 N:0 α = −∞ β = +∞ O:-1 α 6≥ β El nodo D devuelve 5; el valor de β se actualiza a min(+∞, 5) = 5. La condición α ≥ β no se cumple y el nodo B llama a E y le pasa los valores de α y β. Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- D:5 H:3 B:- α = −∞ β =5 α=5 β = +∞ E:- I:5 J:6 α = −∞ β = +∞ α = −∞ β =5 K:9 F:- L:1 C:- α = −∞ β = +∞ α = −∞ β = +∞ G:- M:2 N:0 El nodo E elige el máximo de J y K ; llama primero a J. α = −∞ β = +∞ O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- D:5 H:3 B:- α = −∞ β =5 α=5 β = +∞ E:- I:5 J:6 E: α = max(−∞, 6) = 6 α = −∞ β = +∞ α=6 β =5 K:9 F:- L:1 C:- α = −∞ β = +∞ α = −∞ β = +∞ G:- M:2 α≥β El nodo J devuelve 6. El valor de α se actualiza a max(−∞, 6) = 6. N:0 α = −∞ β = +∞ O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- D:5 B:- α = −∞ β =5 α=5 β = +∞ E:6 α = −∞ β = +∞ α=6 β =5 F:- C:- α = −∞ β = +∞ α = −∞ β = +∞ G:- α = −∞ β = +∞ 7 H:3 I:5 J:6 K:9 L:1 M:2 N:0 O:-1 La condición α ≥ β se cumple; el valor de K no importa porque MIN nunca va a venir por aquí teniendo asegurado 5 en la otra rama. E toma entonces el valor de J, 6. Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- B:5 D:5 α = −∞ β = +∞ α = −∞ β =5 α=5 β = +∞ α=6 β =5 E:6 F:- C:- α = −∞ β = +∞ α = −∞ β = +∞ G:- α = −∞ β = +∞ 7 H:3 I:5 J:6 K:9 L:1 B: β = min(5, 6) = 5 El valor de B es min(5, 6) = 5 M:2 N:0 O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- B:5 D:5 α=5 β = +∞ α = −∞ β =5 α=5 β = +∞ α=6 β =5 E:6 F:- C:- α = −∞ β = +∞ α = −∞ β = +∞ G:- α = −∞ β = +∞ 7 H:3 I:5 J:6 A: α = max(−∞, 5) = 5 K:9 L:1 M:2 N:0 α 6≥ β El valor de α se actualiza a max(−∞, 5) = 5 La condición α ≥ β no se cumple y el nodo A llama a C y le pasa los valores de α y β. O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- B:5 D:5 α=5 β = +∞ α = −∞ β =5 α=5 β = +∞ α=6 β =5 E:6 F:- C:- α=5 β = +∞ α = −∞ β = +∞ G:- α = −∞ β = +∞ 7 H:3 I:5 J:6 K:9 L:1 M:2 N:0 El nodo C elige el mínimo de F y G ; llama primero a F . O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- B:5 D:5 α=5 β = +∞ α = −∞ β =5 α=5 β = +∞ α=6 β =5 E:6 F:- C:- α=5 β = +∞ α=5 β = +∞ G:- α = −∞ β = +∞ 7 H:3 I:5 J:6 K:9 L:1 M:2 N:0 El nodo F elige el máximo de L y M; llama primero a L. O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- B:5 D:5 α=5 β = +∞ α = −∞ β =5 α=5 β = +∞ α=6 β =5 E:6 F:- C:- α=5 β = +∞ α=5 β = +∞ G:- α = −∞ β = +∞ 7 H:3 I:5 J:6 F: α = max(5, 1) = 5 K:9 L:1 M:2 N:0 α 6≥ β El nodo L devuelve 1. El valor de α se actualiza a max(5, 1) = 5. Como la condición α ≥ β no se cumple, se llama a M. O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- B:5 D:5 α=5 β = +∞ α = −∞ β =5 α=5 β = +∞ α=6 β =5 E:6 F:- C:- α=5 β = +∞ α=5 β = +∞ G:- α = −∞ β = +∞ 7 H:3 I:5 J:6 F: α = max(5, 1) = 5 α = max(5, 2) = 5 K:9 L:1 M:2 α≥ 6 β α≥ 6 β El nodo M devuelve 2. El valor de α se actualiza a max(2, 5) = 5. N:0 O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- B:5 D:5 α=5 β = +∞ α = −∞ β =5 α=5 β = +∞ α=6 β =5 E:6 F:2 C:- α=5 β = +∞ α=5 β = +∞ G:- α = −∞ β = +∞ 7 H:3 I:5 J:6 K:9 L:1 El valor de F es max(1, 2) = 2 M:2 N:0 O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:- B:5 α=5 β = +∞ α = −∞ β =5 C:2 α=5 β =2 7 D:5 α=5 β = +∞ α=6 β =5 E:6 F:2 α=5 β = +∞ G:- α = −∞ β = +∞ 7 H:3 I:5 J:6 C: β = min(+∞, 2) = 2 K:9 L:1 M:2 N:0 O:-1 α≥β El nodo F devuelve 2; el valor de β se actualiza a min(+∞, 2) = 2. La condición α ≥ β el valor de G no importa (MAX nunca va a venir por aquí teniendo asegurado 5 del otro lado). (MAX El nodo C toma el valor de F , 2. Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:5 B:5 α=5 β = +∞ α = −∞ β =5 C:2 α=5 β =2 7 D:5 α=5 β = +∞ α=6 β =5 E:6 F:2 α=5 β = +∞ G:- α = −∞ β = +∞ 7 H:3 I:5 J:6 A: α = max(2, 5) = 5 K:9 L:1 M:2 N:0 α 6≥ β El valor del vértice A se actualiza a max(5, 2) = 5 Ricardo Wehbe Programación III - Clase 11 O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax La poda αβ A:5 B:5 α=5 β = +∞ α = −∞ β =5 C:2 α=5 β =2 7 D:5 α=5 β = +∞ α=6 β =5 E:6 F:2 α=5 β = +∞ G:- α = −∞ β = +∞ 7 H:3 I:5 J:6 K:9 L:1 M:2 N:0 O:-1 Repaso de la clase anterior Juegos. El algoritmo MiniMax El algoritmo αβ 1 2 3 4 algorithm AlfaBeta input e: estado, n: nivel AB(e, 1, MAX , −∞, +∞) end 1 2 3 4 5 6 7 8 9 10 11 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 algorithm AB input e: estado, n: nivel, α, β:integer // estado y nivel como antes if hoja(e, n) return result(e, n) // Devuelve el valor del vértice else if n = MAX valor ← −∞ else valor ← +∞ endif alfa ← α; beta ← β foreach sig ← hijo(e) do if n = MAX valor ← max(valor , AB(sig , MIN, alfa, beta)) α ← max(valor, α) else valor ← min(valor , AB(sig , MAX , alfa, beta)) β ← min(valor, β) endif if β ≤ α break endif endforeach endif return valor end // estado es un vértice; nivel es MAX o MIN // inicialmente, α = −∞ y β = +∞ Ricardo Wehbe Programación III - Clase 11