Está en la página 1de 35

ANALISIS DE ALGORITMOS

TEMA: PROGRAMACION DINAMICA


Temario
 Fundamento
 Método general
 Análisis de tiempo de ejecución
Fundamentos
La programación dinámica es una técnica matemática que se utiliza
para la solución de problemas matemáticos seleccionados, en los
cuales se toma un serie de decisiones en forma secuencial.
Fundamentos
Proporciona un procedimiento sistemático para encontrar la
combinación de decisiones que maximice la efectividad total, al
descomponer el problema en etapas, las que pueden ser completadas
por una o más formas (estados), y enlazando cada etapa a través de
cálculos recursivos.
Método general
 La programación dinámica se suele utilizar en problemas de
optimización, donde una solución esta formada por una serie de
decisiones.
 Igual que la técnica divide y vencerás, resuelve el problema original
combinando las soluciones para subproblemas mas pequeños.
Método general
 Sin embargo la programación dinámica no utiliza recursividad, sino
que almacena los resultados de los subproblemas en una tabla,
calculando primero las soluciones para los problemas pequeños.
 Con esto se pretende evitar la repetición de cálculos para problemas
mas pequeños.
Método general
Ejemplo: Calculo de los números de Fibonacci
 Con método recursivo
 Fibonacci(n:integer)
 Si n<2 devolver 1
 Sino devolver Fibonacci(n-1) + Fibonacci (n-2)
 Problema: muchos cálculos estan repetidos, tiempo de ejecución exponencial.
 Solución: Calcular los valores de menor a mayor empezando por 0 e ir guardando
los resultados en un tabla.
 Como programación dinámica
Método general
Ejemplo: Calculo de los números de Fibonacci
 Como programación dinámica
 Fibonacci(n:integer)
 T[0] = 0; T[1]=1;
 Para i=2,3,….n
 T[i]=T[i-1] + T[i-2]
 Devolver T[n]
 Se utiliza la misma formula que en la versión anterior, pero de forma
mas inteligente. El tiempo de ejecución es O(n).
Método general
 Los algoritmos divide y vencerás están dentro de los métodos
descendentes.
 Empezar con el problema original y descomponer en pasos sucesivos en
problemas de menor tamaño.
 Partiendo del problema grande, descendemos hacia problemas mas sencillos.

 La programación dinámica por el contrario es un método ascendente:


 Resolvemos primero los problemas pequeños(guardando las soluciones en
una tabla) y después vamos combinando para resolver los problemas mas
grandes.
Método general
La programación dinámica se basa en el principio de optimalidad de
Bellman: cualquier subsecuencia de una secuencia optima debe ser, a
su vez, una secuencia optima.
Para cada problema deberíamos comprobar si es aplicable el principio
de optimalidad.

Ejemplo:
2 B 9  Caminos de A a D
 A-C-D, A-C=3, C-D=7 de longitud 10.
A D  A-B-D, A-B=2, B-D=9 de longitud 11.
3
C 7
Método general
Aspectos a definir en un algoritmo de programación dinámica:
1. Ecuación recurrente, para calcular la solución de los problemas
grandes en función de los problemas mas pequeños.
2. Determinar los casos base.
3. Definir las tablas utilizadas por el algoritmo y como son rellenadas.
4. Como se recompone la solución global a partir de los valores de las
tablas.
Análisis de tiempos de ejecución
 El tiempo de ejecución depende de las características concretas del
problema a resolver.
 En general será de la forma:
 Tamaño de la tabla * tiempo de rellenar cada elemento de la tabla
 Un aspecto importante de los algoritmos de programación dinámica
es que necesitan una tabla para almacenar los resultados parciales,
que puede ocupar mucha memoria.
 Además algunos de estos cálculos pueden ser innecesarios.
Ejemplo de aplicación: Problema del cambio de monedas
Problema: Dado un conjunto de n tipos de monedas, cada una con
valor Ci, y dada una cantidad P, encontrar el numero mínimo de
monedas que tenemos que usar para obtener esa cantidad.

Utilizando programación dinámica:


 Definimos el problema en función de problemas mas pequeños.
 Determinar los valores de los casos base.
 Definimos las tablas necesarias para almacenar los resultados de los
subproblemas.
 Establecemos una forma de rellenar las tablas y de obtener el resultado.
Ejemplo de aplicación: Problema del cambio de monedas
1. Definición de la ecuación recurrente
 Cambio(i,Q), el problema de calcular el numero mínimo de monedas
necesario para devolver una cantidad Q, usando los i primeros tipos de
monedas(es decir los tipos 1,…i)
 La solución de Cambio(i,Q) puede que utilice k monedas de tipo i o puede
