dynamic programming and backtracking

13
Dynamic Programming and Backtracking Ricardo Sánchez Castillo

Upload: ricardo-sanchez-castillo

Post on 15-Aug-2015

72 views

Category:

Software


2 download

TRANSCRIPT

Dynamic Programming and BacktrackingRicardo Sánchez Castillo

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

Dynamic Programming and BacktrackingRicardo Sánchez Castillo