Académique Documents
Professionnel Documents
Culture Documents
Programacin Dinmica
DR. JESS A. GONZLEZ BERNAL CIENCIAS COMPUTACIONALES INAOE
!! Parecido a divide y conquista !! Resuelve problemas combinando soluciones !! Programacin se refiere a resolver problemas en forma tabular !! Programacin dinmica aplica cuando los subproblemas no son independientes
"! Comparten
subproblemas
!!
Resuelve cada subproblema slo una vez, guarda la solucin, ahorra tiempo
optimizacin
!! Cuatro pasos 1.! Caracterizar la estructura de una solucin ptima 2.! Recursivamente definir el valor de una solucin ptima 3.! Calcular el valor de una solucin ptima de un modo bottomup 4.! Construir una solucin ptima a partir de la informacin calculada
Multiplicacin de Matrices
4
!! Dadas 2 matrices: !! Apxq * Bqxr = Cpxr , A2x3 * B3x2 = C2x2 !! Se requieren p x q x r multiplicaciones
&7 8 # &1 2 3# $ ! = &1x7 + 2 x9 + 3x11 1x8 + 2 x10 + 3x12 # * 9 10 $ 4 5 6! $ ! ! $ % " $11 12 ! %4 x7 + 5 x9 + 6 x11 4 x8 + 5 x10 + 6 x12" % "
!! Entrada: una cadena de n matrices <A1, A2, , An> !! Salida: el producto de las matrices A1A2An. !! Algoritmo !! Acomodar los parntesis a manera de minimizar el nmero de productos escalares al multiplicar las matrices !! A1A2A3 se puede agrupar como:
"! (A1A2)A3,
como A1 (A2A3)
Ejemplo
6
!! Si A1 es de 10 x 100, A2 de 100 x 5 y A3 de 5 x 50 " !! A1 (A2A3) " 100x5x50 + 10x100x50 = 25,000 + 50,000 = 75,000 multiplicaciones, (A2A3 es una matriz de 100x50) !! (A1A2)A3 " 10x100x5 + 10x5x 50 = 5,000 + 2,500 = 7,500 multiplicaciones (A1A2 es una matriz de 10x5)
agrupar con parntesis !! No es una solucin eficiente !! Sea P(n) el nmero de formas diferentes de acomodar los parntesis en una secuencia de n matrices !! Tenemos la recurrencia:
!! (la secuencia de los nmeros de cataln)
2n # & 4n # !! P(n) = C(n-1), donde: C (n) = 1 & $ $ ! ! = '$ $ 3/ 2 ! ! n +1 % n " %n "
!!
Paso 1: Caracterizar la Estructura de la Solucin ptima (La estructura para agrupar los parntesis)
8
donde i<j !! Si se divide el producto entre Ak y Ak+1 para i ! k < j !! Se calcula por separado Ai..k y Ak+1..j
La solucin a cada subproblema debe ser ptima para que la solucin de A1..An sea ptima !! Costo = Costo(Ai..k) + Costo(Ak+1..j) + Costo de multiplicar ambas matrices
!!
Paso 1: Caracterizar la Estructura de la Solucin ptima (La estructura para agrupar los parntesis)
9
!! Subestructura ptima: !! Construir soluciones ptimas para todos los subproblemas (as trabaja programacin dinmica)
"! Por
!! Definimos m[i,j]
!!
!!
!!
Si i = j, m[i,j] = 0 (problema trivial, una sla matriz, no son necesarias multiplicaciones de escalares) Si i < j, asumimos una divisin ptima entre Ak y Ak+1 (i !k<j) m[i,j] = costo de calcular Ai..k + costo de calcular Ak+1..j + costo de calcular Ai..kAk+1..j =m[i,k] + m[k+1,j]+pi-1pkpj Sin embargo, no conocemos el valor de k e intentaremos todas las j-i posibilidades La definicin recursiva para el mnimo costo de agrupar los parntesis del producto AiAi+1Aj es:
"! El
algoritmo puede encontrar subproblemas repetidos #! Traslape (Overlapping) #! Utilizamos mtodo bottom-up tabular " paso 3
!! Mtodo bottom-up !! Resolvemos subproblemas pequeos primero y los ms grandes sern ms fciles de resolver !! Definimos 2 arreglos !! m[1..n, 1..n], para almacenar costos mnimos !! s[1..n, 1..n], para almacenar las divisiones ptimas, ndice de k
"! Para
ptimo de multiplicaciones escalares !! Construimos la solucin ptima con la informacin en s[1..n, 1..n]
!! Subestructura ptima
Un problema con solucin ptima que tiene sub-problemas con soluciones ptimas !! Si se presenta esta propiedad, podra aplicar (probablemente) programacin dinmica
!!
!! Problemas traslapados
El espacio de sub-problemas debe ser pequeo !! Un alg. recursivo los resolvera muchas veces
!!
"! Lo
!!
la recursin
#(1) ' n =1 $ n "1 T ( n) = & #(1) + ! (T (k ) + T (n " k ) + #(1)) n > 1 $ k =1 % T (n) = #(1) + ! (T (k ) + T (n " k ) + #(1))
k =1 n "1
n "1
n "1
n "1
n "1
n "1
= #( n ) + 2! T ( k )
k =1
n "1
!! Por el mtodo de substitucin, probando que T(n)=#(2n) !! Mostrar: T(n) = #(2n) $ c2n n "1 !! Asumiendo: T(k) $ c2k para k < n T ( n ) ! #( n ) + 2 c 2 k !! Si 4c-"(n) ! 0, c ! "(n)/4 k =1
"!
(valor largo de n)
!! !!
= #(n) + 2c $ 2 k +1
k =0
n"2
= #(n) + 4c $ 2 k
k =0
n"2
Memoization
24
!! Tiempo: !! O(n3)
!!
!! Memoria: !! O(n2)
Z = <z1, z2, , zk> es una subsecuencia de X si existe una secuencia creciente <i1, i2, , ik> (no necesariamente contiguos) de ndices de X tal que para cada j = 1,2, , k, tenemos que xij = zj.
Problema LCS
28
Problema LCS
29
X = <x1, , xm>, el isimo prefijo de X, i = 0, , m, es Xi = <x1, , xi>. X0 est vaco. X = <x1, , xm> y Y = <y1, , yn> secuencias y Z = <z1, , zk> sea cualquier LCS de X y Y.
!!
Teorema 16.1
"! Sean
Si xm = yn, entonces zk = xm = yn y Zk-1 es una LCS de Xm-1 y Yn-1 2.! Si xm ! yn, entonces zk ! xm implica que Z es una LCS de Xm-1 y Y. 3.! Si xm ! yn, entonces zk ! ym implica que Z es una LCS de X y Yn-1
1.! "! Por
LCS(X,Yn-1)
LCS(Xm-1,Y)
LCS(Xm-1,Yn-1)
LCS(X,Yn-2)
LCS(Xm-1,Yn-1)
LCS(Xm-1,Yn-2)
LCS(Xm-1,Yn-1) LCS(Xm-2,Y)
LCS(Xm-2,Yn-1)
bottom up "! En c[i,j] guardamos la longitud del arreglo "! En b[i,j] guardamos el caso relacionando xi, yj, y zk
Pseudocdigo LCS
33
! PRINT-LCS tiene un orden de O(m + n) ! Para construir la LCS ! Iniciar en b[m,n] ! Seguir las flechas ! Flecha $ indica xi = yj, es un elemento de la LCS ! Llamado: LCS(b,X,length[X], length[Y])
v2
v5
v2
v5
v3
v4
v3
v4
es una cuerda !! Una triangulacin es un conjunto de cuerdas T que divide P en tringulos disjuntos
Las cuerdas no se intersectan !! T es maximal (cada cuerda % T intersecta una cuerda & T)
!!
v0 v1 v2 v3 v4 v6 v5
!! Problema !! Dados
"! P
=<vo, v1, , vn-1> "! Una funcin de pesos w sobre tringulos formada por P y T
Encontrar T que minimice la suma de pesos !! Example: w('vivjvk) = |vivj| + |vjvk| + |vkvi| (dist. Euclidiana) !! Este problema se puede reducir al problema de multiplicacin de matrices en cadena
!!
!! Subestructura ptima !! T tiene 'v0vkvn !! w(T) = w('v0vkvn) + m[0,k] + m[k + 1, n] !! Las dos soluciones a los subproblemas deben ser ptimas o w(T) no lo sera. !! El algoritmo requiere "(n3) en tiempo y "(n2) en memoria