que no utilice ninguna.
Si no usa ninguna moneda de ese tipo: Cambio(i,Q) = Cambio(i-1, Q)
Si usa k monedas de tipo i: Cambio(i,Q) = Cambio(i, Q-k*ci)+k
 En cualquier caso, el valor será el mínimo:
Cambio(i, Q) = mink=0,1,…,Q/ci {Cambio(i-1, Q-k*ci)+k}
Ejemplo de aplicación: Problema del cambio de monedas
2. Casos base: Cambio(i,Q)
 Si (i<=0) o (Q<0) entonces no existe ninguna solución al problema, y Cambio(i,
Q) = +∞
 En otro caso para cualquier i>0, Cambio(i,0)=0
Ejemplo de aplicación: Problema del cambio de monedas
3. Definición de las tablas utilizadas
 Necesitamos almacenar los resultados de todos los subproblemas.
 El problema a resolver será: Cambio(n, P)
 Por lo tanto, necesitamos una tabla de nxP de enteros, que llamaremos D,
siendo D[i,j] = Cambio(i, j).
 Ejemplo: n=3, P=8, c=(1, 4, 6)
D Cantidad a devolver
Monedas 0 1 2 3 4 5 6 7 8
C1 = 1
C2 = 4
C3 = 6
Ejemplo de aplicación: Problema del cambio de monedas
4. Forma de rellenar las tablas:
 De arriba hacia abajo y de izquierda a derecha, aplicar la ecuación
de recurrencia:
D[i, j] = mink=0,1,…,Q/ci {D(i-1, Q-k*ci)+k}
Ejemplo de aplicación: Problema del cambio de monedas
4. Forma de rellenar las tablas:
 Algoritmo Tener en cuenta si el valor
Cambio(P: entero, C:array[1..n] de enteros, D: array[1..n,0..P] de enteros) cae fuera de la tabla
para i=1,2,…,n
D[i,0] = 0
Para i=1,2,…,n
 Ejemplo: n=3, P=8, c=(1, 4, 6)
Para i=1,2,…,P
D[i, j] = mink=0,1,…,Q/ci {Cambio(i-1, Q-k*ci)+k}
D Cantidad a devolver
Monedas 0 1 2 3 4 5 6 7 8
D[n,P]: numero mínimo de C1 = 1
monedas que hay que usar C2 = 4
para devolver la cantidad P
C3 = 6
Ejemplos de aplicación: Problema del cambio de monedas
 Ejemplo: n=3, P=8, c=(1, 4, 6)

Cantidad a devolver  Si j=0  0


 Si j<di ^ i=1  ∞
Monedas
j  Si j<di ^ i>1 Cambio(i-1,j)
0 1 2 3 4 5 6 7 8  Si j>=di ^ i=1  1+Cambio(i, j- di)
i di
 Si j>=di ^ i>1  min {Cambio(i-1,j), 1+Cambio(i, j- di)}
1 C1 = 1 0
2 C2 = 4 0
3 C3 = 6 0

j=0
Ejemplos de aplicación: Problema del cambio de monedas
 Ejemplo: n=3, P=8, c=(1, 4, 6)

Cantidad a devolver  Si j=0  0


 Si j<di ^ i=1  ∞
Monedas
j  Si j<di ^ i>1 Cambio(i-1,j)
0 1 2 3 4 5 6 7 8  Si j>=di ^ i=1  1+Cambio(i, j- di)
i di
 Si j>=di ^ i>1  min {Cambio(i-1,j), 1+Cambio(i, j- di)}
1 C1 = 1 0 1
2 C2 = 4 0
3 C3 = 6 0

1+Cambio(i,j-di)
1+Cambio(1,1-1)
1+Cambio(1,0) = 1 + 0 = 1
Ejemplo de aplicación: Problema del cambio de monedas
 Ejemplo: n=3, P=8, c=(1, 4, 6)

Cantidad a devolver  Si j=0  0


Monedas
 Si j<di ^ i=1  ∞
j  Si j<di ^ i>1 Cambio(i-1,j)
0 1 2 3 4 5 6 7 8  Si j>=di ^ i=1  1+Cambio(i, j- di)
i di
 Si j>=di ^ i>1  min {Cambio(i-1,j), 1+Cambio(i, j- di)}
1 C1 = 1 0 1 2
2 C2 = 4 0
3 C3 = 6 0

1+Cambio(i, j-di)
1+Cambio(1,2-1)
1+Cambio(1,1) = 1 + 1 = 2
Ejemplo de aplicación: Problema del cambio de monedas
 Ejemplo: n=3, P=8, c=(1, 4, 6)

Cantidad a devolver  Si j=0  0


