Vous êtes sur la page 1sur 39

Anlisis y Diseo de Algoritmos

Programacin Dinmica
DR. JESS A. GONZLEZ BERNAL CIENCIAS COMPUTACIONALES INAOE

Introduccin a Programacin Dinmica


2

!! 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

!! Generalmente utilizada en problemas de

optimizacin

Introduccin a Programacin Dinmica


3

!! 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" % "

Multiplicacin de Matrices en Cadena


5

!! 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)

Solucin por Fuerza Bruta


7

!! Intentamos resolver el problema probando todas las maneras de

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 "
!!

El nmero de soluciones es exponencial en n


"! "

Resolver por programacin dinmica

Paso 1: Caracterizar la Estructura de la Solucin ptima (La estructura para agrupar los parntesis)
8

!! Sea Ai..j la matriz resultante del producto AiAi+1Aj

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
!!

!! Si hubiera otra forma de agrupar que nos de mejor

costo entonces la anterior no sera la ptima

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

eso se llama subestructura ptima

Paso 2. Definir una Solucin Recursiva


10

!! Definimos costo de una solucin ptima

recursivamente en trminos de la solucin ptima a subproblemas !! Subproblemas


Problema de determinar el costo mnimo de agrupar las matrices con parntesis para AiAi+1Aj para 1 ! i ! j ! n !! Sea m[i,j] el nmero mnimo de multiplicaciones escaleres para calcular Ai..j
!!
"! El

costo total para obtener A1..n sera m[1,n]

Paso 2. Definir una Solucin Recursiva


11

!! 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:

Paso 3: Calculando los Costos ptimos


12

!! Podemos utilizar la recurrencia anterior para

calcular el costo mnimo de m[1,n] para multiplicar A1A2An


Pero el algoritmo todava es exponencial (no mejor que fuerza bruta) !! Algo bueno es que tenemos relativamente pocos subproblemas
!!
"! Uno

para cada eleccin de i y j donde 1 ! i ! j ! n, 'n$ 2 % % 2" " + n = !( n ) & #

"! El

algoritmo puede encontrar subproblemas repetidos #! Traslape (Overlapping) #! Utilizamos mtodo bottom-up tabular " paso 3

Paso 3: Calculando los Costos ptimos


13

!! 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

construir la solucin ptima

Paso 3: Calculando los Costos ptimos


14

!! Tiempo de ejecucin de O(n3) y requiere "(n2)

memoria para almacenar m y s.

Paso 3: Calculando los Costos ptimos


15

Paso 3: Calculando los Costos ptimos


16

Paso 4. Construyendo la Solucin ptima


17

!! MATRIX-CHAIN-ORDER encuentra el nmero

ptimo de multiplicaciones escalares !! Construimos la solucin ptima con la informacin en s[1..n, 1..n]

Elementos de la Programacin Dinmica


18

!! Subestructura ptima

Un problema con solucin ptima que tiene sub-problemas con soluciones ptimas !! Si se presenta esta propiedad, podra aplicar (probablemente) programacin dinmica
!!

Elementos de la Programacin Dinmica


19

!! Problemas traslapados

El espacio de sub-problemas debe ser pequeo !! Un alg. recursivo los resolvera muchas veces
!!
"! Lo

ideal (recursivo) sera slo generar/resolver problemas nuevos

!!

Generalmente el nmero de sub-problemas diferentes es polinomial en tamao de la entrada

!! Divide y conquista genera nuevos problemas cada paso de

la recursin

Traslape en Multiplicacin en Cadena de Matrices


20

Algoritmo Recursivo para Multiplicacin de Matrices en Cadena


21

Anlisis de la Solucin Recursiva


22

#(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

= #(1) + ! #(1) + ! T (k )! T (n " k )


k =1 k =1 k =1

n "1

n "1

n "1

= #(1) + #(n " 1) + ! T (k ) + ! T (k )


k =1 k =1

n "1

n "1

= #( n ) + 2! T ( k )
k =1

n "1

Anlisis de la Solucin Recursiva


23

!! 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)

!! !!

Entonces, T(n) = #(2n) T(n) sigue siendo exponencial!

= #(n) + 2c $ 2 k +1
k =0

n"2

= #(n) + 4c $ 2 k
k =0

n"2

= #(n) + 4c(2 n "1 " 1) = #(n) + 2c 2 n " 4c ! c2n

Memoization
24

!! Variacin de programacin dinmica !! Estrategia top-down, con el algoritmo recursivo


"! Utiliza

una tabla con soluciones de subproblemas

Memoization para Multiplicacin de Matrices en Cadena


25

!! Tiempo: !! O(n3)
!!

Mejor que #(2n)

!! Memoria: !! O(n2)

Subsecuencia Comn ms Larga Longest Common Subsequence (LCS)


26

!! Una subsecuencia de otra secuencia es la misma

secuencia quitndole cero o ms elementos.


!! Dada la secuencia X = <x1, x2, , xm>, otra secuencia

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.

Ejemplos de Subsecuencias Comunes


27

!! Z = <B, C, D, B> es subsecuencia de X = <A, B, C, B,

D, A, B>, con la secuencia de ndices <2, 3, 5, 7>


!! Dadas las secuencias X y Y, Z es una secuencia

comn de X e Y si Z es una subsecuencia de ambas.


X = <A, B, C, B, D, A, B>, Y = <B, D, C, A, B, A>, la secuencia <B, C, A> es una subsecuencia comn de X e Y. !! La secuencia <B, C, B, A> es una LCS de X e Y, igual que <B, D, A, B>
!!

Problema LCS
28

!! Dadas dos secuencias X e Y, encontramos la

subsecuencia comn mxima de X e Y.

Problema LCS
29

!! Solucin por fuerza bruta !! 2m subsecuencias de X a buscar en Y


"! Cada

secuencia es un conjunto de ndices {1, 2, , m}

Tiempo exponencial !! No prctico para secuencias largas


!!

LCS con Programacin Dinmica


30

!! Subestructura ptima !! Definir


"! Dado

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

tanto, el problema de LCS tiene subestructura ptima

LCS con Programacin Dinmica


31

!! Traslape de subproblemas !! Sea c[i,j] la longitud de una LCS en las secuencias Xi y Yj


LCS(X,Y)

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)

!! La subestructura ptima del problema LCS nos lleva

a la sig. frmula recursiva

LCS con Programacin Dinmica


32

!! Algoritmo recursivo exponencial para calcular

longitud de una LCS de dos secuencias


!!

Pero slo hay m x n subproblemas distintos

!! Solucin !! Utilizar programacin dinmica


"! Procedimiento

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

LCS-LENGTH tiene un orden de O(mn)

Construccin de una LCS


34

! 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])

Triangulacin ptima de Polgono Optimal Polygon Triangulation


35

!! Un polgono se define como P = <v0, v1, , vn-1>


v0 v1 v6 v1 v0 v6

v2

v5

v2

v5

v3

v4

v3

v4

Triangulacin ptima de Polgono Optimal Polygon Triangulation


36

!! Un polgono es convexo si un segmento de lnea

entre dos puntos, o en su interior, caen ya sea en sus bordes o en su interior.


Polgono no-convexo

Triangulacin ptima de Polgono Optimal Polygon Triangulation


37

!! Si vi y vj no son adyacentes, entonces el segmento vivj

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

Triangulacin ptima de Polgono Optimal Polygon Triangulation


38

!! 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
!!

Triangulacin ptima de Polgono Optimal Polygon Triangulation


39

!! 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

Vous aimerez peut-être aussi