Programacion Dinamica
Programacion Dinamica
Programacion Dinamica
Estrategias de programación
Programación dinámica
1/36
Introducción
Programación dinámica: esquema de diseño
Programación dinámica: ejemplos
Programación dinámica:
1. Introducción
2/36
Introducción
Programación dinámica: esquema de diseño
Programación dinámica: ejemplos
◦ Algunos problemas se pueden dividir en partes, resolver cada parte por separado
y combinar las soluciones. Eso es lo que hacemos de forma recursiva en la técnica
conocida como Divide y Vencerás (DyV). En estos casos, los subproblemas
generados son independientes y no hay esfuerzos redundantes.
◦ Sin embargo, ciertas soluciones recursivas producen los mismos subproblemas
muchas veces y resultan altamente ineficientes, ya que deben resolver dichos
subproblemas cada vez que se generan. Esto es lo que se conoce como
solapamiento de subproblemas (p.e. Fibonacci recursivo).
◦ Manteniendo el esquema top-down de los algoritmos recursivos, es posible reducir
drásticamente el esfuerzo computacional mediante lo que se conoce como
memorización: cada vez que se ha de realizar un cálculo, primero se busca en
una tabla; si está, se utiliza; si no, se realiza el cálculo y se almacena el resultado
en la tabla.
◦ Esta pequeña modificación implica usar memoria auxiliar para almacenar los
resultados ya calculados, lo cual, dependiendo del tamaño del problema, podrı́a
ser inviable, o incluso, si el espacio de parámetros no es discreto, imposible de
implementar. En algunos textos, el método descrito se denomina top-down
dynamic programming.
3/36
Introducción
Programación dinámica: esquema de diseño
Programación dinámica: ejemplos
4/36
Introducción
Programación dinámica: esquema de diseño
Programación dinámica: ejemplos
◦ Pero esta solución produce (y resuelve) los mismos subproblemas muchas veces,
como ya vimos en el tema de Divide y Vencerás, y como consecuencia el coste
temporal es exponencial.
◦ El coste espacial de esta solución será de orden lineal, ya que el número de
llamadas almacenadas en la pila del sistema por la rama izquierda del árbol
llegará a ser exactamente n (por la otra rama serán n/2).
6/36
Introducción
Programación dinámica: esquema de diseño
Programación dinámica: ejemplos
fib(5)
fib(4) fib(3)
fib(1) fib(0)
7/36
Introducción
Programación dinámica: esquema de diseño
Programación dinámica: ejemplos
◦ Esta solución calculará cada término una sola vez, de modo que el coste
temporal será lineal. Nótese que el coste espacial también será lineal.
◦ Sin embargo, la versión anterior sigue siendo recursiva y encajarı́a en lo que
hemos llamado top-down dynamic programming. Los algoritmos de programación
dinámica son iterativos y operan de abajo arriba. En este caso, a partir del caso
base iremos calculando y almacenando los términos sucesivos de la serie:
def fib_ite ( n ) :
t ={0:1 , 1:1}
for i in range (2 , n +1) :
t [ i ]= t [i -1]+ t [i -2]
return t [ n ]
fib(5)
fib(4) fib(3)
fib(1) fib(0)
9/36
Introducción
Programación dinámica: esquema de diseño
Programación dinámica: ejemplos
10/36
Introducción
Programación dinámica: esquema de diseño
Programación dinámica: ejemplos
11/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
13/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
14/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
2 0 0 28 28 28 33 33 61 61 61 61
i
3 0 0 28 28 28 33 33 61 61 61 66
4 0 0 28 28 28 33 33 61 61 61 66
5 0 20 28 48 48 48 53 61 81 81 81
15/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
16/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
18/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
con la restricción:
j
X
yk pk ≤ M − K
k=i
19/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
20/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
21/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
2 0 1 2 3 1 2 1 2 2
24/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
26/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
27/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
30/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
0 0 0 0 0 0
s=0 s=1 s=2 s=3
1 0 0 5785 1530 2856
2 0 0 0 1335 1845
3 0 0 0 0 9078
4 0 0 0 0 0
31/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
32/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
Algoritmo de Floyd-Warshall
P(k-1)[i][j]
i
P(k-1)[i][k]
k
P(k-1)[k][j]
33/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
34/36
El problema de la mochila (discreto)
Introducción
Devolver el cambio con el número mı́nimo de monedas
Programación dinámica: esquema de diseño
Parentizado óptimo en la multiplicación de matrices
Programación dinámica: ejemplos
Caminos de coste mı́nimo en un grafo ponderado
0 3 ∞ 1 5 0 3 ∞ 1 5
∞ 0 1 ∞ ∞ ∞ 0 1 ∞ ∞
P(0) = ∞ ∞ 0 3 4 P(1) = ∞ ∞ 0 3 4
∞ 1 2 0 ∞ ∞ 1 2 0 ∞
1 ∞ ∞ ∞ 6 0 ∞ ∞ ∞ 6 0
2 3
1 3
0 3 4 1 5 0 3 4 1 5
∞ 0 1 ∞ ∞ ∞ 0 1 4 5
4 P(2) = ∞ ∞ 0 3 4 P(3) = ∞ ∞ 0 3 4
3 4 2 ∞ 1 2 0 ∞ ∞ 1 2 0 6
∞ ∞ ∞ 6 0 ∞ ∞ ∞ 6 0
1 6
1 5 0 2 3 1 5 0 2 3 1 5
5 ∞ 0 1 4 5 ∞ 0 1 4 5
P(4) = ∞ 4 0 3 4 P(5) = ∞ 4 0 3 4
∞ 1 2 0 6 ∞ 1 2 0 6
∞ 7 8 6 0 ∞ 7 8 6 0
35/36