Monedas
 Si j<di ^ i=1  ∞
j  Si j<di ^ i>1 Cambio(i-1,j)
0 1 2 3 4 5 6 7 8  Si j>=di ^ i=1  1+Cambio(i, j- di)
i di
 Si j>=di ^ i>1  min {Cambio(i-1,j), 1+Cambio(i, j- di)}
1 C1 = 1 0 1 2 3
2 C2 = 4 0
3 C3 = 6 0

1+Cambio(i, j-di)
1+Cambio(1,3-1)
1+Cambio(1,2) = 1 + 2 = 3
Ejemplo de aplicación: Problema del cambio de monedas
 Ejemplo: n=3, P=8, c=(1, 4, 6)

Cantidad a devolver  Si j=0  0


Monedas
 Si j<di ^ i=1  ∞
j  Si j<di ^ i>1 Cambio(i-1,j)
0 1 2 3 4 5 6 7 8  Si j>=di ^ i=1  1+Cambio(i, j- di)
i di
 Si j>=di ^ i>1  min {Cambio(i-1,j), 1+Cambio(i, j- di)}
1 C1 = 1 0 1 2 3 4 5 6 7 8
2 C2 = 4 0
3 C3 = 6 0

1+Cambio(i, j-di)
Termina la primera iteración 1+Cambio(1,8-1)
1+Cambio(1,7) = 1 + 7 = 8
Ejemplos de aplicación: Problema del cambio de monedas
 Ejemplo: n=3, P=8, c=(1, 4, 6)

Cantidad a devolver  Si j=0  0


Monedas
 Si j<di ^ i=1  ∞
j  Si j<di ^ i>1 Cambio(i-1,j)
0 1 2 3 4 5 6 7 8  Si j>=di ^ i=1  1+Cambio(i, j- di)
i di
 Si j>=di ^ i>1  min {Cambio(i-1,j), 1+Cambio(i, j- di)}
1 C1 = 1 0 1 2 3 4 5 6 7 8
2 C2 = 4 0 1
3 C3 = 6 0
Cambio(i-1,j)
Cambio(1,1) = 1
Ejemplo de aplicación: Problema del cambio de monedas
 Ejemplo: n=3, P=8, c=(1, 4, 6)

Cantidad a devolver  Si j=0  0


Monedas
 Si j<di ^ i=1  ∞
j  Si j<di ^ i>1 Cambio(i-1,j)
0 1 2 3 4 5 6 7 8  Si j>=di ^ i=1  1+Cambio(i, j- di)
i di
 Si j>=di ^ i>1 min {Cambio(i-1,j), 1+Cambio(i, j- di)}
1 C1 = 1 0 1 2 3 4 5 6 7 8
2 C2 = 4 0 1 2 3 1
3 C3 = 6 0
min{Cambio(i-1,j), 1+Cambio(i, j-di)}
min{Cambio(2-1,4), 1+Cambio(2,4-4)}
min{Cambio(1,4), 1+Cambio(2,0)}
min{4, 1} = 1
Ejemplo de aplicación: Problema del cambio de monedas
 Ejemplo: n=3, P=8, c=(1, 4, 6)

Cantidad a devolver  Si j=0  0


Monedas
 Si j<di ^ i=1  ∞
j  Si j<di ^ i>1 Cambio(i-1,j)
0 1 2 3 4 5 6 7 8  Si j>=di ^ i>=1  1+Cambio(i, j- di)
i di
 Si j>=di ^ i>1  min {Cambio(i-1,j), 1+Cambio(i, j- di)}
1 C1 = 1 0 1 2 3 4 5 6 7 8
2 C2 = 4 0 1 2 3 1 2 3 4
3 C3 = 6 0
min{Cambio(i-1,j), 1+Cambio(i, j-di)}
min{Cambio(2-1,7), 1+Cambio(2,7-4)}
min{Cambio(1,7), 1+Cambio(2,3)}
min{7, 4} = 4
Ejemplos de aplicación: Problema del cambio de monedas
 Ejemplo: n=3, P=8, c=(1, 4, 6)

Cantidad a devolver  Si j=0  0


Monedas
 Si j<di ^ i=1  ∞
j  Si j<di ^ i>1 Cambio(i-1,j)
0 1 2 3 4 5 6 7 8  Si j>=di ^ i>=1  1+Cambio(i, j- di)
i di
 Si j>=di ^ i>1  min {Cambio(i-1,j), 1+Cambio(i, j- di)}
1 C1 = 1 0 1 2 3 4 5 6 7 8
2 C2 = 4 0 1 2 3 1 2 3 4 2
3 C3 = 6 0

min{Cambio(i-1,j), 1+Cambio(i, j-di)}


