You are on page 1of 28

PRESENTACIN

En el presente trabajo se busca plasmar lo ms importante de la


programacin dinmica, ya que es muy importante para la solucin de
problemas en los que es necesario tomar decisiones en etapas sucesivas.
Primero se dar una breve introduccin sobre la programacin dinmica,
continuando con la historia, conceptos bsicos y tipos; finalizando con un
ejercicio aplicado en WINQSB.

INTRODUCCIN
Muchos problemas de programacin matemtica determinan soluciones que
repercuten en la formulacin de los problemas a resolver en el prximo
periodo o etapa. Una alternativa es construir un nico modelo completo que
tenga un gran conjunto de variables indexadas por etapas e internalizar las
relaciones entre etapas como una restriccin del problema.
Una forma razonable y comnmente empleada de resolver un problema es
definir o caracterizar su solucin en trminos de las soluciones de
subproblemas del mismo. Esta idea, cuando se emplea recursivamente,
proporciona mtodos eficientes de solucin para problemas en los que los
subproblemas son versiones ms pequeas del problema original.
Sin embargo esto pude agrandar mucho el tamao del problema. Surge as
Programacin Dinmica (PD) como una alternativa de descomposicin en
que resolvemos subproblemas ms pequeos y luego los ligamos.

PROGRAMACIN DINMICA
1. HISTORIA
El trmino Programacin Dinmica fue utilizado originalmente en los
1940s por Richard Bellman para describir el proceso de resolver problemas
donde se necesita encontrar las mejores decisiones una tras otra.

Para 1953, el refin esto a su significado moderno, el cual se refiere


especficamente a anidar pequeos problemas de decisin dentro de
grandes decisiones, luego de esto el campo fue reconocido por la lEEE como
un tpico de anlisis de sistemas e ingeniera.

La contribucin de Bellman es recordada en el nombre de la ecuacin


de Bellman, un resultado central de programacin dinmica que replantea
un problema de optimizacin en forma recursiva.

Originalmente la palabra programacin en programacin dinmica no


tena conexin con la programacin de computadoras y en cambio vena del
trmino programacin matemtica.

Sin embargo, actualmente muchos problemas de optimizacin son mejor


resueltos escribiendo programas de computadoras que implementa un
algoritmo de programacin dinmica, lo cual resulta mejor que llevar a cabo
cientos de clculos a mano.

2. DEFINICIN
La programacin dinmica consiste en una tcnica que permite determinar
de manera eficiente las decisiones que optimizan el comportamiento de un
sistema que evoluciona a lo largo de una serie de etapas. En otras
palabras, trata de encontrar la secuencia de decisiones que optimiza el
comportamiento de un proceso polietpico.
La naturaleza del razonamiento que se debe realizar en programacin
dinmica es muy diferente al de la programacin lineal. En programacin
lineal, intenta describir una determinada situacin en trminos de un
modelo matemtico determinado; una vez conocida la naturaleza de las
variables de decisin, y expresadas la funcin objetivo y las restricciones
en funcin de esas variables, la resolucin del modelo puede confiarse, sin
mayores problemas, a un
programa informtico. La programacin
dinmica no admite una resolucin sistemtica de este tipo; ms que un
modelo concreto, es una estrategia de resolucin comn a muchas
situaciones en principio diferentes entre s.
Adems, es frecuente que la resolucin del modelo est muy relacionada
con la situacin que se ha de modelizar. En contrapartida, las
simplificaciones que en ocasiones deben realizarse en programacin lineal
para poder resolver el modelo no son necesarias en programacin dinmica,
que admite gran variedad de relaciones entre variables.
La estrategia seguida en este mdulo para introducir al lector a la
programacin dinmica, compartida por otros autores que se han
enfrentado a esta situacin, consiste en comenzar con una introduccin
terica que describe las caractersticas de los procesos que pueden ser

representados por programacin dinmica: los procesos polietpicos de


decisin. A continuacin, se introducen los elementos comunes a cualquier
modelo de programacin dinmica: las etapas, los estados, las variables
de decisin y la funcin de recurrencia. Finalmente se muestran los
diversos tipos de programacin dinmica existentes:

Programacin dinmica no homognea, frente a programacin


dinmica homognea en el tiempo.
Para este ltimo caso, podremos plantearnos encontrar la solucin
para horizonte finito o p ara horizonte infinito.
Programacin dinmica determinista, frente a programacin
dinmica aleatoria. En este caso, es interesante destacar que las
cadenas de Markov con remuneracin y decisin son un caso
particular de programacin dinmica aleatoria homognea en el
tiempo.

Estos tipos de programacin dinmica se introducirn mediante ejemplos,


que esperamos que ayuden al lector a internalizar la lgica de la
programacin dinmica.

3. CARACTERSITICAS
DINMICA

DE

LA

PROGRAMACIN

Para que un problema pueda ser resuelto con la tcnica de programacin


dinmica, debe cumplir con ciertas caractersticas:

Naturaleza secuencial de las decisiones: El problema puede ser


dividido en etapas.
Cada etapa tiene un nmero de estados asociados a ella.
La decisin ptima de cada etapa depende solo del estado actual
y no de las decisiones anteriores.
La decisin tomada en una etapa determina cual ser el estado de la
etapa siguiente.

En sntesis, la poltica ptima desde un estado s de la etapa k a la etapa final


est constituida por una decisin que transforma s en un estado s0 de la
etapa k +1 y por la poltica optima desde el estado s0 hasta la etapa final.

4. RESOLUCIN
DE
UN
PROGRAMACIN DINMICA

PROBLEMA

DE

Para resolver un problema de programacin dinmica debemos al menos:

Cada etapa debe tener asociado una o ms decisiones (problema


de optimizacin), cuya dependencia de las decisiones anteriores
est dada exclusivamente por las variables de estado.
Cada estado debe contener toda la informacin relevante para la
toma de decisin asociada al periodo.
Las variables de decisin son aquellas sobre las cuales debemos
definir su valor de modo de optimizar el beneficio acumulado y
modificar el estado de la prxima etapa.

