Está en la página 1de 12

Programacin Dinmica 1

El mtodo de programacin dinmica sirve para resolver problemas combinando e o a las soluciones de subproblemas. Normalmente es usada para resolver problemas de optimizacin. o Al construir un algoritmo usando la estrategia de programacin dinmica es o a necesario: 1. Caracterizar la estructura de una solucin optima. o 2. Denir recursivamente el valor de una solucin ptima. o o 3. Computar el valor de una solucin en forma bottom-up. o 4. [Opcional] Construir una solucin ptima a partir de la informacin computada. o o o

Basado en el libro Algorithms de Cormen, Leiserson y Rivest


29

Jorge Baier Aranda, PUC

Cundo usar Programacin Dinmica?


Hay dos condiciones que se deben cumplir antes de comenzar a pensar en una solucin a un problema de optimizacin usando programacin dinmica. o o o a Sub-estructura ptima. Un problema tiene sub-estructura ptima cuando la o o solucin ptima a un problema se puede componer a partir de soluciones ptimas o o o de sus sub-problemas. Superposicin de Problemas. El clculo de la solucin ptima implica resolo a o o ver muchas veces un mismo sub-problemas. La cantidad de sub-problema es pequea. n

Jorge Baier Aranda, PUC

30

Resolviendo un Problema con Programacin Dinmica


Sopongamos el siguiente problema: dada una cadena de n matrices A1, . . . , An , donde para cada i (1 i n) la matriz Ai tiene dimensin pi1 pi, encuentre o una forma de multiplicar las matrices que minimice el nmero de multiplicaciones u escalares a realizar. Observacin 1 : La forma ptima de multiplicar una cadena o o de matrices est determinado por el nmero de multiplicaciones a realizar. Para a u multiplicar una matriz de p q por una de q r son necesarias pqr operaciones escalares de multiplicacin. o Observacin 2 : Si multiplicamos tres matrices de 10 100, 100 5 y 5 50, o podemos hacerlo con 7500 ((A1A2)A3) o 75000 (A1(A2A3)) operaciones.

Jorge Baier Aranda, PUC

31

Sin programacin dinmica


Resolver este problema sin programacin dinmica implica calcular el nmero de o a u operaciones para cada posible orden de multiplicacin de matrices. o Cuntos posibles ordenes hay? a Respuesta: Muchos. Sea P (n) el nmero de rdenes posibles en una cadena de n matrices. Es sencillo u o ver que: 1 si n = 1 n1 k=1 P (k)P (n k) si n 2

P (n) =

La solucin a esta ecuacin es o o P (n) = 1 2n 2 n n1 = (4n/n3/2)

Jorge Baier Aranda, PUC

32

Con programacin dinmica


Supongamos que tenemos la forma ptima de multiplicar las matrices o A1, . . . , An . Al nivel ms alto, la solucin se ver como la multiplicacin a o a o de dos matrices que resultan de calcular los productos A1 Ak y Ak+1 An, ambos en forma ptima, para algn k (1 k n). o u Lo anterior implica que el problema tiene sub-estructura ptima. o Supongamos que llamamos m[i, j] al nmero ptimo de multiplicaciones escalares u o a realizar al multiplicar Ai, Ai+1, . . . , Aj . m[i, j] se puede escribir recursivamente por: 0 si i = j m ik<j {m[i, k] + m[k + 1, j] + pi1pk pj } si i < j n

m[i, j] =

Supongamos que s[i, j] es la forma en que, al nivel ms alto, se divide el producto a de Ai, Ai+1, . . . , Aj , de manera ptima. Entonces, o
Jorge Baier Aranda, PUC 33

m[i, j] =

i si i = j argminik<j {m[i, k] + m[k + 1, j] + pi1pk pj } si i < j

Si se observan cuidadosamente estas expresiones, nos daremos cuenta que es posible resolver el problema de forma recursiva tradicional, pero muchos clculos a se debern rehacer. Esto signica que existe superposicin de problemas. a o

Jorge Baier Aranda, PUC

34

