Uploaded by Servicios Gomez

PrograIII-Backtracking

advertisement
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
Download