1. Descripcin de ecuaciones de recurrencia: Nos deben


indicar como se acumula la funcin de beneficios a optimizar
(funcin objetivo) y como varan las funciones de estado de una
etapa a otra.
2. Resolucin: Debemos optimizar cada subproblemas por
etapas en funcin de los resultados de la resolucin del
subproblemas siguiente. Notar que las para que las
recurrencias estn bien definidas requerimos de condiciones
de borde.

5. PRINCIPIO DE OPTIMALIDAD
Cuando hablamos de optimizar nos referimos a buscar alguna de las
mejores soluciones de entre muchas alternativas posibles. Dicho proceso de
optimizacin puede ser visto como una secuencia de decisiones que nos
proporcionan la solucin correcta. Si, dada una subsecuencia de
decisiones, siempre se conoce cul es la decisin que debe tomarse a
continuacin para obtener la secuencia ptima, el problema es elemental y
se resuelve trivialmente tomando una decisin detrs de otra, lo que se
conoce como estrategia voraz.
En otros casos, aunque no sea posible aplicar la estrategia voraz, se
cumple el principio de optimalidad de Bellman que dicta que dada una
secuencia ptima de decisiones, toda subsecuencia de ella es, a su vez,
ptima.
En este caso sigue siendo posible el ir tomando decisiones elementales, en
la confianza de que la combinacin de ellas seguir siendo ptima, pero
ser entonces necesario explorar muchas secuencias de decisiones para
dar con la correcta, siendo aqu donde interviene la programacin
dinmica.
Contemplar un problema como una secuencia de decisiones equivale a
dividirlo en problemas ms pequeos y por lo tanto ms fciles de
resolver como hacemos en Divide y Vencers, tcnica similar a la de
programacin dinmica. La programacin dinmica se aplica cuando la
subdivisin de un problema conduce a:

Una enorme cantidad de problemas.


Problemas cuyas soluciones parciales se solapan.
Grupos de problemas de muy distinta complejidad.

ALGORITMOS DE PROGRAMACIN DINMICA


Para que un problema pueda ser abordado por la
p rog ramacin din mica ha de cumplir dos condiciones:

tcnica

La solucin al problema ha de ser alcanzada a travs de una


secuencia de decisiones, una en cada etapa.
Dicha secuencia de decisiones ha de cumplir el
principio de ptimo.
En grandes lneas, el diseo de un algoritmo de Programacin
Dinmica consta de los siguientes pasos:
1. Planteamiento de la solucin como una sucesin de decisiones
y verificacin de que sta cumple el principio de ptimo.
2. Definicin recursiva de la
solucin.
3. Clculo del valor de la solucin ptima mediante una
tabla
en
donde
se almacenan soluciones a problemas
parciales para reutilizar los clculos.
4. Construccin de la solucin ptima haciendo uso de la
informacin contenida en la tabla anterior.

CLCULO DE
FIBONACCI

LOS

NMEROS

DE

Antes de abordar problemas ms complejos veamos un primer


ejemplo en el cual va a quedar reflejada toda esta problemtica. Se
trata del clculo de los trminos de la sucesin de nmeros de
Fibonacci. Dicha sucesin podemos expresarla recursivamente en
trminos matemticos de la siguiente manera:

Por tanto, la forma ms natural de calcular los trminos de esa

de

sucesin es mediante un programa recursivo:


PROCEDURE
FibRec(n:CARDINAL):CARDINAL;
BEGIN
IF n<=1 THEN RETURN 1
ELSE
RETURN
FibRec(n-1)
FibRec(n-2) END
END FibRec;

El inconveniente es que el algoritmo resultante es poco eficiente ya


que su tiempo de ejecucin es de orden exponencial.
Como podemos observar, la falta de eficiencia del algoritmo se debe a
que se producen llamadas Recursivas repetidas para calcular valores
de la sucesin, que habindose calculado previamente, no se
conserva el resultado y por tanto es necesario volver a calcular
cada vez.

Para este problema es posible disear un algoritmo que en tiempo


lineal lo resuelva mediante la construccin de una tabla que permita ir
almacenando los clculos realizados hasta el momento para poder
reutilizarlos:
Fib(0)

Fib(1)

Fib(2)

...

Fib(n)

El algoritmo iterativo que calcula la sucesin de Fibonacci utilizando tal


tabla es:
TYPE TABLA = ARRAY [0..n] OF CARDINAL
PROCEDURE
FibIter(VAR
T:TABLA;n:CARDINAL):CARDINAL;
VAR
i:CARDINAL;
BEGIN
IF n<=1 THEN RETURN 1
ELSE
T[0]:
=1;
T[1]:
=1:
FOR i:=2 TO n DO
T[i]:=T[i1]+T[i-2]
END;
RETURN
T[n] END
END FibIter;
Existe an otra mejora a este algoritmo, que aparece al fijarnos que
nicamente son necesarios los dos ltimos valores calculados para
determinar cada trmino, lo que permite eliminar la tabla entera y
quedarnos solamente con dos variables para almacenar los dos ltimos
trminos:
PROCEDURE FibIter2(n: CARDINAL):CARDINAL;
VAR i,suma,x,y:CARDINAL; (* x e y son
ultimos terminos *) BEGIN
IF n<=1 THEN RETURN 1
ELSE
x:=1; y:=1;
FOR i:=2 TO n DO
suma:=x+y;
y:=x;
x:=suma; END;
RETURN suma
END
END FibIter2;

los 2

Aunque esta funcin sea de la misma complejidad temporal que la


anterior (lineal), consigue una complejidad espacial menor, pues de ser
de orden O(x) pasa a ser O(1) ya que hemos eliminado la tabla.
El uso de estructuras (vectores o tablas) para eliminar la repeticin
de los clculos, pieza clave de los algoritmos de Programacin
Dinmica

En general, los algoritmos obtenidos mediante la aplicacin de