Bottom-Up: Lo ms fcil
La estrategia bottom-up consiste en resolver primero los subproblemas ms a pequeos, almacenar su solucin, y luego resolver los problemas ms complejos, n o a usando los resultados almacenados. Es claro que calcular m[i, i] es muy sencillo... cul tipo de problema es el que le a sigue en complejidad? Resp: calcular m[i, i + 1], con 1 i < n.

Jorge Baier Aranda, PUC

35

El algoritmo
Matrix-Chain-Order(p) 1 n length[p] 1 2 for i 0 to n 3 do m[i, i] 0 4 for l 2 to n 5 do for i 1 to n l + 1 6 do j i + l 1 7 k = s[i, j] = argmin ik<j {m[i, k] + m[k + 1, j] + pi1pk pj } 8 m[i, j] = m[i, k] + m[k + 1, j] + pi1pk pj 9 return m, s

Es sencillo vericar que el tiempo de ejecucin de este algoritmo es O(n3). o

Jorge Baier Aranda, PUC

36

Otro Problema: La mayor subsecuencia comn (PMSC)


Una subsecuencia de una secuencia dada S = s1, s2, . . . , sn es S con algunos (posiblemente ningn) elementos removidos. u Si X e Y son secuencias entonces Z es una subsecuencia comn de X e Y si u Z es subsecuencia de X e Y . Si X e Y son secuencias entonces Z es una mayor subsecuencia comn (MSC) u de X e Y si Z es subsecuencia comn de X e Y y no hay otra ms larga. u a Entonces, cmo es posible encontrar la mayor subsecuencia de dos secuencias o dadas X = x1, . . . , xm e Y = y1, . . . , yn ?
n{m,n} La solucin de fuerza bruta debe probar 2m o subsecuencias...

Jorge Baier Aranda, PUC

37

Sub-estructura ptima en el MSC


Sean X = x1, . . . , xm , Y = y1, . . . , yn y sea Z = z1, . . . , zk una MSC de ellas. Para simplicar la notacin decimos que si X = x1, . . . , xn , entonces Xj = o x1, . . . , xj (0 j n). El MSC tiene sub-estructura optima. De hecho, 1. Si xm = yn, entonces zk = xm = yn y adems Zk1 es una MSC de Xm1 y a Yn1. 2. Si xm = yn, entonces Z la ms grande entre las MSCs de Xm1 y Yn y de a Xm y Yn1.

Jorge Baier Aranda, PUC

38

Una expresin recursiva para el MSC


Supongamos que llamamos c[i, j] al largo de la MSC entre Xi e Yk . La expresin recursiva para c[i, j] es la siguiente: o 0 si i = 0 o j = 0 c[i, j] = c[i 1, j 1] + 1 si i, j > 0 y xi = yj mx{c[i 1, j], c[i, j 1]} si i, j > 0 y xi = yj a Para encontrar la subsecuencia podemos denir b[i, j] con el siguiente signicado: b[i, j] tiene valor 1 si la MSC de Xi y Xj contiene a xi (xi = xj ). b[i, j] tiene valor si el ultimo elemento de la MSC de Xi y Xj es igual al ultimo elemento de la MSC de Xi1 y Yj . b[i, j] tiene valor si el ultimo elemento de la MSC de Xi y Xj es igual al ultimo elemento de la MSC de Xi y Yj1. A partir de b[i, j] es muy sencillo construir una MSC.
Jorge Baier Aranda, PUC 39

Algoritmo para la MSC


MSC(X, Y ) 1 m largo[X] 2 n largo[Y ] 3 for i 1 to m 4 do c[i, 0] 0 5 for j 1 to n 6 do c[0, j] 0 7 for i 1 to m 8 do for i 1 to n 9 do if xi = yj 10 then c[i, j] c[i 1, j 1] + 1 11 b[i, j] 1 12 else if c[i 1, j] c[i, j 1] 13 then c[i, j] c[i 1, j] 14 b[i, j] 15 else c[i, j] c[i, j 1] 16 b[i, j] 17 return c, b

Su tiempo de ejecucin de es O(mn). o


Jorge Baier Aranda, PUC 40

También podría gustarte