Sie sind auf Seite 1von 22

Programacin dinmica

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.

Ejemplo. Clculo de los nmeros de Fibonacci. Con mtodo recursivo


Fibonacci (n: integer)

Mtodo general

Si n<2 Devolver 1 Sino Devolver Fibonacci (n-1) + Fibonacci (n-2)

Problema: Muchos clculos estn repetidos, tiempo de ejec. exponencial.


Solucin: Calcular los valores de menor a mayor empezando por 0, e ir guardando los resultados en una tabla. Con programacin dinmica.
Fibonacci (n: integer)

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.

Anlisis de tiempos de ejecucin


El tiempo de ejecucin depende de las caractersticas concretas del problema a resolver. En general, ser de la forma: Tamao de la tabla*Tiempo de rellenar cada elemento de la tabla. Un aspecto importante de los algoritmos de programacin dinmica es que necesitan una tabla para almacenar los resultados parciales, que puede ocupar mucha memoria. Adems, algunos de estos clculos pueden ser innecesarios.
7

Problema del cambio de monedas


Problema: Dado un conjunto de n tipos de monedas, cada una con valor ci, y dada una cantidad P, encontrar el nmero mnimo de monedas que tenemos que usar para obtener esa cantidad.

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

Problema del cambio de monedas


Definicin de la ecuacin recurrente: Cambio (i, Q), el problema de calcular el nmero mnimo de monedas necesario para devolver una cantidad Q, usando los i primeros tipos de monedas (es decir los tipos 1...i). La solucin de Cambio(i, Q) puede que utilice k monedas de tipo i o puede que no utilice ninguna. Si no usa ninguna moneda de ese tipo: Cambio(i, Q) = Cambio(i - 1, Q) Si usa k monedas de tipo i: Cambio(i, Q) = Cambio(i, Q k*ci) + k En cualquier caso, el valor ser el mnimo: Cambio(i, Q) = mink=0,1,...,Q/ci {Cambio(i-1, Q-k* ci)+k} Casos base: Cambio(i, Q) Si (i0) (Q<0) entonces no existe ninguna solucin al problema, y Cambio(i, Q) = +. 9 En otro caso para cualquier i>0, Cambio(i, 0) = 0.

Problema del cambio de monedas


Definicin de las tablas utilizadas: Necesitamos almacenar los resultados de todos los subproblemas. El problema a resolver ser: Cambio (n, P). Por lo tanto, necesitamos una tabla de nxP, de enteros, que llamaremos D, siendo D[i, j ]= Cambio(i, j). Ejemplo. n= 3, P= 8, c= (1, 4, 6)
D Cantidad a devolver 3 4 5 Monedas C1= 1 C2 = 4 C3 = 6 0 1 2 6 7 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

Problema del cambio de monedas


Algoritmo.
Devolver-cambio (P: int; C: array [1..n] of int; var D: array [1..n, 0..P] of int);

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

Problema del cambio de monedas


Cmo calcular cuntas monedas de cada tipo deben usarse, es decir la solucin (x1, x2, ..., xn)? Se usa otra tabla de decisiones tomadas:
Aux C1= 1 C2 = 4 C3 = 6 0 0 0 0 1 1 0 0 2 2 0 0 3 3 0 0 4 4 1 0 5 5 1 0 6 6 1 1 7 7 1 1 8 8 2 0

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

Problema de la mochila 0/1


Igual que en el tema anterior, pero los objetos no se pueden fragmentar en trozos ms pequeos. Problema: Tenemos n objetos, cada uno con un peso (wi) y un beneficio (vi), y una mochila en la que podemos meter objetos, con una capacidad de peso mximo M. El objetivo es maximizar el beneficio de los objetos transportados, donde cada objeto se puede coger entero (xi=1) o nada (xi=0). Definicin de la ecuacin recurrente:
Sea Mochila (i, m) el problema de la mochila, considerando slo los i primeros objetos (de los n originales) con una capacidad de peso m. Supondremos que devuelve el valor de beneficio total:

a=1..i

xava

Podemos definir el problema de forma recurrente, en funcin de que se use o no el objeto i.


13

Problema de la mochila 0/1


Definicin de la ecuacin recurrente:
Si no se usa el objeto i: Mochila (i, m) = Mochila (i - 1, m) Si se usa: Mochila (i, m) = vi + Mochila (i - 1, m - wi) Valor ptimo: Mochila (i, m) = max (Mochila (i-1, m), vi + Mochila (i-1, m - wi))

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

Definicin de las tablas:


La solucin del problema original ser Mochila (n, M). Por lo tanto necesitamos una tabla: V: array [0..n, 0..M] of integer. V[i, j] = Beneficio mximo usando los i primeros objetos y peso j.
14