programacin dinmica consiguen tener complejidades (espacio y
tiempo) bastante razonables, pero debemos evitar que el tratar
de obtener una complejidad temporal de orden polinmico
conduzca a una complejidad espacial demasiado elevada,
como veremos en alguno de los ejemplos de este captulo.

CLCULO
DE
BINOMIALES

LOS

COEFICIENTES

En la resolucin de un problema, una vez encontrada la expresin


recursiva que define su solucin, muchas veces la dificultad estriba en
la creacin del vector o la tabla que ha de conservar los resultados
parciales. As en este segundo ejemplo, aunque tambin sencillo,
observamos que vamos a necesitar una tabla bidimensional
algo ms compleja. Se trata del clculo de los coeficientes binomiales,
definidos como:

El algoritmo recursivo que los calcula resulta ser de complejidad


exponencial por la repeticin de los clculos que realiza. No obstante,
es posible disear un algoritmo con un tiempo de ejecucin de
orden O(nk) basado en la idea del Tringulo de Pascal. Para ello es
necesario la creacin de una tabla bidimensional en la que ir
almacenando los valores intermedios que se utilizan posteriormente:

0
1
2
3
...
...
n-1
N

0
1
1
1
1
...
...

...

1
2
3
...
...

1
3
...
...

1
...
...

...
...

k-1

...
C(n-1,k-1) C(n-1,k)
+
C(n,k)

Iremos construyendo esta tabla por filas de arriba hacia abajo


y de izquierda a derecha mediante el siguiente algoritmo de
complejidad polinmica:
PROCEDURE
CoefIter(n,k:CARDINAL):CARDINAL;
VAR i, j: CARDINAL;
C: TABLA;
BEGIN
FOR
i:=0 TO
n
DO
C[i,0]:=1 END; FOR i:=1
TO n DO C[i,1]:=i END;
FOR
i:=2 TO
k
DO
C[i,i]:=1 END; FOR i:=3
TO n DO

FOR j:=2 TO i1 DO IF j<=k


THEN
C
[i,
j]:=C[i-1,j1]+C[i-1,j] END
EN
D
END;
RETURN
C[n,k]
END
CoefIter.

LA
SUBSECUENCIA
MXIMA

COMN

Hay muchos problemas para los cuales no slo deseamos encontrar el


valor de la solucin ptima sino que adems deseamos conocer cul es
la composicin de esta solucin, es decir, los elementos que forman
parte de ella. En estos casos es necesario ir conservando no slo
los valores de las soluciones parciales, sino tambin cmo se llega a
ellas. Esta informacin adicional puede ser almacenada en la misma
tabla que las soluciones parciales, o bien en otra tabla al efecto.
Veamos un ejemplo en el que se crea una tabla y a partir de ella se
reconstruye la solucin. Se trata del clculo de la subsecuencia comn
mxima. Vamos en primer lugar a definir el problema.
Dada una secuencia X={x1 x2 ... xm}, decimos que Z={z1
z2 ... zk} es una subsecuencia de X (siendo k m) si existe
una secuencia creciente {i1 i2 ... ik} de ndices de X tales que
para todo j = 1, 2, ..., k tenemos xij = zj.
Dadas dos secuencias X e Y, decimos que Z es una subsecuencia
comn de X e Y si es subsecuencia de X y subsecuencia de Y.
Deseamos determinar la subsecuencia de longitud mxima
comn a dos secuencias.
Solucin
Llamaremos L(i,j) a la longitud de la secuencia comn mxima
(SCM) de las
secuencias Xi e Yj , siendo Xi el i-simo prefijo de X (esto es, Xi
= {x1 x2 ... xi}) e Yj
el j-simo prefijo de Y, (Yj = {y1
y2 ... yj}).
Aplicando el principio de ptimo podemos plantear la
solucin como una sucesin de decisiones en las que en cada
paso determinaremos si un carcter forma o no parte de la
SCM. Escogiendo una estrategia hacia atrs, es decir,
comenzando por los ltimos caracteres de las dos secuencias X
e Y, la solucin viene dada por la siguiente relacin en
recurrencia:

La solucin recursiva resulta ser de orden exponencial,


y por tanto Programacin Dinmica va a construir una tabla
con los valores L(i, j) para evitar la repeticin de clculos. Para
ilustrar la construccin de la tabla supondremos que X e Y son las
secuencias de valores:

X = {1 0 0 1 0 1
0 1}
Y = {0 1 0 1 1 0 1
1 0}
La tabla que permite calcular la subsecuencia comn mxima es:

Esta tabla se va construyendo por filas y rellenando de izquierda a derecha.


Como podemos ver en cada L[i,j] hay dos datos: uno el que corresponde a la
longitud de cada subsecuencia, y otro necesario para la construccin de la
subsecuencia ptima.
La solucin a la subsecuencia comn mxima de las secuencias X e Y se
encuentra en el extremo inferior derecho (L[9,8]) y por tanto su longitud es
seis. Si queremos obtener cul es esa subsecuencia hemos de recorrer la
tabla (zona sombreada) a partir de esta posicin siguiendo la informacin
que nos indica cmo obtener las longitudes ptimas a partir de su
procedencia (izquierda, diagonal o superior). El algoritmo para construir la
tabla tiene una complejidad de orden O(nm), siendo n y m las longitudes de
las secuencias X e Y.
PROCEDURE SubSecMaxima(VAR
X,Y:SECUENCIA;n,m:CARDINAL;VAR L:TABLA); VAR
i,j:CARDINAL;
BEGIN
FOR i:=0 TO m DO (* condiciones
iniciales *) L[i,0].numero:=0
END;
FOR j:=0 TO n
DO
L[0,j].numer
o:=0
END;
FOR i:=1 TO m DO
FOR j:=1 TO n DO
IF Y[i] = X[j] THEN
L[i,j].numero:=L[i-1,j1].numero+1;
L[i,j].procedencia:="D"
ELSIF L[i-1,j].numero >=L[i,j1].numero THEN

