Beruflich Dokumente
Kultur Dokumente
5.1. Mtodo general. 5.2. Anlisis de tiempos de ejecucin. 5.3. Ejemplos de aplicacin. 5.3.1. Problema del cambio de monedas. 5.3.2. Problema de la mochila 0/1. 5.3.3. Multiplicacin encadenada de matrices.
Mtodo general
La programacin dinmica se suele utilizar en problemas de optimizacin, donde una solucin est formada por una serie de decisiones. Igual que la tcnica divide y vencers, resuelve el problema original combinando las soluciones para subproblemas ms pequeos. Sin embargo, la programacin dinmica no utiliza recursividad, sino que almacena los resultados de los subproblemas en una tabla, calculando primero las soluciones para los problemas pequeos. Con esto se pretende evitar la repeticin de clculos para problemas ms pequeos.
Mtodo general
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 frmula que en la versin anterior, pero de forma ms inteligente. El tiempo de ejecucin es (n).
3
Mtodo general
Los algoritmos divide y vencers estn dentro de los mtodos descendentes. Empezar con el problema original y descomponer en pasos sucesivos en problemas de menor tamao. Partiendo del problema grande, descendemos hacia problemas ms sencillos. La programacin dinmica, por el contrario, es un mtodo ascendente: Resolvemos primero los problemas pequeos (guardando las soluciones en una tabla) y despus vamos combinando para resolver los problemas ms grandes.
4
Mtodo general
La programacin dinmica se basa en el Principio de Optimalidad de Bellman: cualquier subsecuencia de una secuencia ptima debe ser, a su vez, una secuencia ptima. Para cada problema deberamos comprobar si es aplicable el principio de optimalidad. Ejemplo. 2 B 9 A D 3 C 7
Camino ptimo de A a D: A-C-D, de longitud 10 Camino ptimo de A al siguiente nivel: A-B, de longitud 2, y despus B-D de longitud 9. Total: A-B-D, de longitud 11 Cumple el Principio de Optimalidad?
5
Mtodo general
Aspectos a definir en un algoritmo de programacin dinmica: Ecuacin recurrente, para calcular la solucin de los problemas grandes en funcin de los problemas ms pequeos. Determinar los casos base. Definir las tablas utilizadas por el algoritmo, y cmo son rellenadas. Cmo se recompone la solucin global a partir de los valores de las tablas.
El algoritmo voraz es muy eficiente, pero slo funciona en un nmero limitado de casos.
Utilizando programacin dinmica:
Definimos el problema en funcin de problemas ms pequeos. 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.
8
Forma de rellenar las tablas: De arriba hacia abajo y de izquierda a derecha, aplicar la ecuacin de recurrencia: D[i, j] = mink=0,1,...,Q/ci {D(i-1, Q-k* ci)+k}
10
para i = 1,2,...,n D[i, 0] = 0 para i = 1,2,...,n para j = 1,2,...,P {Tener en cuenta si el valor } D[i, j] = mink=0,1,...,Q/ci {D(i-1, Q-k* ci)+k} { cae fuera de la tabla} Ejemplo. n= 3, P= 8, c= (1, 4, 6)
0 C1= 1 C2 = 4 C3 = 6 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 4 4 1 1 5 5 2 2 6 6 3 1 7 7 4 2 8 8 2 2
Cul es el tiempo de ejecucin del algoritmo? Cmo es en comparacin con el algoritmo voraz?
D[n, P]: nmero mnimo de monedas que hay que usar para devolver la cantidad P. 11
Algoritmo para obtener una solucin: para i=n,n-1,...,1 xi=Aux[i,P] P=P-xi*ci Cul es el tiempo de ejecucin del algoritmo para obtener la solucin? Es aplicable el principio de optimalidad?
12
a=1..i
xava
Casos base:
Si (i<0) o (m<0) entonces no hay solucin: Mochila (i, m) = - En otro caso, si (i=0) (m=0) la solucin es no incluir ningn objeto: Mochila (i, m) = 0
0 0 0 0 0
1 0 0 0 0
2 0 1 1 1
3 0 1 2 2
4 0 1 2 5
5 0 1 3 5
6 0 1 3 6
16
Objetivo: obtener un orden de multiplicacin que minimice el nmero de multiplicaciones escalares. Solucin sencilla: estimar el nmero de multiplicaciones necesarias para todas las ordenaciones posibles. Quedarse con la que tenga menor valor. Cul es el nmero de ordenaciones posibles, T(n)?
18
i=1..n-1
T(i)T(n-i)
El valor de T(n) est en (4n/n2) Para cada ordenacin necesita un tiempo de (n). Esta solucin requerira un tiempo con una cota inferior de (4n/n).
Ecuacin de recurrencia:
Si no se da ninguno de los casos anteriores, entonces podemos hacer la primera multiplicacin por una posicin k, con ik<j: (Mi x ... x Mk)x(Mk+1 x ... X Mj) El resultado ser el valor mnimo: NMulti(i, j) = min (NMulti(i, k) + NMulti(k+1, j) + d[i-1]d[k]d[j])
ik<j
Forma de rellenar la tabla. Inicializar la matriz. Para todo i, desde 1 hasta n. M[i, i] = 0 Aplicar la ecuacin de recurrencia por diagonales. M[i, j] = min (M[i, k] + M[k+1, j] + d[i-1]d[k]d[j]) ik<j Ejemplo. n= 4, d = (10, 20, 50, 1, 100)
j= 1 i=1 2 3 4 0 2 10.000 0 3 1.200 1.000 0 4 2.200 3.000 5.000 0
21