min{Cambio(2-1,8), 1+Cambio(2,8-4)}
min{Cambio(1,8), 1+Cambio(2,4)}
min{8, 2} = 2
Ejemplo de aplicación: Problema del cambio de monedas
 Ejemplo: n=3, P=8, c=(1, 4, 6)

Cantidad a devolver  Si j=0  0


Monedas
 Si j<di ^ i=1  ∞
j  Si j<di ^ i>1 Cambio(i-1,j)
0 1 2 3 4 5 6 7 8  Si j>=di ^ i>=1  Cambio(i, j- di)+1
i di
 Si j>=di ^ i>1  min {Cambio(i-1,j), 1+Cambio(i, j- di)}
1 C1 = 1 0 1 2 3 4 5 6 7 8
2 C2 = 4 0 1 2 3 1 2 3 4 2
3 C3 = 6 0 1 2 3 1 2 1 2 2
min{Cambio(i-1,j), 1+Cambio(i, j-di)}
min{Cambio(3-1,8), 1+Cambio(3, 2)}
min{Cambio(2,8), 1+Cambio(3,2)}
min{2, 3} = 2
Ejemplos de aplicación: Problema del cambio de monedas
 Ejemplo: n=3, P=8, c=(1, 4, 6), determinar la cantidad de monedas usadas.

j=8

El bucle se repite mientras j<>0


Di Monedas
j 0 1 2 3 4 5 6 7 8 M
Si(i>1 ^ d[i,j]=d[i-1,j])  i=i-1
0 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ Sino
1 C1 = 1 0 1 2 3 4 5 6 7 8 M[i]++
2 C2 = 4 0 1 2 3 1 2 3 4 2 j=j-Xi
i=3 3 C3 = 6 0 1 2 3 1 2 1 2 2
Ejemplo de aplicación: Problema del cambio de monedas
 Ejemplo: n=3, P=8, c=(1, 4, 6), determinar la cantidad de monedas usadas.
j=8

Monedas
j 0 1 2 3 4 5 6 7 8 M
i di Si(i>1 ^ d[i,j]=d[i-1,j])  i=i-1
Sino
0 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞
M[i]++
1 C1 = 1 0 1 2 3 4 5 6 7 8 j=j-di
i=2 2 C2 = 4 0 1 2 3 1 2 3 4 2 1
3 C3 = 6 0 1 2 3 1 2 1 2 2
Ejemplos de aplicación: Problema del cambio de monedas
 Ejemplo: n=3, P=8, c=(1, 4, 6), determinar la cantidad de monedas usadas.

j=4

Di Monedas
j 0 1 2 3 4 5 6 7 8 M
di Si(i>1 ^ d[i,j]=d[i-1,j])  i=i-1
0 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ Sino
M[i]++
1 C1 = 1 0 1 2 3 4 5 6 7 8 j=j-di
i=2 2 C2 = 4 0 1 2 3 1 2 3 4 2 1
3 C3 = 6 0 1 2 3 1 2 1 2 2
Ejemplo de aplicación: Problema del cambio de monedas
 Ejemplo: n=3, P=8, c=(1, 4, 6), determinar la cantidad de monedas usadas.
j=4

Di Monedas
j 0 1 2 3 4 5 6 7 8 M
Si(i>1 ^ d[i,j]=d[i-1,j])  i=i-1
0 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞
Sino
1 C1 = 1 0 1 2 3 4 5 6 7 8 M[i]++
i=2 2 C2 = 4 0 1 2 3 1 2 3 4 2 2 j=j-di
3 C3 = 6 0 1 2 3 1 2 1 2 2
Ejemplo de aplicación: Problema del cambio de monedas
 Ejemplo: n=3, P=8, c=(1, 4, 6), determinar la cantidad de monedas usadas.

j=0

Di Monedas
0 1 2 3 4 5 6 7 8 M Si j=0 se termina el proceso
j
0 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞
1 C1 = 1 0 1 2 3 4 5 6 7 8
i=2 2 C2 = 4 0 1 2 3 1 2 3 4 2 2
3 C3 = 6 0 1 2 3 1 2 1 2 2
Ejemplo de aplicación: Problema del cambio de monedas
Dinámica N° 1
Estimado estudiante en grupo proceda a encontrar el mejor cambio para los
siguientes casos:

Caso Grupo
1 n=3, P=6, c=(1, 3, 5) 1,5
2 n=3, P=9, c=(1,4,5) 2,6
3 n=3, P=5, c=(1,2,3) 3,7
4 n=3, P=7, c=(1, 2, 4) 4,8
5 n=4, P=10, c=(1, 3, 6, 8) Todos

También podría gustarte