L[i,j].numero:=L[i-1,j].numero;
L[i,j].procedencia:="S"
ELSE
L[i,j].numero:=L[i,j1].numero;
L[i,j].procedencia:="I"
EN
D END
END
END SubSecMaxima.
Para encontrar cul es esa subsecuencia ptima hacemos uso de
la informacin contenida en el campo procedencia de la tabla L,
sabiendo que I(por Izq) significa que la informacin la toma de
la casilla de la izquierda, S (Sup) de la casilla superior y de la
misma manera D(Diag) corresponde a la casilla que est en la
diagonal. El algoritmo que recorre la tabla construyendo la
solucin a partir de esta informacin y de la secuencia Y es el que
sigue:
PROCEDURE Escribir(VAR L:TABLA; VAR Y:SECUENCIA;
i,j:CARDINAL; VAR sol:SECUENCIA; VAR
l:CARDINAL);
(* sol es la secuencia solucion, l su longitud,
i es la longitud de la secuencia Y, y j la de
X *)
BEGIN
IF (i=0) OR (j=0) THEN RETURN END;
IF L[i,j].procedencia =
"D" THEN
Escribir(L,Y,i-1,j1,sol,l); sol[l]:=Y[i];
INC(l);
ELSIF L[i,j].procedencia =
"S" THEN Escribir(L,Y,i1,j,sol,l)
ELSE
Escribir(L,Y,i,j1,sol,l) END
END Escribir
La complejidad de este algoritmo es de orden O(n+m) ya que
en cada paso de la recursin puede ir disminuyendo o bien el
parmetro i o bien j hasta alcanzar la posicin L[i,j] para i = 0 j
= 0.

INTERESES BANCARIOS
Dadas n funciones f1, f2, ..., fn y un entero positivo M, deseamos
maximizar la funcin f1(x1) + f2(x2) + ... + fn(xn) sujeta a la
restriccin x1 +x2 + ... + xn = M, donde fi(0) = 0 (i=1,..,n), xi son
nmeros naturales, y todas las funciones son montonas crecientes, es
decir, x y implica que fi(x) > fi(y). Supngase que los valores de
cada funcin se almacenan en un vector.
Este problema tiene una aplicacin real muy interesante, en donde fi
representa la funcin de inters que proporciona el banco i, y lo que
deseamos es maximizar el inters total al invertir una cantidad

determinada de dinero M. Los valores xi van a representar la cantidad


a invertir en cada uno de los n bancos.
Solucin
(.) Sea fi un vector que almacena el inters del banco i (1 i
n) para una inversin
de 1, 2, 3, ..., M pesetas. Esto es, fi(j) indicar el inters que
ofrece el banco i para j
pesetas, con 0 < i n , 0
< j M.
Para poder plantear el problema como una sucesin de decisiones,
llamaremos
In(M) al inters mximo al invertir M pesetas
en n bancos,
In(M) = f1(x1) + f2(x2) +
... + fn(xn)
que es la funcin a maximizar, sujeta a la restriccin x1
+x2 + ... + xn = M.
Veamos cmo aplicar el principio de ptimo. Si In(M) es el
resultado de una secuencia de decisiones y resulta ser ptima
para el problema de invertir una cantidad M en n bancos,
cualquiera de sus subsecuencias de decisiones ha de ser tambin
ptima y as la cantidad
In1(M xn) = f1(x1) + f2(x2) +
... + fn1(xn1)
ser tambin ptima para el subproblema de invertir (M xn)
pesetas en n 1 bancos. Y por tanto el principio de ptimo nos
lleva a plantear la siguiente relacin en recurrencia:

Para resolverla y calcular In(M), vamos a utilizar una matriz I de


dimensin nxM en donde iremos almacenando los resultados parciales
y as eliminar la repeticin de los clculos. El valor de I[i,j] va a
representar el inters de j pesetas cuando se dispone de i bancos, por
tanto la solucin buscada se encontrar en I[n,M]. Para guardar los
datos iniciales del problema vamos a utilizar otra matriz F, de la misma
dimensin, y donde F[i,j] representa el inters del banco i para j
pesetas.
En consecuencia, para calcular el valor pedido de I[n,M] rellenaremos
la tabla por filas, empezando por los valores iniciales de la ecuacin
en recurrencia, y segn el siguiente algoritmo:
CONST n = ...; (* numero de bancos *)
M = ...; (* cantidad a
invertir *)
TYPE MATRIZ = ARRAY [1..n],[0..M] OF CARDINAL;
PROCEDURE Intereses(VAR F:MATRIZ;VAR
I:MATRIZ):CARDINAL; VAR i,j: CARDINAL;

BEGIN
FOR i:=1 TO n DO I[i,0]:=0 END;
FOR j:=1 TO M DO
I[1,j]:=F[1,j] END; FOR i:=2
TO n DO
FOR j:=1 TO M DO
I[i,j]:=Max(I,
F,i,j)
EN
D
END;
RETURN
I[n,M] END
Intereses;
La funcin Max es la que calcula el mximo que aparece en la expresin
[5.1]:
PROCEDURE Max(VAR
I,F:MATRIZ;i,j:CARDINAL):CARDINAL; VAR
max,t:CARDINAL;
BEGIN
max:= I[i-1,j] +
F[i,0]; FOR t:=1
TO j DO
max:=Max2(max,I[i-1,jt]+F[i,t]) END;
RETURN max
END Max;
La funcin Max2 es la que calcula el mximo de dos nmeros
naturales.
La complejidad del algoritmo completo es de orden
2
O(nM ), puesto que la complejidad de Max es O(j) y se invoca
dentro de dos bucles anidados que se desarrollan desde 1 hasta M.
Es importante hacer notar el uso de parmetros por referencia en lugar
de por valor para evitar la copia de las matrices en la pila de ejecucin
del programa.
Por otro lado, la complejidad espacial del algoritmo es del orden
O(nM), pues de este orden son las dos matrices que se utilizan para
almacenar los resultados intermedios.
En este ejemplo queda de manifiesto la efectividad del uso de
estructuras en los algoritmos de
Programacin Dinmica para
conseguir obtener tiempos de ejecucin de orden polinmico,
frente a los tiempos exponenciales de los algoritmos recursivos
iniciales.

