Dynamic programming and backtracking
-
Upload
ricardo-sanchez-castillo -
Category
Software
-
view
76 -
download
2
Transcript of Dynamic programming and backtracking
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 2
Programación Dinámica
p = [ 20, 13, 45, 34, 76]
def sumIterative(p):result = 0for i in range(len(p)):
result = result + p[i]
return result
Iterativa
def sumRecursive(p):if len(p) <= 0:
return 0return p[0] + sumRecursive(p[1 : ])
Recursiva
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 3
Programación Dinámica
p = [ 20, 13, 45, 34, 76]
def sumRecursive(p):if len(p) <= 0:
return 0return p[0] + sumRecursive(p[1 : ])
Recursiva
20 + [13,45,34,76]
13 + [45,34,76]
45 + [34,76]
34 + [76]
76 + []
[] = 0
76 + 0 = 76
34 + 76 = 110
45 + 110 = 155
13 + 155 = 168
20 + 168 = 188
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 4
Programación Dinámica
Longitud 1 2 3 4 5 6 7 8 9 10
Precio 1 5 7 9 10 17 19 20 24 30
= 9
= 8
= 10
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 5
Programación Dinámica
i=1 i=2 i=3 i=4
8
7
4
7
10
7
8 9
Longitud Precio
1 1
2 5
3 7
4 9
5 10
6 17
7 19
8 20
9 24
10 30
𝑟𝑛=max1≤𝑖 ≤𝑛
(𝑝𝑖+𝑟𝑛− 1¿)¿
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 6
Programación Dinámica4
3
2
1
0
1
0
0
2
1
0
0
1
0
0
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 7
Programación Dinámica
Top-down• Mismo procedimiento recursivo• Guardar el resultado en
memoria• Algunas veces no resolverá
todas las posibles combinaciones
Bottom-up:• Resolver los elementos más
“pequeños” primero• Continuar ascendiendo basado en
los resultados anteriores4
3
2
1
0
1
0
0
2
1
0
0
1
0
0 0
12
3
4
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 8
Programación Dinámica
Condiciones
• Subestructura optima: La solución optima a un problema está construida a partir de la solución de sus sub-problemas.
• Superposición de problemas: Los problemas se sobreponen. En una solución recursiva, el algoritmo calcula la solución a los mismos sub-problemas muchas veces.
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 9
Programación Dinámica
Otros ejemplos:
• Longest common subsequence (LCS): Detectar la sub-secuencia más grande a partir de dos secuencias, de aquí deriva la distancia de Levenshtein utilizada para la detección de plagiarismo.
• Número de caminos: ¿Cuántos caminos hay entre un punto (0, 0) a un punto (i, j)? De aquí deriva el algoritmo Floyd-Warshall.
• Multiplicación de cadenas de matrices: La multiplicación de matrices es asociativa, ¿De que forma deberíamos de agrupar los paréntesis para hacer la menor cantidad de cálculos?
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 10
Backtracking
• Genera todas las posibles combinaciones para un problema
• Se basa en el “stack” generado durante la recursión
• Cuando la función recursiva regresa, regresamos al estado anterior
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 11
Backtracking
Método general:
• Identificar los casos base
• Detectar los posibles estados que se pueden generar a partir de un punto inicial
• Mover al primer estado y aplicar recursión
• Probar sobre todos los estados
• En caso de que ninguno resuelva el problema, volver al estado inicial y regresar un valor
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 12
Backtracking
Presentación:
http://www.slideshare.net/RicardoSnchezCastill
Código:
https://www.dropbox.com/sh/gqowc6c5fbnc4mg/AADSCTKHuSnLDTh7_Bee-qlaa?dl=0