Problema de la mochila 0/1


Forma de rellenar las tablas:
Inicializar los casos base. Para todo i, desde 1 hasta n, y j desde 1 hasta M, aplicar la ecuacin de recurrencia: V[i, j] = max (V[i - 1, j] , V[i - 1, j - wi] + vi) Si j es negativo, entonces V[i, j] = -, y el mximo ser el otro trmino. Ejemplo. n= 3, M= 6, w= (2, 3, 4), v= (1, 2, 5)
i 0 1 2 3
j

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

Tiempo de ejecucin: (nM).


15

Problema de la mochila 0/1


Se puede tener una tabla auxiliar de 0/1 para almacenar las decisiones parciales y recomponer la solucin, o A partir de la tabla V obtener la solucin (x1, x2, ..., xn): partir de la posicin V[n, M] y analizar las decisiones que se tomaron para cada objeto i.
Si (V[i, j] = V[i-1, j]) entonces la solucin no usa el objeto i, xi= 0. Si (V[i, j] = V[i-1, j-wi] + vi) entonces s se usa el objeto i, xi= 1. Si (V[i, j] = V[i-1, j-wi] + vi) y (V[i, j] = V[i-1, j]) entonces podemos usar el objeto i o no (existe ms de una solucin ptima). Acabar cuando lleguemos a un i=0 j=0.

Cul ser el tiempo de recomponer la solucin? Se cumple el principio de optimalidad?

16

Multiplicacin encadenada de matrices


Supongamos que tenemos las matrices M1, M2, ..., Mn, que queremos multiplicar: M = M1 x M2 x ... x Mn Puesto que el producto es asociativo, habr muchas formas de realizar las multiplicaciones. Cada colocacin de los parntesis indica un orden en el que se realizan las operaciones. Segn el orden de las multiplicaciones, el nmero de total de multiplicaciones escalares necesarias puede variar considerablemente. Sea una matriz A de dimensin pxq y B de qxr, entonces el producto AxB requiere pqr multiplicaciones escalares (mtodo clsico).
17

Multiplicacin encadenada de matrices


Ejemplo. Sean las matrices A, B, C y D, de dimensiones: A= 13x5, B= 5x89, C= 89x3 y D= 3x34. Podemos multiplicarlas de 5 formas:
((AB)C)D (AB)(CD) (A(BC))D A((BC)D) A(B(CD)) Requiere 10.582 = 13589 + 13893 + 13334 54.201 2.856 = 5893 + 1353 + 13334 4.055 26.418

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

Multiplicacin encadenada de matrices


Si n=1 n=2, T(n) = 1. Si n>2, entonces podemos realizar la primera multiplicacin por n-1 sitios distintos: (M1M2 ... Mi)(Mi+1Mi+2... Mn)
T(n) =

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

Solucin utilizando programacin dinmica


Definimos NMulti (i, j): el nmero mnimo de productos escalares necesarios para realizar la multiplicacin entre la matriz i y la j (con i j), es decir: Mi x Mi+1 x ... x Mj
Suponemos que las dimensiones se almacenan en un array d[0..n], donde la matriz Mi ser de dimensin d[i-1] x d[i].
19

Multiplicacin encadenada de matrices


Casos base:
Si i = j, entonces NMulti(i, j) = 0. No necesitamos realizar ninguna operacin. Si i = j-1, entonces NMulti(i, j) = d[i-1]d[i]d[i+1]. Slo existe una forma de hacer el producto.

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

Tablas usadas por el algoritmo:


El resultado ser NMulti(1, n). Necesitamos una posicin para cada i, j, con 1 i j n.
20

Multiplicacin encadenada de matrices


Tablas usadas por el algoritmo. Sea M una matriz [1..n, 1..n] de enteros. El algoritmo usar la mitad de la matriz. j= 1 2 3 4
i=1 2 3 4 0 X 0 X X 0 X X X 0 3 2 1 0

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

Multiplicacin encadenada de matrices


Cul es el orden de complejidad de este algoritmo? En la posicin M[1, n] tenemos almacenado el nmero mnimo de multiplicaciones escalares necesario (para la ordenacin que es ptima). Necesitamos calcular cul es esta ordenacin ptima. Usar una matriz auxiliar Mejork [1..n, 1..n] en la que se almacene el mejor valor de k encontrado en cada paso durante el clculo de M (indica cul fue el mnimo en cada celda). En el ejemplo anterior.
Mejork i=1 2 3 4 j= 1 2 1 3 1 2 4 3 3 3 22

Das könnte Ihnen auch gefallen