LA MOCHILA

Se plantea el problema de la Mochila (0,1), que consista en decidir


de entre n objetos de pesos p1, p2,..., pn y beneficios b1, b2,...,
bn, cules hay que incluir en una mochila de capacidad M sin
superar dicha capacidad y de forma que se maximice la suma de los
beneficios de los elementos escogidos. Los algoritmos vidos
planteados entonces no conseguan resolver el problema. Nos
cuestionamos aqu si este problema admite una solucin mediante
Programacin Dinmica.

Solucin
Para encontrar un algoritmo de Programacin Dinmica que lo
resuelva, primero
hemos de plantear el problema como una secuencia de decisiones que
verifique el principio de ptimo. De aqu seremos capaces de deducir
una expresin recursiva de la solucin. Por ltimo habr que
encontrar una estructura de datos adecuada que
permita
la
reutilizacin de los clculos de la ecuacin en recurrencia,
consiguiendo una complejidad mejor que la del algoritmo puramente
recursivo.
Siendo M la capacidad de la mochila y disponiendo de n elementos,
llamaremos V(i,p) al valor mximo de la mochila con capacidad p
con 0 p M y 1 i n La solucin
cuando consideramos i objetos, con
viene dada por el valor de V(n,M). Denominaremos d1, d2, ..., dn a la
secuencia de decisiones que conducen a obtener V(n,M), donde cada
di podr tomar uno de los valores 1 0, dependiendo si se introduce
o no el i-simo elemento. Podemos tener por tanto dos
situaciones distintas:
Que dn = 1. La subsecuencia de decisiones d1, d2, ...,
dn1 ha de ser tambin ptima para el problema V(n1,M
pn), ya que si no lo fuera y existiera otra subsecuencia e1,
e2, ..., en1 ptima, la secuencia e1, e2, ..., en1, dn
tambin sera ptima para el problema V(n,M) lo que
contradice la hiptesis.
Que dn = 0. Entonces la subsecuencia decisiones d1,
d2, ..., dn-1 ha de ser tambin ptima para el problema
V(n1,M).
Podemos aplicar por tanto el principio de ptimo para formular
la relacin en recurrencia. Teniendo en cuenta que en la
mochila no puede introducirse una fraccin del elemento sino
que el elemento i se introduce o no se introduce, en una situacin
cualquiera V(i,p) tomar el valor mayor entre V(i1,p), que indica
que el elemento i no se introduce, y V(i1,ppi)+bi, que es el
resultado de introducirlo y de ah que la capacidad ha de
disminuir en pi y el valor aumentar en bi, y por tanto podemos
plantear la solucin al problema mediante la siguiente ecuacin:

Estos valores se van almacenando en una tabla construida mediante el


algoritmo:
TYPE TABLA = ARRAY[1..n],[0..M] OF
CARDINAL; DATOS = RECORD
peso,valor:CARDINAL; END;
TIPOOBJETO = ARRAY[1..n] OF
DATOS;
PROCEDURE Mochila (i,p:CARDINAL; VAR
obj:TIPOOBJETO):CARDINAL; VAR elem,cap:CARDINAL;
V:TABLA;
BEGIN
FOR elem:=1 TO
i DO

V[elem,0]:=
0;
FOR cap:=1 TO p DO
IF (elem=1) AND
(cap<obj[1].peso) THEN
V[elem,cap]:=0
ELSIF elem=1 THEN
V[elem,cap]:=obj[
1].valor
ELSIF
cap<obj[elem].peso
THEN
V[elem,cap]:=V[ele
m-1,cap]
ELSE V[elem,cap]:=
Max2(V[elem-1,cap],obj[elem].valor+V[elem1,cap-obj[elem].peso]) END
EN
D
END;
RETURN
V[i,p] END
Mochila;
El problema se resuelve invocando a la funcin con i=n, p=M. La
complejidad del algoritmo viene determinada por la construccin de
una tabla de dimensiones nxM y por tanto su tiempo de ejecucin es
de orden de complejidad O(nM). La funcin Max2 es la que calcula el
mximo de dos valores.
Si adems del valor de la solucin ptima se desea conocer los
elementos que son introducidos, es decir, la composicin de la
mochila, es necesario aadir al algoritmo la construccin de una tabla
de valores lgicos que indique para cada valor E[i,j] si el elemento i
forma parte de la solucin para la capacidad j o no:
TYPE ENTRAONO = ARRAY[1..n],[0..P] OF BOOLEAN;
PROCEDURE Max2especial(x,y:CARDINAL;VAR
esmenorx:BOOLEAN):CARDINAL; BEGIN
IF x>y THEN
esmenorx:=FA
LSE; RETURN x
ELSE
esmenorx:=T
RUE; RETURN
y
END
END Max2especial;
PROCEDURE Mochila2(i,p:CARDINAL;obj:TIPOOBJETO;VAR
E:ENTRAONO)
:CARDINAL;
VAR elem,cap:CARDINAL;

V:TABLA; BEGIN
FOR elem:=1 TO
i DO
V[elem,0]:=
0;
FOR cap:=1 TO p DO
IF (elem=1) AND
(cap<obj[1].peso) THEN
V[elem,cap]:=0;
E[elem,cap]:=FALSE
ELSIF elem=1 THEN
V[elem,cap]:=obj[1
].valor;
E[elem,cap]:=TRUE
ELSIF cap<obj[elem].peso
THEN
V[elem,cap]:=V[elem
-1,cap];
E[elem,cap]:=FALSE
ELSE V[elem,cap]:=Max2especial(V[elem1,cap], obj[elem].valor+V[elem-1,elemobj[elem].peso],E[elem,cap]); END
EN
D
END;
RETURN
V[i,p] END
Mochila2;
Por otra parte, es necesario construir un algoritmo que interprete los
valores de esta tabla para componer la solucin. Esto se realizar
recorrindola en sentido inverso desde los valores i = n, j = M hasta i
= 0, j = 0, mediante el siguiente algoritmo:
TYPE SOLUCION = ARRAY[1..n] OF
CARDINAL; PROCEDURE Componer(VAR
sol:SOLUCION);
VAR elem,cap:CARDINAL;
BEGIN
FOR elem:=1 TO n DO (* inicializa solucion *)
sol[elem]:=0
END;
elem:= n; cap:= M;
WHILE (elem<>0) AND
(cap<>0) DO IF
entra[elem,cap] THEN
sol[elem]:=1;
cap:=cap-obj[elem].peso
END;
DEC(ele
m)
END

