Anda di halaman 1dari 15

Programacin Dinmica

Adaptado de Algorithm Design Goodrich and Tamassia

Programacin Dinmica

Calculando la serie de Fibonacci


1,1,2,3,5,8,13,21,.

# 1 si n = 0,1 fib( n ) = $ o.c . % fib( n " 1) + fib(n " 2)

Programacin Dinmica

Solucin recursivo
int fib(int n){ if (n==0 || n==1) return 1; return fib(n-1)+fib(n-2); }

Muy ineficiente pues recalcula el mismo resultado muchas veces.


Fib(5) Fib(4) Fib(3) Fib(2) Fib(1) Fib(2) Fib(3) Fib(2) Fib(0)

Fib(0) Fib(1)

Fib(0) Fib(1)
Programacin Dinmica

Fib(0)
3

Fib(0)

Solucin tabular
int fib(int n){ int * fibTab = new int[n]; fibTab[0]=fibTab[1]=1; for(int i=0;i<=n;i++) fibTab[i]=fibTab[i-1]+fibTab[i-2]; return fibTab[n]; }

Mucho ms eficiente!

Programacin Dinmica

Solucin usando memoizacin


int fib(int n){ int * fibTab = new int[n]; for(int i=0;i<=n;i++) fibTab[i]= -1; return lookupFib(fibTab,n); } int lookupFib(int fibTab[],int n){ if (fibTab[n]!= -1) return fibTab[n]; fibTab[n]=lookupFib(fibTab,n-1)+ lookupFib(fibTab,n-2); return fibTab[n]; }

Programacin Dinmica

Multiplicacin ptima de Matrices


Problema:
!

Cmo multiplicar una secuencia de matrices de manera ptima? C = A*B A is d!e and B is e!f
e "1

Repaso: Multiplicacin de matrices


! !

f B

C[i, j ] = ! A[i, k ] * B[k , j ]


k =0
!

e e

O(def ) time d A

i,j f
6

Programacin Dinmica

Matrix Chain-Products
Producto encadenado de matrices:
! ! !

Calcular A=A0*A1**An-1 Ai es di ! di+1 Problema: Cmo agrupar (poner parntesis)? B es 3 ! 100 C es 100 ! 5 D es 5 ! 5 (B*C)*D necesita 1500 + 75 = 1575 ops B*(C*D) necesita 1500 + 2500 = 4000 ops

Ejemplo
! ! ! ! !

Programacin Dinmica

Estrategia exhaustiva
Algoritmo:
!

! !

Intentar todas las posibles formas de agrupar A=A0*A1**An-1 Calcular el nmero de ops para cada una Escoger la mejor El nmero de parentizaciones es igual al nmero de rboles binarios con n nodos. Esto es exponencial Aproximadamente 4n (nmeros de Cataln).
Programacin Dinmica 8

Tiempo de ejecucin
!

! !

Estrategia voraz
Idea #1: repetidamente seleccionar el producto que use el mayor nmero de ops. Contra-ejemplo:
! ! ! ! !

A is 10 ! 5 B is 5 ! 10 C is 10 ! 5 D is 5 ! 10 Idea voraz #1 da (A*B)*(C*D), que produce 500+1000+500 = 2000 ops A*((B*C)*D) produce 500+250+250 = 1000 ops
Programacin Dinmica 9

Otra estrategia voraz


Idea #2: repetidamente seleccionar el producto que use el menor nmero de ops. Contra-ejemplo:
! ! ! ! !

A is 101 ! 11 B is 11 ! 9 C is 9 ! 100 D is 100 ! 99 Idea voraz #2 da A*((B*C)*D)), el cual produce 109989+9900+108900=228789 ops (A*B)*(C*D) produce 9999+89991+89100=189090 ops

Una estrategia voraz definitivamente no funciona.


Programacin Dinmica 10

Una estrategia Recursiva


Defina subproblemas:
! ! !

Encuentre la mejor parentizacin de Ai*Ai+1**Aj. Sea Ni,j el nmero de operaciones ptimas para este subproblema. La solucin ptima del problema total es es N0,n-1.

Subproblemas ptimos: La solucin ptima puede ser definida en trminos de subproblemas ptimos.
!

Tiene que haber una multiplicacin final (raz del rbol de la expresin) para la solucin ptima. Digamos que la multiplicacin final sea en el ndice i: (A0**Ai)*(Ai+1**An-1). La solucin ptima N0,n-1 es la suma de 2 subproblemas ptimos, N0,i and Ni+1,n-1 mas el nmero de operaciones de la ltima multiplicacin. S el ptimo global no tiene estos componentes ptimos nosotros podemos definir una mejor solucin ptima.
Programacin Dinmica 11

Ecuacin recursiva
El ptimo global se debe definir en trminos de subproblemas ptimos, dependiendo en el lugar de la ltima multiplicacin. Consideremos todas los posibles lugares para la multiplicacin final: ! Recuerde que Ai es una matriz di ! di+1.
!

De manera que una definicin recursiva de Ni,j es la siguiente:

N i , j = min{N i ,k + N k +1, j + d i d k +1d j +1}


i !k < j

Note que los subproblemas son no independientes -los subproblemas se sobreponen.


Programacin Dinmica

12

Un algoritmo de programacin dinmica


Puesto que los subproblemas se Algorithm matrixChain(S): sobreponen, no se usa Input: sequence S of n matrices to be multiplied recursin. Output: number of operations in an optimal En cambio, se paranethization of S construyen los subproblemas ptimos for i " 1 to n-1 do de abajo hacia arriba Ni,i " 0 bottom-up. for b " 1 to n-1 do Los Ni,is son fciles, for i " 0 to n-b-1 do de manera que se empieza con ellos. j " i+b Seguir con Ni,j " +infinity subproblemas de for k " i to j-1 do longitud 2,3, etc. Ni,j " min{Ni,j , Ni,k +Nk+1,j +di dk+1 dj+1} Tiempo de ejecucin: O(n3)
Programacin Dinmica 13

Algoritmo en accin
La estrategia bottom-up llena la matriz N por diagonales Ni,j obtiene valores basados en valores previos en la i-sima fila y la j-sima columna La obtencin de la parentizacin ptima puede ser hecho recordando la k correspondiente a cada casilla

N i , j = min{N i ,k + N k +1, j + d i d k +1d j +1}

N
0 1 i

i !k < j

1 2

n-1

solucin

n-1

Programacin Dinmica

14

Tcnica General de Programacin Dinmica


Aplica a un problema que inicialmente pareciera requerir una gran cantidad de tiempo (posiblemente exponencial) y que debe cumplir:
!

Subproblemas simples: los subproblemas puden ser definidos en trminos de pocas variables. Optimalidad de subproblemas: El ptimo global puede ser definido en trminos de subproblemas ptimos Sobrelapamiento de subproblemas: Los problemas no son independientes (por lo tanto, la solucin debe construirse de abajo hacia arriba).
Programacin Dinmica 15