Está en la página 1de 16

Programacin dinmica

1. Mtodo general.
2. Anlisis de tiempos de ejecucin.
3. Ejemplos de aplicacin.
3.1. Problema del cambio de monedas.
3.2. Problema de la mochila 0/1.

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.

Mtodo general
Ejemplo. Clculo de los nmeros de
Fibonacci.
Con mtodo recursivo
Fibonacci (n: integer)

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

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.

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
AD
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?

Mtodo general
Aspectos a definir en un algoritmo de programacin dinmica:
1. Ecuacin recurrente, para calcular la solucin de los
problemas grandes en funcin de los problemas ms
pequeos.
2. Determinar los casos base.
3. Definir las tablas utilizadas por el algoritmo, y cmo son
rellenadas.
4. 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.

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.

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

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}

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)

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.

Problema del cambio de monedas


Cmo calcular cuntas monedas de cada tipo
deben usarse, es decir la solucin (x 1, x2, ..., xn)?
Se usa otra tabla de decisiones tomadas:
Aux

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?

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: xava
a=1..i

Podemos definir el problema de forma


recurrente, en funcin de que se use o no el
objeto i.

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) = v i + Mochila (i - 1, m - wi)
Valor ptimo:
Mochila (i, m) = max (Mochila (i-1, m), v i + 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.

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]

trmino.

= -, y el mximo ser el otro

Ejemplo. n= 3, M= 6, w= (2, 3, 4), v= (1, 2, 5)

Tiempo de ejecucin: (nM).

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?

También podría gustarte