END Componer;

EL
ALGORITMO
WARSHALL

DE

Al igual que ocurre con el algoritmo de Floyd descrito en el apartado


anterior, estamos interesados en encontrar caminos entre cada dos
vrtices de un grafo. Sin embargo, aqu no nos importa su longitud,
sino slo su existencia. Por tanto, lo que deseamos es disear un
algoritmo que permita conocer si dos vrtices de un grafo estn
conectados o no, lo que nos llevara al cierre transitivo del grafo.
Solucin
Para un grafo g = (V,A) cuya matriz de adyacencia sea L, el
algoritmo pedido puede ser implementado como sigue:
CONST n = ...; (* numero de vertices
del grafo *) TYPE
MATRIZ
=
ARRAY[1..n],[1..n] OF BOOLEAN;
PROCEDURE
Warshall
(VAR
L,D:MATRIZ); VAR
i,j,k:
CARDINAL;
BEGIN
FOR i:=1 TO
n DO
FOR j:=1 TO n
DO
D[i,j]:=L[
i,j]
EN
D
END;
FOR k:=1 TO
n DO
FOR i:=1 TO n DO
FOR j:=1 TO
n DO
D[i,j]:=D[i,j] OR (D[i,k] AND
D[k,j]) END
EN
D END
END Warshall;
Tras la ejecucin del algoritmo, la solucin se encuentra en la matriz D,
que verifica que D[i,j] = TRUE si y slo si existe un camino entre los
vrtices i y j. Obsrvese la similitud entre este algoritmo y el de Floyd.
3
En cuanto a su complejidad, podemos afirmar que es de orden O(n )
debido al triple bucle anidado que posee, en cuyo interior slo se
realizan operaciones constantes.

EL
ALGORITMO
FLOYD

DE

Sea g un grafo dirigido y ponderado. Para calcular el menor de


los caminos mnimos entre dos vrtices cualesquiera del grafo,
podemos aplicar el algoritmo de Dijkstra a todos los pares posibles y
calcular su mnimo, o bien aplicamos el siguiente algoritmo (Floyd)
que, dada la matriz L de adyacencia del grafo g, calcula una matriz D
con la longitud del camino mnimo que une cada par de vrtices:
CONST n = ...; (* numero de vertices
del grafo *) TYPE
MATRIZ
=
ARRAY[1..n],[1..n] OF CARDINAL;
PROCEDURE
Floyd
(VAR
L,D:MATRIZ); VAR
i,j,k:
CARDINAL;
BEGIN
FOR i:=1 TO n DO FOR j:=1
TO n DO D[i,j]:=L[i,j]
END END;
FOR k:=1 TO n DO
FOR i:=1 TO
n DO
FOR
j:=1
TO
n
DO
D[i,j]:=Min2(D[i,j],D[i,k]
+D[k,j])
EN
D END
END
END Floyd;
Nos planteamos si tal algoritmo puede ser considerado o no
Programacin
Dinmica, es decir, si reune las caractersticas esenciales de ese tipo
de algoritmos.

de

Solucin
Este algoritmo puede ser considerado de Programacin Dinmica ya
que es aplicable el principio de ptimo, que puede enunciarse para este
problema de la siguiente forma: si en el camino mnimo de vi a vj, vk es un
vrtice intermedio, los caminos de vi a vk y de vk a vj han de ser a su
vez caminos mnimos. Por lo tanto, puede plantearse la relacin en
recurrencia que resuelve el problema como:

Tal ecuacin queda resuelta mediante el algoritmo presentado que,


siguiendo el esquema de la Programacin Dinmica, utiliza una matriz
para evitar la repeticin de los clculos. Con ello consigue que su
3
complejidad temporal sea de orden O(n ) debido al triple bucle
anidado en cuyo interior hay tan slo operaciones constantes.

EL ALGORITMO DE DIJKSTRA

Sea un grafo ponderado g = (V,A), donde V es su conjunto de vrtices, A el


conjunto de arcos y sea L[i,j] su matriz de adyacencia. Queremos calcular el
camino ms corto entre un vrtice vi tomado como origen y cada vrtice
restante vj del grafo.
El clsico algoritmo de Dijkstra trabaja en etapas, en donde en cada una de
ellas va aadiendo un vrtice al conjunto D que representa aquellos vrtices
para los que se conoce su distancia al vrtice origen. Inicialmente el
conjunto D contiene slo al vrtice origen.
An siendo el algoritmo de Dijkstra un claro ejemplo de algoritmo vido, nos
preguntamos si puede ser planteado como un algoritmo de Programacin
Dinmica, y si de ello se deriva alguna ventaja.

Solucin
La tcnica de la Programacin Dinmica tiene grandes ventajas, y una de
ellas es la de ofrecer un diseo adecuado y eficiente a todos los problemas
que puedan plantearse de forma recursiva y cumplan el principio del
ptimo.
As, es posible plantear el algoritmo de Dijkstra en trminos de la
Programacin
Dinmica, y de esta forma aprovechar el mtodo de diseo y las ventajas
que esta tcnica ofrece.
En primer lugar, observemos que es posible aplicar el principio de ptimo en
este caso: si en el camino mnimo de vi a vj est un vrtice vk como
intermedio, los caminos parciales de vi a vk y de vk a vj han de ser a su vez
mnimos.
Llamaremos D(j) al vector que contiene el camino mnimo desde el vrtice
origen i = 1 a cada vrtice vj, 2 j n, siendo n el nmero de vrtices.
Inicialmente D contiene los arcos L(1,j), o bien si no existe el arco. A
continuacin, y para cada vrtice vk del grafo con k 1, se repetir:

De esta forma el algoritmo que resuelve el problema puede ser


implementado como sigue:
CONST n = ...; (* numero de vertices
del grafo *) TYPE MATRIZ = ARRAY [1..n],
[1..n] OF CARDINAL;
MARCA = ARRAY [1..n] OF BOOLEAN;(* elementos ya
considerados*) SOLUCION = ARRAY [2..n] OF
CARDINAL;
PROCEDURE Dijkstra(VAR L:MATRIZ;VAR
D:SOLUCION); VAR
i,j,menor,pos,s:CARDINAL; S:MARCA;
BEGIN
FOR i:=2 TO
n DO
S[i]:=FALS

E;
D[i]:=L[1
,i]
END;
S[1]:=TR
UE;
FOR i:=2 TO n-1 DO
menor:=Menor(D,
S,pos);
S[pos]:=TRUE;
FOR j:=2 TO n DO
IF NOT(S[j]) THEN
D[j]:= Min2(D[j],D[pos]
+L[pos,j]) END;
EN
D; END
END Dijkstra;
La funcin Menor es la que calcula el mnimo de la expresin en
recurrencia que define la solucin del problema:
PROCEDURE Menor(VAR D:SOLUCION; VAR S:MARCA; VAR pos:CARDINAL)
:CARDINAL;
VAR
menor,i:CARDINAL;
BEGIN
menor:=MAX(CARDINAL);
pos:=1; FOR i:=2 TO n
DO
IF NOT(S[i]) THEN
IF D[i]<menor THEN
menor:=D[i]; pos:=i
EN
D END
END;
RETURN menor
END
Menor;
2
La complejidad temporal del algoritmo es de orden O(n ), siendo
de orden O(n) su complejidad espacial. No ganamos
sustancialmente en eficiencia mediante el uso de esta tcnica
frente al planteamiento vido del algoritmo, pero sin embargo s
ganamos en sencillez del diseo e implementacin de la solucin
a partir del planteamiento del problema.

Ejercicios de Programacin dinmica determinstica


1) PROBLEMA DE LA RUTA CORTA
Supongamos que se trata de seleccionar la ruta ms corta entre dos
ciudades. La red de la figura 1 muestra las rutas posibles entre el inicio en el
nodo 1 y el destino en el nodo 7. Las rutas pasan por ciudades intermedias,
representadas por los nodos 2 a 6. Este problema se puede resolver

enumerando en forma detallada todas las rutas entre los nodos 1 y 7 (hay
cinco). Sin embargo, en una red grande, la enumeracin exhaustiva no se
puede manejar de manera computacional.

Figura 1
Para resolver el problema con programacin dinmica primero se
descompone en etapas, delimitadas por las lneas verticales interrumpidas
de la figura 10.2. A continuacin se hacen los clculos para cada etapa por
separado.El concepto general es calcular las distancias (acumuladas) ms
cortas a todos los nodos terminales de una etapa, para usarlas a
continuacin como datos de la etapa inmediata posterior.
La etapa 1 tiene tres nodos finales, 2, 3 y 4, y sus clculos son sencillos.

Figura 2
Resumen de resultados de la etapa 1.
Distancia ms corta al nodo 2 _ 7 millas (desde el nodo 1)
Distancia ms corta al nodo 3 _ 8 millas (desde el nodo 1)
Distancia ms corta al nodo 4 _ 5 millas (desde el nodo 1)
A continuacin, la etapa 2 tiene dos nodos extremos, el 5 y el 6. Si se
considera primero el nodo 5, se ve en la figura 2 que hay tres rutas posibles
para llegar a l, que son (2, 5), (3, 5) y (4, 5). Esta informacin, junto con las

distancias ms cortas a los nodos 2, 3 y 4, determina la distancia


(acumulada) ms corta al nodo 5, como sigue:

Resumen de resultados de la etapa 2.


Distancia ms corta al nodo 5 _ 12 millas (desde el nodo 4)
Distancia ms corta al nodo 6 _ 17 millas (desde el nodo 3)
El ltimo paso es examinar la etapa 3. El nodo de destino 7 se puede
alcanzar ya sea desde el nodo 5 o desde el 6. Usando el resumen de los
resultados de la etapa 2, y las distancias de los nodos 5 y 6 al nodo 7, se
obtiene

Resumen de resultados de la etapa 3.


Distancia ms corta al nodo 7 _ 21 millas (desde el nodo 5)
Estos clculos indican que la distancia ms corta entre los nodos 1 y 7 es 21
millas. Las ciudades que definen la ruta ptima se determinan como sigue.
Segn el resumen de la etapa 3, el nodo 7 est enlazado con el nodo 5. A
continuacin, segn el resumen de la etapa 2, el nodo 4 est vinculado al
nodo 5. Por ltimo, segn el resumen de la etapa 1, el nodo 4 est enlazado
con el nodo 1. As, la ruta ms corta se define como.

Ahora indicaremos cmo se pueden expresar matemticamente los clculos


recursivos. Sea fi 1xi2 la distancia ms corta hasta el nodo xi en la etapa i, y
defnase d1xi-1, xi2 como ladistancia del nodo xi-1 hasta el nodo xi;
entonces se calcula, f1 a partir fi-1 de con la siguiente ecuacin recursiva:

Al comenzar en i = 1, la recursin pone f0 (x0) = 0 . La ecuacin indica que


las distancias ms cortas f1(x1) en la etapa i se deben expresar en funcin
del siguiente nodo, xi . En la terminologa de la programacin dinmica, a xi
se le llama estado del sistema en la etapa i. De hecho, se considera que el
estado del sistema en la etapa i es la informacin que enlaza, conecta o

vincula las etapas, de tal modo que se puedan tomar las decisiones para las
etapas restantes sin volver a examinar cmo se lleg a las decisiones de las
etapas anteriores. La definicin correcta de estado permite considerar por
separado cada estado, y garantiza que la solucin sea factible para todos
los estados. La definicin de estado conduce al siguiente marco unificador
de la programacin dinmica.
2) PROBLEMA DE LA MOCHILA
El modelo clsico de la mochila tiene que ver con el caso de un soldado (o
un montaista) que debe decidir cules son los artculos ms valiosos que
debe llevar en su mochila. Este problema parafrasea un modelo general de
asignacin de recursos en el que un solo recurso limitado se asigna a varias
alternativas (por ejemplo, fondos limitados asignados a proyectos) con
objeto de maximizar el ingreso total. Antes de presentar el modelo de
programacin dinmica, haremos notar que en las publicaciones,
al problema de la mochila tambin se le llama problema de conjunto de
fuga o equipo de vuelo, en el que un piloto de un avin a reaccin debe
determinar los artculos ms valiosos (de emergencia) que debe llevar a
bordo, y el problema de carga de flete o del contenedor, en el que un barco
con capacidad limitada de volumen o peso se carga con los fletes ms
valiosos. Parece que estos tres nombres se acuaron en las tres ramas de
las fuerzas armadas estadounidenses: la fuerza area, el ejrcito y la
marina! La ecuacin recursiva (en reversa) se desarrolla para el problema
general de una mochila de W libras, con n artculos. Sea mi la cantidad de
unidades del artculo i en la mochila, y defnanse ri y wi como el ingreso y el
peso por unidad del artculo i. El problema general se representa con el
siguiente programa lineal entero:
Maximizar z = r1m1 + r2m2 + p + rnmn
sujeta a
w1m1 + w2m2 + p + wnmn W
m1, m2, p , mn 0 y enteros
Los tres elementos del modelo son
1. La etapa i se representa con el artculo ,i,i = 1, 2, p , n
2. Las alternativas en la etapa i se representan por mi, la cantidad de
unidades del artculo i que entran en la mochila. El ingreso correspondiente
es rimi. Si se define [W/wi] como el mximo entero menor o igual a W /w ,
se ve que . mi = 0, 1, p , [Ww/iW ]
3. El estado en la etapa i se representa por xi, el peso total asignado a las
etapas (artculos) , y n. Esta definicin refleja el que la restriccin del peso
es la nica que vincula entre s a todas las n etapas.
Definiremos a
fi 1xi2 = como el ingreso mximo para las etapas i, i + 1, y n, dado el
estado xi
La forma ms sencilla de determinar la ecuacin recursiva es un
procedimiento con dos pasos:

Paso 1.

Paso 2

3) PROBLEMA DE LA DILIGENCIA
Este problema est referido a encontrar la ruta ptima (ruta mnima o
ruta ms confiable), para viajar desde un punto llamado nodo inicial o
fuente hacia otro llamado nodo final o destino a travs de una red de
caminos que los conecta dados los retornos (costos beneficios tiempo,
etc.), asociados con los arcos o ramas de la red.

En este caso lo primero que hay que reconocer es, que al tomar una
decisin para decidir que ruta seguir en forma general para todo el
problema, involucra analizar toda la red esto hace que el problema sea
complejo, por cuanto del nodo 1 al 14 existen mltiples alternativas en
las que se encuentran varias ramas en la ruta. En segundo lugar, ver si
es posible dividir el problema en subproblemas o etapas de manera que
la decisin en cada subproblema sea ms fcil; en este sentido se ha
dividi el problema en 5 etapas, de la 1 a la 5 conforme se aprecia en la

parte inferior de la red. Obsrvese que es ms fcil tomar una decisin


en cada etapa pues la decisin ser directa; por ejemplo si estamos en la
etapa 3 (subproblema 3) al inicio nos podemos encontrar en los nodos 5,
6 7 y podemos ir a los nodos 8, 9, 10 u 11 la decisin es inmediata,
pues solo existe una rama en cada alternativa. Esta caracterstica es
importante reconocer para tomar la decisin de aplicar la metodologa
de la programacin dinmica.

Ahora es posible usar la funcin general de la programacin dinmica y


luego representar esa funcin en trminos del problema como sigue:

Funcin
Recursiva
General
Funcin de PD.
Recursiva
para
el
Problema
Representa la distancia por tomar la decisin Dn
en la etapa n, para pasar del estado Sn al estado
Sn+1.

Donde:

Representa el mejor valor en la etapa n+1,


cuando el estado es Sn+1
Representa el mejor valor en la etapa n, cuando
el estado es
Sn

Nota:

debe notar que tanto Sn, como Sn+1 toman un


conjunto de valores, por ejemplo S3 toma los
valores:(5, 6 y 7) y S3+1 = S4, toma los valores
(8, 9, 10 y 11).

Utilizando la forma tabular de la PD tenemos, para las diferentes etapas:


Para n = 5
Para n=4

Para n=3

Para n=2

Para n=1

Cmo se obtiene el recorrido ms corto?


Esto se logra comenzando desde la etapa 1, de la siguiente manera:
Si se est en el nodo 1 la decisin ptima es ir al nodo 3, luego se pasa a la
etapa 2.
Si se est en el nodo 3 la decisin ptima es ir al nodo 5, luego se pasa a la
etapa 3.
Si se est en el nodo 5 la decisin ptima es ir al nodo 9, luego se pasa a la
etapa 4.
Si se est en el nodo 9 la decisin ptima es ir al nodo 12, luego se pasa a la
etapa 5
Si se est en el nodo 12 la decisin ptima es ir al nodo 14.
La distancia total recorrida se obtiene sumando las distancias de las ramas
involucradas en el recorrido en este caso es: 1 3 5 9 12 14 2 + 8 +
2 + 3 + 4 = 19.

You might also like