Está en la página 1de 105

Programacin dinmica

Introduccin
El problema de la mochila 0-1
Camino de coste mnimo en
un grafo multietapa
Multiplicacin de una secuencia
de matrices
Comparaciones de secuencias
Caminos mnimos entre todos
los pares de nodos de un grafo
rboles binarios de bsqueda
ptimos
Un problema de fiabilidad
de sistemas
El problema del viajante
de comercio
Planificacin de trabajos
Una competicin internacional
Triangulacin de polgonos

J. Campos - C.P.S.

2
7
17
30
40
47
53
64
69
79
92
98

Esquemas algortmicos - Programacin dinmicaPg. 1

Programacin dinmica:
Introduccin

Recordemos el problema de la mochila:


Se tienen n objetos fraccionables y una mochila.
El objeto i tiene peso pi y una fraccin xi (0xi1)
del objeto i produce un beneficio bixi.
El objetivo es llenar la mochila, de capacidad C,
de manera que se maximice el beneficio.
maximizar
sujeto a

bi xi

1i n

pi xi C

1i n

con 0 x i 1, bi > 0, pi > 0, 1 i n

Una variante: la mochila 0-1


xi slo toma valores 0 1, indicando que el objeto
se deja fuera o se mete en la mochila.
Los pesos, pi, y la capacidad son nmeros
naturales.
Los beneficios, bi, son reales no negativos.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 2

Programacin dinmica:
Introduccin

Ejemplo:
n=3
C=15
(b1,b2,b3)=(38,40,24)
(p1,p2,p3)=(9,6,5)

Recordar la estrategia voraz:


Tomar siempre el objeto que proporcione mayor
beneficio por unidad de peso.
Se obtiene la solucin:
(x1,x2,x3)=(0,1,1), con beneficio 64
Sin embargo, la solucin ptima es:
(x1,x2,x3)=(1,1,0), con beneficio 78

Por tanto, la estrategia voraz no calcula


la solucin ptima del problema de la
mochila 0-1.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 3

Programacin dinmica:
Introduccin
R. Bellman: Dynamic Programming,
Princeton University Press, 1957.

Tcnica de programacin dinmica


Se emplea tpicamente para resolver problemas
de optimizacin.
Permite resolver problemas mediante una
secuencia de decisiones.
Como el esquema voraz
A diferencia del esquema voraz, se producen
varias secuencias de decisiones y slamente al
final se sabe cul es la mejor de ellas.
Est basada en el principio de optimalidad de
Bellman:
Cualquier subsecuencia de decisiones
de una secuencia ptima de decisiones
que resuelve un problema
tambin debe ser ptima respecto al
subproblema que resuelve.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 4

Programacin dinmica:
Introduccin
Supongamos que un problema se resuelve tras
tomar un secuencia d1, d2, , dn de decisiones.
Si hay d opciones posibles para cada una de las
decisiones, una tcnica de fuerza bruta
explorara un total de dn secuencias posibles de
decisiones (explosin combinatoria).
La tcnica de programacin dinmica evita
explorar todas las secuencias posibles por medio
de la resolucin de subproblemas de tamao
creciente y almacenamiento en una tabla de las
soluciones ptimas de esos subproblemas para
facilitar la solucin de los problemas ms
grandes.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 5

Programacin dinmica:
Introduccin

Ms formalmente:
Sea E0 el estado inicial del problema.
Sea D1 = {v 11 ,K,v 1n 1 } el conjunto de valores de
decisin posibles para la decisin d1.
Sea E1i el estado del problema tras la eleccin del
valor v1i, 1in1.
Sea S1i una secuencia ptima de decisiones
respecto al estado E1i.

Principio de optimalidad de Bellman:


Una secuencia ptima de decisiones
respecto a E0 es la mejor de las secuencias de
decisin {v1i,S1i}, 1in1.
El mismo razonamiento puede aplicarse a
cualquier subsecuencia de decisiones
dk, , dl, 1kln, partiendo como estado
inicial de Ek-1.
Una solucin dinmica para este problema,
simbolizado como (k,l), debe expresarse en
trminos de los valores de decisin existentes para la decisin dk y el subproblema
(k+1,l), resultante de aplicar cada valor de
decisin.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 6

El problema de la mochila 0-1

Sea mochila(k,l,P) el problema:


l

maximizar bi xi
i=k

sujeto a

pi xi P

i=k

con xi {0,1}, k i l

El problema de la mochila 0-1 es mochila(1,n,C).

Principio de optimalidad:
Sea y1,,yn una secuencia ptima de valores 0-1
para x1,,xn.
Si y1=0, entonces y2,,yn forman una secuencia
ptima para el problema mochila(2,n,C).
Si y1=1, entonces y2,,yn forman una secuencia
ptima para el problema mochila(2,n,C-p1).
Demostracin: Si existe una solucin mejor y 2 ,K, yn
para el problema correspondiente,
entonces y1 , y 2 ,K, yn es mejor
que y1 , y2 ,K, yn para el problema mochila(1,n,C),
en contra de la
hiptesis.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 7

El problema de la mochila 0-1

Lo mismo se cumple en cualquier etapa


de decisin:
Si y1,,yn es una solucin ptima del problema
mochila(1,n,C), entonces para todo j, 1jn:

y1,,yj es solucin ptima de


j

mochila 1, j , pi xi
i =1

yj+1,,yn es solucin ptima de


j

mochila j + 1,n ,C pi xi
i=1

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 8

El problema de la mochila 0-1

Ecuacin de recurrencia hacia adelante:


v
Si g j (c ) es el beneficio (o ganancia total) de una
solucin ptima de mochila(j,n,c), entonces
v
v
v
g j (c) = max g j + 1(c ), g j+ 1(c p j ) + b j

dependiendo de que el objeto j-simo entre o no


en la solucin (ntese que slo puede entrar si
c-pj0).
Adems,
v
gn + 1 (c ) = 0, para cualquier capacidad c

v
Ambas ecuaciones permiten calcular g1 (C) ,
que es el valor de una solucin ptima de
mochila(1,n,C).

(Ntese que la ecuacin de recurrencia es


hacia adelante pero el clculo se realiza hacia atrs.)

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 9

El problema de la mochila 0-1

Ecuacin de recurrencia hacia atrs:


w
Si g j (c ) es el beneficio (o ganancia total) de una
solucin ptima de mochila(1,j,c), entonces

w
w
w
g j (c ) = max g j 1(c), g j 1(c p j ) + b j

dependiendo de que el objeto j-simo entre o no


en la solucin (ntese que slo puede entrar si
c-pj0).
Adems,
w
g0 (c ) = 0, para cualquier capacidad c

w
Ambas ecuaciones permiten calcular gn (C) ,
que es el valor de una solucin ptima de
mochila(1,n,C).

(Ahora la recurrencia es hacia atrs pero el clculo


se realiza hacia adelante.)

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 10

El problema de la mochila 0-1

Tanto la recurrencia hacia adelante como hacia atrs


permiten escribir un algoritmo recursivo de forma
inmediata.

funcin
funcin mochila1(p,b:vector[1..n]
mochila1(p,b:vector[1..n] de
de nat;
nat;
C:nat)
C:nat) devuelve
devuelve nat
nat
principio
principio
devuelve
devuelve g(n,C)
g(n,C)
fin
fin
funcin
funcin g(j,c:nat)
g(j,c:nat) devuelve
devuelve nat
nat
principio
principio
si
si j=0
j=0 entonces
entonces devuelve
devuelve 00
sino
sino
si
si c<p[j]
c<p[j]
entonces
entonces devuelve
devuelve g(j-1,c)
g(j-1,c)
sino
sino
si
si g(j-1,c)
g(j-1,c)g(j-1,c-p[j])+b[j]
g(j-1,c-p[j])+b[j]
entonces
entonces
devuelve
devuelve g(j-1,c)
g(j-1,c)
sino
sino
devuelve
devuelve g(j-1,c-p[j])+b[j]
g(j-1,c-p[j])+b[j]
fsi
fsi
fsi
fsi
fsi
fsi
fin
fin
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 11

El problema de la mochila 0-1

Problema: ineficiencia
Un problema de tamao n se reduce a dos
subproblemas de tamao (n-1).
Cada uno de los dos subproblemas se reduce a
otros dos
Por tanto, se obtiene un algoritmo exponencial.

Sin embargo, el nmero total de subproblemas a resolver no es tan grande:

w
La funcin g j (c ) tiene dos parmetros:
el primero puede tomar n valores distintos y
el segundo, C valores.
Luego slo hay nC problemas diferentes!

Por tanto, la solucin recursiva est


generando y resolviendo el mismo
problema muchas veces.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 12

El problema de la mochila 0-1

Para evitar la repeticin de clculos,


las soluciones de los subproblemas se
deben almacenan en una tabla.
w
Matriz nC cuyo elemento (j,c) almacena g j (c )
Para el ejemplo anterior:
n=3
C=15
(b1,b2,b3)=(38,40,24)
(p1,p2,p3)=(9,6,5)
0
p1 = 9 0
p2 = 6 0
p3 = 5 0

1
0
0
0

2
0
0
0

3
0
0
0

4
0
0
0

5
0
0
24

6
0
40
40

7
0
40
40

8
0
40
40

9
38
40
40

10
38
40
40

11
38
40
64

12
38
40
64

w
w
w
g j (c ) = max g j 1(c) , g j 1(c p j ) + b j

J. Campos - C.P.S.

13
38
40
64

14
38
40
64

15
38
78
78

Esquemas algortmicos - Programacin dinmicaPg. 13

El problema de la mochila 0-1


algoritmo
algoritmo mochila(ent
mochila(ent p,b:vect[1..n]de
p,b:vect[1..n]de nat;
nat;
ent
ent Cap:nat;
Cap:nat;
sal
sal g:vect[0..n,0..Cap]de
g:vect[0..n,0..Cap]de nat)
nat)
variables
variables c,j:nat
c,j:nat
principio
principio
para
para c:=0
c:=0 hasta
hasta Cap
Cap hacer
hacer g[0,c]:=0
g[0,c]:=0 fpara;
fpara;
para
para j:=1
j:=1 hasta
hasta nn hacer
hacer g[j,0]:=0
g[j,0]:=0 fpara;
fpara;
para
para j:=1
j:=1 hasta
hasta nn hacer
hacer
para
para c:=1
c:=1 hasta
hasta Cap
Cap hacer
hacer
si
si c<p[j]
c<p[j]
entonces
entonces
g[j,c]:=g[j-1,c]
g[j,c]:=g[j-1,c]
sino
sino
si
si g[j-1,c]
g[j-1,c]g[j-1,c-p[j]]+b[j]
g[j-1,c-p[j]]+b[j]
entonces
entonces
g[j,c]:=g[j-1,c]
g[j,c]:=g[j-1,c]
sino
sino
g[j,c]:=g[j-1,c-p[j]]+b[j]
g[j,c]:=g[j-1,c-p[j]]+b[j]
fsi
fsi
fsi
fsi
fpara
fpara
fpara
fpara
fin
fin

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 14

El problema de la mochila 0-1

Clculos posibles a partir de la tabla g:


beneficio total: g[n,Cap]
los objetos metidos en la mochila:

algoritmo
algoritmo objetos(ent
objetos(ent p,b:vect[1..n]de
p,b:vect[1..n]de nat;
nat;
ent
ent Cap:nat;
Cap:nat;
ent
ent g:vect[0..n,0..Cap]de
g:vect[0..n,0..Cap]de nat)
nat)
principio
principio
test(n,Cap)
test(n,Cap)
fin
fin
algoritmo
algoritmo test(ent
test(ent j,c:nat)
j,c:nat)
principio
principio
si
si j>0
j>0 entonces
entonces
si
c<p[j]
si c<p[j] entonces
entonces test(j-1,c)
test(j-1,c)
sino
sino
si
si g[j-1,c-p[j]]+b[j]>g[j-1,c]
g[j-1,c-p[j]]+b[j]>g[j-1,c]
entonces
entonces
test(j-1,c-p[j]);
test(j-1,c-p[j]);
escribir('meter
escribir('meter ',j)
',j)
sino
sino test(j-1,c)
test(j-1,c)
fsi
fsi
fsi
fsi
fsi
fsi
fin
fin
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 15

El problema de la mochila 0-1

Consideraciones finales
Cada componente de la tabla g se calcula en
tiempo constante, luego el coste de construccin
de la tabla es O(nC).
El algoritmo test se ejecuta una vez por cada
valor de j, desde n descendiendo hasta 0, luego
su coste es O(n).
Si C es muy grande, entonces esta solucin no es
buena.
Si los pesos pi o la capacidad C son reales,
esta solucin no sirve.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 16

Camino de coste mnimo en un


grafo multietapa

Grafo multietapa:
Un grafo multietapa G=(V,A) es un grafo
dirigido en el que se puede hacer una particin
del conjunto V de vrtices en k (k2) conjuntos
distintos Vi, 1ik, tal que todo arco del grafo
(u,v) es tal que uVi y vVi+1 para algn i, 1i<k.
Los conjuntos V1 y Vk tienen un solo vrtice que
se llama vrtice origen, o, y vrtice destino, d,
respectivamente.
V1

V2

V3

2
5

1
2

3
1

5
4

6
9

7
11

V4

V5
5
9

10 d

12

Consideraremos grafos etiquetados.


Denotamos por c(u,v) el coste del arco (u,v).

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 17

Camino de coste mnimo en un


grafo multietapa

El problema: Encontrar un camino de


coste mnimo que vaya de o a d.
Todo camino de o a d tiene exactamente un
vrtice en cada Vi, por eso se dice que cada Vi
define una etapa del grafo.
V1

V2

V3

2
5

1
2

J. Campos - C.P.S.

3
1

5
4

6
9

7
11

V4

V5
5
9

10 d

12

Esquemas algortmicos - Programacin dinmicaPg. 18

Camino de coste mnimo en un


grafo multietapa

Ejemplo de aplicacin:
Se tienen n unidades de un recurso que deben
asignarse a r proyectos.
Si se asignan j, 0jn, unidades al proyecto i se
obtiene un beneficio Ni,j.
El problema es asignar el recurso a los r
proyectos maximizando el beneficio total.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 19

Camino de coste mnimo en un


grafo multietapa
Formulacin como grafo multietapa:
Nmero de etapas: r+1
La etapa i, 1ir, representa el proyecto i.
Hay n+1 vrtices vi,j, 0jn, en cada etapa i,
2ir.
Las etapas 1 y r+1 tienen un vrtice, o=v1,0 y
d=vr+1,n, respectivamente.
El vrtice vi,j, 2ir, representa el estado en el
que se asignan un total de j unidades del
recurso a los proyectos 1, 2, , i-1.
Los arcos son de la forma (vi,j,vi+1,l) para todo
jl y 1i<r.
El arco (vi,j,vi+1,l), jl, tiene asignado un coste
Ni,l-j que corresponde a asignar l-j unidades
del recurso al proyecto i, 1i<r.

Adems hay arcos de la forma (vr,j,vr+1,n), que


tienen asignado un coste max {N r , p }.
0 p n j

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 20

Camino de coste mnimo en un


grafo multietapa
Grafo resultante para r=3 y n=4.
La asignacin ptima est definida por un
camino de coste mximo de o a d.
Para convertirlo en un problema de camino
de coste mnimo basta cambiar los signos de
las etiquetas.
N 2,0

v2,0

v3,0

N 1,0

max {N 3,i }

i= 0,1,2,3,4

N 2,1
N 2,0

v2,1

N 1,1

i= 0,1,2,3

N 2,1

N 1,2

v2,2

N 2,0

v3,2

N 2,1

N 1,3

N 2,2

v2,3

N 2,0
N 2,1

N 1,4

v2,4

J. Campos - C.P.S.

max {N 3,i }

N 2,2

N 2,3

o = v 1,0

v3,1

N
N 2,2 2,3

d = v 4,4

max {N 3,i }
i= 0,1

v3,3
N 2,4

N 2,0

max {N 3,i }

i= 0,1,2

N 3,0

v3,4

Esquemas algortmicos - Programacin dinmicaPg. 21

Camino de coste mnimo en un


grafo multietapa

Solucin de programacin dinmica:


V1

V2

V3

2
5

1
2

3
1

5
4

7
11

V4

V5
5
9

10 d

12

Cada camino de o a d es el resultado de una


secuencia de k-2 decisiones.
Decisin i-sima: determinar, a partir de un
vrtice vi de Vi, un arco que tenga a vi como
origen y algn nodo de Vi+1 como destino.
Principio de optimalidad:
El camino de coste mnimo debe contener
subcaminos de coste mnimo entre otros nodos.
Dem.: En otro caso, podran sustituirse dichos
subcaminos por otros mejores, resultando
un camino total de coste menor.
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 22

Camino de coste mnimo en un


grafo multietapa
Ecuacin de recurrencia hacia adelante:
Sea s(i,j) un camino de coste mnimo C*(i,j)
desde el vrtice j del conjunto Vi hasta el
vrtice destino d.
Entonces:
c( j ,d) ,
C (k 1, j) =
,

C (i , j) = min

lV i+ 1
( j ,l)A

V1

{c( j ,l) + C (i + 1,l)}, para


V2

V3

2
5

1
2

J. Campos - C.P.S.

si ( j ,d) A
en otro caso

3
1

5
4

6
9

7
11

V4

1 i k 2

V5
5
9

10 d

12

Esquemas algortmicos - Programacin dinmicaPg. 23

Camino de coste mnimo en un


grafo multietapa
c( j ,d) ,
C (k 1, j) =
,

C (i , j) = min

lV i+ 1
( j ,l)A

V1

{c( j ,l) + C (i + 1,l)}, para


V2

V3

2
5

si ( j ,d) A
en otro caso

3
1

5
4

V4
8

6
9

7
11

1 i k 2

V5
5
9

10 d

12

C (3, 5) = min {8 +C (4 ,7),11 + C (4 , 8),6 +C (4 ,9)}= 13


C (3,6) = 4 +C (4 , 8) = 13
C (2, 2) = min {3 +C (3, 5),1 + C (3,6)}= 14
C (2, 3) = 4 +C (3, 5) = 17
C (2, 4) = min {5 +C (3, 5),9 + C (3,6)}= 18
C (1,1) = min {5 +C (2, 2),7 + C (2, 3), 2 +C (2, 4)}= 19

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 24

Camino de coste mnimo en un


grafo multietapa
Falta almacenar las decisiones hechas en cada
etapa que minimizan el coste:
Sea D(i,j) el valor de l que minimiza
c( j ,l) + C (i + 1,l).

Entonces el camino de coste mnimo es:


v1=1; v2=D(1,1); v3=D(2,D(1,1)); etc.
V1

V2

V3

2
5

3
1

3
4

5
4

7
11

V4

V5
5
9

10 d

12

D(3, 5) = 7 ; D(3,6) = 8
D(2, 2) = 6; D(2, 3) = 5; D(2, 4) = 5
D(1,1) = 2

v1 = 1
v 2 = D(1,1) = 2
v 3 = D(2,D(1,1)) = 6
v 4 = D(3,D(2,D(1,1))) = 8

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 25

Camino de coste mnimo en un


grafo multietapa
algoritmo
algoritmo multietapa(ent
multietapa(ent G=(V,A,c):grafo;
G=(V,A,c):grafo;
ent
ent k,n:nat;
k,n:nat;
sal
sal P:vect[1..k]de
P:vect[1..k]de 1..n)
1..n)
{Los
{Los vrtices
vrtices estn
estn numerados
numerados de
de forma
forma que
que los
los
ndices
ndices de
de los
los vrtices
vrtices de
de una
una etapa
etapa son
son mayores
mayores
que
los
ndices
de
los
de
la
etapa
anterior.
que los ndices de los de la etapa anterior.
*
El
El primer
primer ndice
ndice de
de CC* yy D,
D, que
que slo
slo identificaba
identificaba
la
etapa,
se
ha
suprimido.}
la etapa, se ha suprimido.}

variables
variables C:vect[1..n]de
C:vect[1..n]de real;
real;
D:vect[1..n]de
D:vect[1..n]de 1..n;
1..n;
j,r:1..n
j,r:1..n
principio
principio
*
C[n]:=0.0;
C[n]:=0.0; {Clculo
{Clculo de
de CC* yy D}
D}
para
para j:=n-1
j:=n-1 descendiendo
descendiendo hasta
hasta 11 hacer
hacer
r:=vrtice
r:=vrtice t.q.
t.q. (j,r)
(j,r)AA
c(j,r)+C[r]
c(j,r)+C[r] es
es mnimo;
mnimo;
C[j]:=c(j,r)+C[r];
C[j]:=c(j,r)+C[r];
D[j]:=r
D[j]:=r
fpara;
fpara;
P[1]:=1;
{Construccin del
del camino}
camino}
P[1]:=1; P[k]:=n;
P[k]:=n; {Construccin
para
para j:=2
j:=2 hasta
hasta k-1
k-1 hacer
hacer
P[j]:=D[P[j-1]]
P[j]:=D[P[j-1]]
fpara
fpara
fin
fin

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 26

Camino de coste mnimo en un


grafo multietapa

Coste del algoritmo:


Si G est representado mediante listas de
adyacencia, entonces el clculo de r en el interior
del primer bucle lleva un tiempo proporcional al
grado del vrtice j.
Por tanto, si a es el nmero de arcos del grafo, el
coste total del algoritmo es (n+a).
(El segundo bucle lleva un tiempo (k).)

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 27

Camino de coste mnimo en un


grafo multietapa

Anlogamente, se desarrolla la
recurrencia hacia atrs.
Ecuacin de recurrencia hacia atrs:
Sea s(i,j) un camino de coste mnimo C*(i,j)
desde el vrtice origen o hasta el vrtice j del
conjunto Vi.
Entonces:
c(o, j) ,
C (2, j) =
,

C (i , j) = min

lV i 1
(l , j)A

V1

{c(l , j) + C (i 1,l)}, para

V2

V3

2
5

1
2

J. Campos - C.P.S.

si (o, j) A
en otro caso

3
1

5
4

6
9

7
11

V4

3 i k

V5
5
9

10 d

12

Esquemas algortmicos - Programacin dinmicaPg. 28

Camino de coste mnimo en un


grafo multietapa
algoritmo
algoritmo multietapaB(ent
multietapaB(ent G=(V,A,c):grafo;
G=(V,A,c):grafo;
ent
ent k,n:nat;
k,n:nat;
sal
sal P:vect[1..k]de
P:vect[1..k]de 1..n)
1..n)
{Los
{Los vrtices
vrtices estn
estn numerados
numerados de
de forma
forma que
que los
los
ndices
ndices de
de los
los vrtices
vrtices de
de una
una etapa
etapa son
son mayores
mayores
que
que los
los ndices
ndices de
de los
los de
de la
la etapa
etapa anterior.
anterior.
*
El
primer
ndice
de
C
y
D,
que
slo
El primer ndice de C* y D, que slo identificaba
identificaba
la
etapa,
se
ha
suprimido.}
la etapa, se ha suprimido.}

variables
variables C:vect[1..n]de
C:vect[1..n]de real;
real;
D:vect[1..n]de
D:vect[1..n]de 1..n;
1..n;
j,r:1..n
j,r:1..n
principio
principio
*
C[1]:=0.0;
C[1]:=0.0; {Clculo
{Clculo de
de CC* yy D}
D}
para
para j:=2
j:=2 hasta
hasta nn hacer
hacer
r:=vrtice
r:=vrtice t.q.
t.q. (r,j)
(r,j)AA
c(r,j)+C[r]
c(r,j)+C[r] es
es mnimo;
mnimo;
C[j]:=c(r,j)+C[r];
C[j]:=c(r,j)+C[r];
D[j]:=r
D[j]:=r
fpara;
fpara;
P[1]:=1;
P[1]:=1; P[k]:=n;
P[k]:=n; {Construccin
{Construccin del
del camino}
camino}
para
j:=k-1
descendiendo
hasta
2
hacer
para j:=k-1 descendiendo hasta 2 hacer
P[j]:=D[P[j+1]]
P[j]:=D[P[j+1]]
fpara
fpara
fin
fin
Nota: La eficiencia es la misma si G est representado mediante
listas de adyacencia inversa.
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 29

Multiplicacin de una
secuencia de matrices

Se desea calcular el producto matricial:


M = M 1M 2LM n

Como es asociativo, existen varias formas


(Recordar que el algortimo resultante de la
definicin del producto de dos matrices pq y qr
necesita pqr multiplicaciones de escalares.)
Ejemplo: se quiere calcular el producto ABCD, de
las matrices A(135), B(589), C(893) y D(334).
(( AB)C)D)
( AB) (CD)
( A(BC))D
A((BC)D)
A(B(CD))

n multip.
10582
54201
2856
4055
26418

El caso ms eficiente es casi 19 veces ms rpido


que el ms lento!

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 30

Multiplicacin de una
secuencia de matrices

Cmo hallar el mejor mtodo?


1. Insertar los parntesis de todas las formas
posibles (significativamente diferentes).
2. Calcular para cada una el nmero de
multiplicaciones escalares requeridas.

Cuntas formas posibles T(n) de


insertar parntesis existen en un
producto de n matrices?
Si cortamos entre la i y la (i+1)-sima:
M = (M 1M 2L M i ) (M i +1M i + 2LM n )

Entonces tenemos T(i)T(n-i) formas distintas.


Como i puede tomar valores entre 1 y n-1:
T (n) =

n 1

T (i)T (n i) ,

para n > 1

i =1

T (1) = 1

Nmeros de Catalan
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 31

Multiplicacin de una
secuencia de matrices

Los nmeros de Catalan crecen


exponencialmente.
De hecho puede demostrarse que:
1 2n 2
T (n) =
n n1

Por ejemplo:
n 1 2 3 4 5 10
15
T (n) 1 1 2 5 14 4862 2674440

Luego el mtodo directo no sirve.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 32

Multiplicacin de una
secuencia de matrices
S. Godbole: On efficient computation of matrix chain
products, IEEE Transactions on Computers, 22(9),
pp. 864-866, 1973.

Aplicacin del principio de


optimalidad:
Si el mejor modo de realizar el producto exige
dividir inicialmente entre las matrices i e
(i+1)-sima, los productos
M1M 2LM i y M i + 1M i + 2LM n
debern ser realizados de forma ptima para que
el total tambin sea ptimo.

Mtodo:
Construir la matriz [mij], 1ijn, donde mij da el
ptimo (i.e., el nmero de multiplicaciones
escalares requeridas) para la parte Mi Mi +1LM j
del producto total.
La solucin final vendr dada por m1n.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 33

Multiplicacin de una
secuencia de matrices
Construccin de [mij], 1ijn:
Guardar las dimensiones de las Mi, 1in, en
un vector d, de 0..n componentes, de forma
que Mi tiene dimensiones di-1di.
La diagonal s de [mij] contiene los mij tales
que j-i=s:
s = 0:

mi ,i = 0, para i = 1, 2,K,n

s = 1:

mi ,i + 1 = di 1di di + 1 , para i = 1, 2,K,n 1

1 < s < n: m i ,i +s =

min

i ki + s 1

(mik + m k + 1,i +s + di 1dkdi +s ) ,

para i = 1, 2,K,n s

El tercer caso representa que para calcular


Mi Mi + 1LM i + s se intentan todas las
posibilidades (Mi Mi + 1LM k ) (M k + 1M k + 2LM i + s )
y se escoge la mejor.
De forma ms compacta:
0,
si i = j
mij = min {m + m
ik
k + 1, j + di 1dkd j }, si i < j
i

k<
j

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 34

Multiplicacin de una
secuencia de matrices

Para el ejemplo anterior:

A(135), B(589), C(893) y D(334)


Se tiene d=(13,5,89,3,34).
Para s=1: m12=5785, m23=1335, m34=9078.
Para s=2:

m13 = min (m 11 + m 23 + 13 5 3, m 12 + m 33 + 13 89 3)
= min (1530,9256) = 1530
m 24 = min (m 22 + m 34 + 5 89 34 , m 23 + m 44 + 5 3 34)
= min (24208,1845) = 1845

Para s=3: m14 = min ({k = 1} m 11 + m 24 + 13 5 34 ,


{k = 2} m 12 + m 34 + 13 89 34 ,
{k = 3} m 13 + m 44 + 13 3 34)
= min (4055, 54201, 2856) = 2856
La matriz es:

j =1 2
3
4
i = 1 0 5785 1530 2856
s=3
2

1335 1845
s=2

9078
s =1

0
s =0

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 35

Multiplicacin de una
secuencia de matrices

Solucin recursiva inmediata:


Aplicacin de la ecuacin recurrente.
Problema: complejidad exponencial.

Almacenamiento de las soluciones de


los subproblemas en una tabla:
Nmero de subproblemas: (n2).

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 36

Multiplicacin de una
secuencia de matrices
algoritmo
algoritmo parentOpt(ent
parentOpt(ent d:vect[0..n]de
d:vect[0..n]de nat;
nat;
sal
sal m:vect[1..n,1..n]de
m:vect[1..n,1..n]de nat;
nat;
sal
sal km:vect[1..n,1..n]de
km:vect[1..n,1..n]de 1..n)
1..n)
{m
{m es
es la
la matriz
matriz [m
[mijij]] definida
definida antes;
antes;
km[i,j]
km[i,j] guarda
guarda el
el ndice
ndice kk para
para el
el que
que se
se alcanza
alcanza
el
el mnimo
mnimo al
al calcular
calcular m[i,j].}
m[i,j].}

variables
variables i,r,j,k,q:nat;
i,r,j,k,q:nat;
principio
principio
para
para i:=1
i:=1 hasta
hasta nn hacer
hacer
m[i,i]:=0
m[i,i]:=0
fpara;
fpara;
para
para r:=2
r:=2 hasta
hasta nn hacer
hacer
para
para i:=1
i:=1 hasta
hasta n-r+1
n-r+1 hacer
hacer
j:=i+r-1;
j:=i+r-1;
m[i,j]:=
m[i,j]:=;;
para
para k:=i
k:=i hasta
hasta j-1
j-1 hacer
hacer
q:=m[i,k]+m[k+1,j]+d[i-1]*d[k]*d[j];
q:=m[i,k]+m[k+1,j]+d[i-1]*d[k]*d[j];
si
si q<m[i,j]
q<m[i,j]
entonces
entonces
m[i,j]:=q;
m[i,j]:=q;
km[i,j]:=k
km[i,j]:=k
fsi
fsi
fpara
fpara
fpara
fpara
fpara
fpara
fin
fin
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 37

Multiplicacin de una
secuencia de matrices

Coste en tiempo:
(n3)

Coste en memoria:
(n2)

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 38

Multiplicacin de una
secuencia de matrices

Falta hacer el producto!


El elemento km[i,j] guarda el valor de k tal que la
divisin ptima de Mi Mi + 1LM j parte el
producto entre Mk y Mk+1.
Por tanto:

funcin
funcin multSec(M:vect[1..n]de
multSec(M:vect[1..n]de matriz;
matriz;
km:vect[1..n,1..n]de
km:vect[1..n,1..n]de 1..n;
1..n;
i,j:1..n)
i,j:1..n)
devuelve
devuelve matriz
matriz
variables
variables X,Y:matriz
X,Y:matriz
principio
principio
si
si j>i
j>i
entonces
entonces
X:=multSec(M,km,i,km[i,j]);
X:=multSec(M,km,i,km[i,j]);
Y:=multSec(M,km,km[i,j]+1,j];
Y:=multSec(M,km,km[i,j]+1,j];
devuelve
devuelve mult(X,Y)
mult(X,Y)
sino
sino
devuelve
devuelve M[i]
M[i]
fsi
fsi
fin
fin

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 39

Comparaciones de secuencias
D. Sankoff y J.B. Kruskal: Time Wraps, String Edits,
and Macromolecules: The Theory and Practice of
Sequence Comparison, Addison-Wesley, 1983.

Problemas relacionados con biologa


molecular.
Un problema:

Mnimo nmero de pasos de edicin para


transformar una cadena en otra.
Sean A=a1a2an y B=b1b2bm dos cadenas de
caracteres.
Se quiere modificar A carcter a carcter hasta
convertirlo en B.
Se permiten tres tipos de cambios (pasos de
edicin) y cada uno tiene coste unidad:
1. Insertar un carcter en la cadena.
2. Borrar un carcter de la cadena.
3. Sustituir un carcter por otro diferente.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 40

Comparaciones de secuencias
Ejemplo:

abbc

n de pasos?

babb

Una solucin:
babb

abbc
1: borrar a

bbc

3: sustituir c por b
2: insertar a

babc

Otra solucin (mejor):


abbc

babb

1: insertar b

2: borrar c

babbc

Aplicaciones en comparacin y mantenimiento de versiones de ficheros:


Si se tienen varias versiones parecidas de un
fichero es ms eficiente almacenar slo la
primera versin y para el resto de versiones
almacenar los pasos de edicin (normalmente
inserciones y borrados) desde la primera.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 41

Comparaciones de secuencias
R.A. Wagner y M.J. Fischer:
The string-to-string correction problem,
Journal of the ACM, 21, pp. 168-173, 1974.

Solucin de programacin dinmica:


Sean A(i) y B(i) las subcadenas prefijo de A y B
(i.e., A(i)=a1a2ai, B(i)=b1b2bi).
C(i,j) el coste mnimo de transformar A(i) en B(j).
Se considera el problema: A(n) B(m)

Fijmonos en los posibles tratamientos de an:


bien es borrado, y el problema se reduce a
transformar A(n-1) en B(m) y luego borrarlo;
bien se le hace coincidir con algn carcter
de B anterior a bm, en cuyo caso el problema
se reduce a transformar A(n) en B(m-1) y
luego insertar un carcter igual a bm;
bien se le sustituye por un carcter igual a
bm, y el problema se reduce a transformar
A(n-1) en B(m-1) y luego sustituir an;
o bien an coincide con bm, y entonces basta
con transformar A(n-1) en B(m-1).
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 42

Comparaciones de secuencias
Si denotamos:
0, si ai = bj
c(i , j) =
1, si ai bj

Se tiene:
C (n 1, m ) + 1
(borrando an )
C (n, m) = min C (n , m - 1) + 1
(insertando bm )
C (n 1, m 1) + c(n , m ) (otros casos)
C (i , 0) = i , for all i , 0 i n

C (0, j) = j , for all

j, 0 j m

Solucin recursiva obvia: coste exponencial!


Sin embargo, slo existen nm subproblemas
diferentes (C(i,j), 1in, 1jm).
j

Orden de clculo:

i
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 43

Comparaciones de secuencias
algoritmo
algoritmo compSec(ent
compSec(ent A:cad[n];
A:cad[n];
ent
ent B:cad[m];
B:cad[m];
sal
sal C:vect[0..n,0..m]de
C:vect[0..n,0..m]de nat;
nat;
sal
sal T:vect[1..n,1..m]de
T:vect[1..n,1..m]de Transf)
Transf)
{Transf=tipo
{Transf=tipo de
de las
las posibles
posibles transformaciones;
transformaciones;
Transf=(borrar,insert,sustit,nada)}
Transf=(borrar,insert,sustit,nada)}

variables
variables i,j,x,y,z:nat
i,j,x,y,z:nat
principio
principio
para
para i:=0
i:=0 hasta
hasta nn hacer
hacer C[i,0]:=i
C[i,0]:=i fpara;
fpara;
para
para j:=0
j:=0 hasta
hasta mm hacer
hacer C[0,j]:=j
C[0,j]:=j fpara;
fpara;
para
para i:=1
i:=1 hasta
hasta nn hacer
hacer
para
para j:=1
j:=1 hasta
hasta mm hacer
hacer
x:=C[i-1,j]+1;
x:=C[i-1,j]+1; y:=C[i,j-1]+1;
y:=C[i,j-1]+1;
si
si A[i]=B[j]
A[i]=B[j]
entonces
entonces
z:=C[i-1,j-1]
z:=C[i-1,j-1]
sino
sino
z:=C[i-1,j-1]+1
z:=C[i-1,j-1]+1
fsi;
fsi;
C[i,j]:=min(x,y,z);
C[i,j]:=min(x,y,z);
T[i,j]:=Transf(x,y,z)
T[i,j]:=Transf(x,y,z)
{T[i,j]
{T[i,j] es
es el
el ltimo
ltimo cambio
cambio que
que da
da el
el
mnimo
mnimo valor
valor aa C[i,j]}
C[i,j]}

fpara
fpara
fpara
fpara
fin
fin
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 44

Comparaciones de secuencias
algoritmo
algoritmo res(ent
res(ent i,j:nat)
i,j:nat)
{Para
{Para resolver
resolver el
el problema,
problema, ejecutar
ejecutar res(n,m).}
res(n,m).}

variable
variable k:nat
k:nat
principio
principio
seleccin
seleccin
i=0:
i=0: para
para k:=1
k:=1 hasta
hasta jj hacer
hacer
escribir('Aadir',B[k],'en
escribir('Aadir',B[k],'en el
el
lugar',k)
lugar',k)
fpara
fpara
j=0:
j=0: para
para k:=1
k:=1 hasta
hasta ii hacer
hacer
escribir('Borrar
escribir('Borrar car.n',k)
car.n',k)
fpara
fpara
otros:
otros:
seleccin
seleccin
T[i,j]=borrar:
T[i,j]=borrar: res(i-1,j);
res(i-1,j);
escribir('Borrar
escribir('Borrar car.n',i)
car.n',i)
T[i,j]=insert:
T[i,j]=insert: res(i,j-1);
res(i,j-1);
escribir('Insertar
escribir('Insertar car.n',j,
car.n',j,
'de
'de BB tras
tras la
la posicin',i)
posicin',i)
T[i,j]=sustit:
T[i,j]=sustit: res(i-1,j-1);
res(i-1,j-1);
escribir('Sustit.
escribir('Sustit. car.n',i,
car.n',i,
'de
'de AA por
por n',j,'de
n',j,'de B')
B')
T[i,j]=nada:
T[i,j]=nada: res(i-1,j-1)
res(i-1,j-1)
fseleccin
fseleccin
fseleccin
fseleccin
fin
fin
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 45

Comparaciones de secuencias

Coste:
En tiempo: (nm)
En espacio: (nm)

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 46

Caminos mnimos entre todos


los pares de nodos de un grafo
R.W. Floyd:
Algorithm 97: Shortest path,
Communications of the ACM, 5(6), p. 345, 1962.

Problema:
Clculo de los caminos de coste mnimo entre
todos los pares de vrtices de un grafo dirigido
sin ciclos de peso negativo.

Principio de optimalidad:
Si i1, i2, , ik, ik+1, , in es un camino de coste
mnimo de i1 a in, entonces:
i1, i2, , ik es un camino de coste mnimo de
i1 a ik, y
ik, ik+1, , in es un camino de coste mnimo
de ik a in.

Aplicacin del principio:


Si k es el vrtice intermedio de mayor ndice en el
camino ptimo de i a j, entonces el subcamino de
i a k es un camino ptimo de i a k que, adems,
slo pasa por vrtices de ndice menor que k.
Lo anlogo ocurre con el subcamino de k a j.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 47

Caminos mnimos entre todos


los pares de nodos de un grafo
Sea C(i,j) el coste de la arista (i,j) o infinito si esa
arista no existe. Sea C(i,i)=0.
Sea Dk(i,j) la longitud (o distancia) del camino de
coste mnimo de i a j que no pasa por ningn
vrtice de ndice mayor que k.
Sea D(i,j) la longitud del camino de coste mnimo
de i a j.
Entonces:

D(i , j) = min min Dk 1 (i ,k ) + Dk 1 (k , j) , C (i , j)

1 k n

D0 (i , j) = C (i , j) , 1 i n , 1 j n

Ahora, un camino ptimo de i a j que no pase


por ningn vrtice de ndice mayor que k bien
pasa por el vrtice k no.
Si pasa por k entonces:
Dk (i , j) = Dk 1 (i ,k ) + Dk 1 (k , j)

Si no pasa por k entonces ningn vrtice


intermedio tiene ndice superior a k-1:
Dk (i , j) = Dk 1 (i , j)

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 48

Caminos mnimos entre todos


los pares de nodos de un grafo

En resumen:
Se tiene la siguiente ecuacin recurrente que
define el mtodo de programacin dinmica.

Dk (i , j) = min Dk 1 (i , j) , Dk 1 (i ,k ) + Dk 1 (k , j) ,
k 1

D0 (i , j) = C (i , j) , 1 i n , 1 j n

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 49

Caminos mnimos entre todos


los pares de nodos de un grafo
{Pre:
{Pre: gg es
es un
un grafo
grafo dirigido
dirigido etiquetado
etiquetado sin
sin
ciclos
negativos}
ciclos negativos}

funcin
funcin Floyd(g:grafo)
Floyd(g:grafo)
devuelve
devuelve vector[vrt,vrt]
vector[vrt,vrt] de
de etiq
etiq
variables
variables D:vector[vrt,vrt]
D:vector[vrt,vrt] de
de etiq;
etiq;
u,v,w:vrt;
u,v,w:vrt; et,val:etiq
et,val:etiq
principio
principio
{inicialmente
{inicialmente la
la distancia
distancia entre
entre dos
dos vrtices
vrtices
tiene
el
valor
de
la
arista
que
los
une;
tiene el valor de la arista que los une;
las
las diagonales
diagonales se
se ponen
ponen aa cero}
cero}

para
para todo
todo vv en
en vrt
vrt hacer
hacer
para
para todo
todo ww en
en vrt
vrt hacer
hacer
D[v,w]:=etiqueta(g,v,w)
D[v,w]:=etiqueta(g,v,w)
{
{ si
si no
no hay
hay arco}
arco}

fpara;
fpara;
D[v,v]:=0
D[v,v]:=0
fpara;
fpara;
...
...

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 50

Caminos mnimos entre todos


los pares de nodos de un grafo
...
...
para
para todo
todo uu en
en vrt
vrt hacer
hacer
para
para todo
todo vv en
en vrt
vrt hacer
hacer
para
para todo
todo ww en
en vrt
vrt hacer
hacer
si
si D[v,u]+D[u,w]<D[v,w]
D[v,u]+D[u,w]<D[v,w]
entonces
entonces D[v,w]:=D[v,u]+D[u,w]
D[v,w]:=D[v,u]+D[u,w]
fsi
fsi
fpara
fpara
fpara
fpara
fpara;
fpara;
devuelve
devuelve DD
fin
fin
{Post:
{Post: D=caminosMnimos(g)}
D=caminosMnimos(g)}

Nota: pivotes(u) devuelve el conjunto de vrtices que


han sido pivotes en pasos anteriores del algoritmo.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 51

Caminos mnimos entre todos


los pares de nodos de un grafo

Eficiencia temporal: (n3)


representacin con matriz de adyacencia:
igual que reiterar Dijkstra (Algoritmos voraces,
pg. 16), aunque el interior del bucle en Floyd es
ms simple
representacin con listas de adyacencia:
Dijkstra + colas con prioridad est en (anlog n)

Espacio:
Floyd exige (n2) mientras que Dijkstra precisa
(n)

Ejercicio: clculo de las secuencias de


nodos que componen los caminos
mnimos
si el camino mnimo de m a n pasa primero por p
y despus por q, la secuencia de vrtices que
forman el camino mnimo de p a q forma parte de
la secuencia de vrtices que forman el camino
mnimo de m a n
usar un vector bidimensional C indexado por
vrtices: C[v,w] contiene un nodo u que forma
parte del camino mnimo entre v y w

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 52

rboles binarios de bsqueda


ptimos

Recordar rbol binario de bsqueda:


La clave de todo nodo es mayor o igual que las
de sus descendientes izquierdos y menor que las
de sus descendientes derechos.

El problema:
Se tiene un conjunto de claves distintas
w1 < w 2 <L< wn
(ordenadas alfabticamente) que deben
almacenarse en un rbol binario de bsqueda.
Se conoce la probabilidad pi, 1in, con la que se
pide buscar la clave wi y su informacin
asociada.
Se conoce tambin la probabilidad qi, 0in, de
bsqueda de una clave inexistente situada entre
wi y wi+1 (con el significado obvio para q0 y qn).
Se tiene que
n

i=1

i =0

pi + qi = 1

Se quiere construir un rbol binario de bsqueda


para guardar las claves que minimice el nmero
medio de comparaciones para encontrar una
clave o para garantizar que no est.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 53

rboles binarios de bsqueda


ptimos
Recordar que la profundidad de la raz es 0, la de
sus hijos es 1, etc.
Si construimos un rbol en el que la clave wi est
en un nodo de profundidad di, 1in, entonces se
necesitan di+1 comparaciones para encontrarla.
Si con probabilidad qi, 0in, buscamos una clave
que no est en el rbol pero que, en caso de estar,
ocupara un nodo de profundidad di entonces se
necesitan di comparaciones para garantizar que
no est.
Por tanto, el nmero medio de comparaciones
para encontrar una clave o para garantizar que
no est (funcin que queremos minimizar) es:
C=

Ejemplo:
qi = 0, 0 i 7

J. Campos - C.P.S.

i =1

i =0

pi (di + 1) + qi di

Palabra
a
al
ama
eso
si
sin
su

Probabilidad
0, 22
0,18
0, 20
0,05
0, 25
0,02
0,08

Esquemas algortmicos - Programacin dinmicaPg. 54

rboles binarios de bsqueda


ptimos
si

Solucin 1:
Creada con
estrategia voraz.
C=2,43

eso

Solucin 2:

al

rbol perfectamente
equilibrado.

sin
ama

si

su

C=2,70

ama

Solucin 3:
Es ptima.
C=2,15

sin

ama
al

eso

su

si
al

eso

su
sin

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 55

rboles binarios de bsqueda


ptimos
E.N. Gilbert y E.F. Moore: Variable length encodings,
Bell System Technical Journal, 38(4), pp. 933-968, 1959.

Solucin de programacin dinmica:


Principio de optimalidad:
Todos los subrboles de un rbol ptimo son
ptimos con respecto a las claves que contienen.
Consideremos un subrbol ptimo que contenga
las claves wi+1, wi+2, , wj.
La probabilidad de que una clave buscada est o
debiera estar en ese subrbol es:
mij =

k=i + 1

k= i

pk + qk

Denotemos por Cij el nmero medio de


comparaciones efectuadas en un subrbol
ptimo que contiene las claves wi+1, wi+2, , wj
durante la bsqueda de una clave en el rbol
principal (y convenimos en que Cii=0).
Supongamos ahora que wk ocupa la raz de ese
subrbol.
Sea Cijk el nmero medio de comparaciones
efectuadas en ese subrbol durante la bsqueda
de una clave en el rbol principal.
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 56

rboles binarios de bsqueda


ptimos
Entonces:
Cijk = mij + Ci , k 1 + Ckj

Ci,k-1 es el n medio de comparaciones en el


subrbol izquierdo.
Ckj es el n medio de comparaciones en el
subrbol derecho.
mij es el el n medio de comparaciones con la
raz.

Ahora se trata de escoger la raz de forma que se


minimice Cij:

Cij = mij + min Ci , k 1 + Ckj , si 0 i < j n


i < k j

Cii = 0, si 0 i n

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 57

rboles binarios de bsqueda


ptimos

El ejemplo:

Palabra
a
al
ama
eso
si
sin
su

qi = 0, 0 i 7

Probabilidad
0, 22
0,18
0, 20
0,05
0, 25
0,02
0,08

Cij = mij + min Ci , k 1 + Ckj , si 0 i < j n


i < k j

Cii = 0, si 0 i n

0
1
2

C=

3
4
5
6
7

J. Campos - C.P.S.

0,22

0,58

1,02

1,17

1,83

1,89

2,15

0,18

0,56

0,66

1,21

1,27

1,53

0,20

0,30

0,80

0,84

1,02

0,05

0,35

0,39

0,57

0,25

0,29

0,47

0,02

0,12

0,08
0

7
6
5
4
3
2
1

Esquemas algortmicos - Programacin dinmicaPg. 58

rboles binarios de bsqueda


ptimos
tipos
tipos probP=vector[1..n]
probP=vector[1..n] de
de real;
real;
probQ=vector[0..n]
probQ=vector[0..n] de
de real;
real;
matC=vector[0..n,0..n]
matC=vector[0..n,0..n] de
de real;
real;
matSol=vector[0..n,0..n]
matSol=vector[0..n,0..n] de
de entero
entero
algoritmo
algoritmo abbpt(ent
abbpt(ent p:probP;
p:probP; ent
ent q:probQ;
q:probQ;
sal
sal C:matC;
C:matC; sal
sal r:matSol)
r:matSol)
{C
{C es
es la
la matriz
matriz definida
definida previamente.
previamente.
En
cada
componente
i,j
de
En cada componente i,j de rr se
se guarda
guarda el
el kk
para
para el
el que
que C[i,j]
C[i,j] resulta
resulta mnimo.}
mnimo.}

variables
variables i,j,k,d:entero;
i,j,k,d:entero;
min,aux:real;
min,aux:real;
m:matC
m:matC
principio
principio
para
para i:=0
i:=0 hasta
hasta nn hacer
hacer
C[i,i]:=0;
C[i,i]:=0;
m[i,i]:=q[i];
m[i,i]:=q[i];
para
para j:=i+1
j:=i+1 hasta
hasta nn hacer
hacer
m[i,j]:=m[i,j-1]+p[j]+q[j]
m[i,j]:=m[i,j-1]+p[j]+q[j]
fpara
fpara
fpara;
fpara;
para
para j:=1
j:=1 hasta
hasta nn hacer
hacer
C[j-1,j]:=m[j-1,j];
C[j-1,j]:=m[j-1,j];
r[j-1,j]:=j
r[j-1,j]:=j
fpara;
fpara;
{Ya
{Ya estn
estn determinados
determinados los
los rboles
rboles de
de 11 nodo.}
nodo.}

...
...
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 59

rboles binarios de bsqueda


ptimos
...
...
para
para d:=2
d:=2 hasta
hasta nn hacer
hacer
para
para j:=d
j:=d hasta
hasta nn hacer
hacer
i:=j-d;
i:=j-d;
min:=maxEntero;
min:=maxEntero;
para
para k:=i+1
k:=i+1 hasta
hasta jj hacer
hacer
aux:=C[i,k-1]+C[k,j];
aux:=C[i,k-1]+C[k,j];
si
si aux<min
aux<min entonces
entonces
min:=aux;
min:=aux;
r[i,j]:=k
r[i,j]:=k
fsi
fsi
fpara;
fpara;
C[i,j]:=m[i,j]+min
C[i,j]:=m[i,j]+min
fpara
fpara
fpara
fpara
fin
fin

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 60

rboles binarios de bsqueda


ptimos
tipos
tipos vectClaves=vector[1..n]
vectClaves=vector[1..n] de
de cadena;
cadena;
rbol=nodo;
rbol=nodo;
nodo=registro
nodo=registro
dato:cadena;
dato:cadena;
iz,de:rbol
iz,de:rbol
freg
freg
algoritmo
algoritmo creaABB(ent
creaABB(ent w:vectClaves;
w:vectClaves;
ent
ent r:matSol;
r:matSol;
sal
sal a:rbol)
a:rbol)
algoritmo
algoritmo creaRec(sal
creaRec(sal a:rbol;
a:rbol;
ent
ent i,j:entero)
i,j:entero)
principio
principio
si
si i=j
i=j entonces
entonces a:=nil
a:=nil
sino
sino
nuevoDato(a);
nuevoDato(a);
a.dato:=w[r[i,j]];
a.dato:=w[r[i,j]];
creaRec(a.iz,i,r[i,j]-1);
creaRec(a.iz,i,r[i,j]-1);
creaRec(a.de,r[i,j],j)
creaRec(a.de,r[i,j],j)
fsi
fsi
fin
fin
principio
principio
creaRec(a,0,n)
creaRec(a,0,n)
fin
fin
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 61

rboles binarios de bsqueda


ptimos

Complejidad:
(n3), usando (n2) posiciones de
memoria.

Es posible transformar automticamente ciertos algoritmos cbicos de


programacin dinmica, como este, en
algoritmos cuadrticos

F.F. Yao: Efficient dynamic programming using


quadrangle inequalities,
Proceedings of the 12th Annual ACM Symposium on the
Theory of Computing, pp. 429-435, 1980.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 62

rboles binarios de bsqueda


ptimos
D.E. Knuth: Optimum binary search trees,
Acta Informatica, 1, pp. 14-25, 1971.

En este caso concreto basta con


demostrar que:
r[i,j-1] r[i,j] r[i+1,j], si j-i2
(por induccin en j-i [Knu87, p. 492])
Ahora, el coste de los dos bucles internos de
abbpt es:

d j n
i = j d

(r[i + 1, j ] r[i , j 1] + 1)
= r[n d + 1,n ] r[0,d 1] + n d + 1 < 2n

Por tanto, el coste es (n2).

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 63

Un problema de fiabilidad de
sistemas

El problema:
Disear un sistema compuesto de varios
dispositivos conectados en serie.
D1

D2

D3

Dn

Sea ri la fiabilidad de Di, i.e., la probabilidad de


que funcione correctamente.
Entonces, la fiabilidad del sistema sistema entero
es:
n
i = 1ri
Por ejemplo, si n=10 y ri=0,99, 1i10, la
fiabilidad de cada dispositivo es muy alta y sin
embargo

i = 1ri
10

J. Campos - C.P.S.

= 0,904

Esquemas algortmicos - Programacin dinmicaPg. 64

Un problema de fiabilidad de
sistemas
Una forma de aumentar la fiabilidad es duplicar
los dispositivos (en paralelo).
D1
D1
D1

D2
D2

D3
D3
D3
D3

Fase 1

Fase 2

Fase 3

Dn
Dn
Dn
Fase n

Si la fase i contiene mi copias de Di, la


probabilidad de que toda la fase falle es
(1 ri )m i

Luego la fiabilidad de la fase i es


1 (1 r i )mi

Por tanto, si ri=0,99 y mi=2, la fiabilidad de la fase


i es 0,9999.
En realidad, la fiabilidad de la fase i es algo
menor que 1 (1 r i )mi (las copias de un mismo
dispositivo no son completamente independientes pues su diseo es comn, por ejemplo);
si denotamos la fiabilidad de la fase i por i (mi )
entonces la fiabilidad del sistema es:

1i n i (mi )
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 65

Un problema de fiabilidad de
sistemas
El problema: maximizar la fiabilidad duplicando
los dispositivos y con alguna limitacin en el
coste.
maximizar
sujeto a

i (m i )

1i n

ci mi c

1i m

m i 1 y entero , 1 i n

Donde ci es el coste de cada unidad de


dispositivo i.
Como ci>0 y mj1, entonces 1miui con

ui = c + ci cj ci
j =1

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 66

Un problema de fiabilidad de
sistemas
Una solucin ptima m1, m2, , mn es el
resultado de una secuencia de decisiones, una
por cada mi.
Denotemos:
fi (x) = mximo
sujeto a

1 j i

j (m j )

1 j i

cj m j x

1 mj u j, 1 j i

Entonces el valor de una solucin ptima es fn(c).

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 67

Un problema de fiabilidad de
sistemas
La ltima decisin requiere elegir mn de entre
{1,2,3,,un}.
Una vez tomada la ltima decisin, las restantes
decisiones deben utilizar el resto de fondos
c-cnmn de forma ptima.
Se cumple el principio de optimalidad y

n (mn )
{
1 m u

f n (c) = max
n

f n 1 (c cnmn )

En general, para fi(x), i1, se tiene:

f i (x) = max i (mi ) f i 1 (x ci mi )


1 mi ui

f 0 (x) = 1, para todo

x, 0 x c

Se resuelve de forma similar al problema de la


mochila 0-1 (ejercicio).

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 68

El problema del viajante de


comercio

Recordar:
Encontrar un recorrido de longitud mnima para
un viajante que tiene que visitar varias ciudades
y volver al punto de partida, conocida la
distancia existente entre cada dos ciudades.
Es decir, dado un grafo dirigido con arcos de
longitud no negativa, se trata de encontrar un
circuito de longitud mnima que comience y
termine en el mismo vrtice y pase exactamente
una vez por cada uno de los vrtices restantes
(circuito hamiltoniano).
Ms vueltas!

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 69

El problema del viajante de


comercio
Sean G=(V,A) un grafo orientado,
V={1,2,,n},
Lij la longitud de (i,j)A,
Lij= si no existe el arco (i,j).
El circuito buscado empieza en el vrtice 1.
Se compone de (1,j), con j1, seguido de un
camino de j a 1 que pasa exactamente una vez
por cada vrtice de V\{1,j}.
Principio de optimalidad: si el circuito es ptimo,
el camino de j a 1 debe serlo tambin.
Sea SV\{1} un subconjunto de vrtices e
iV\S un vrtice;
llamamos g(i,S) a la longitud del camino mnimo
desde i hasta 1 que pase exactamente una vez
por cada vrtice de S.
Entonces:
longitud del circuito ptimo =
= g (1,V \ {1}) =

= min L1 j + g ( j ,V \ {1, j})


2 j n

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 70

El problema del viajante de


comercio
Ms en general, si i1, S e iS:

g (i ,S) = min Lij + g ( j ,S \ {j})


jS

(*)

Adems:
g (i ,) = Li 1 ,

i = 2, 3,,n

Mtodo de resolucin:
Usar (*) y calcular g para todos los conjunto
S con un solo vrtice (distinto del 1).
Volver a usar (*) y calcular g para todos los
conjuntos S de dos vrtices (distintos del 1) y
as sucesivamente.
Cuando se conoce el valor de g para todos
los conjuntos S a los que slo les falta un
vrtice (distinto del 1) basta calcular
g(1,V\{1}).

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 71

El problema del viajante de


comercio

Ejemplo. Sea G el grafo completo de


cuatro vrtices con longitudes:
0
5
L=
68

10
0
13
8

15
9
0
9

20
10
12
0

Inicializacin:
g(2,) = 5;

g(3,) = 6; g(4,) = 8.

Usar (*) para obtener:


g(2,{3}) = L23 + g(3,) = 15;
g(2,{4}) = L24 + g(4,) = 18;
g(3,{2}) = 18; g(3,{4}) = 20;
g(4,{2}) = 13; g(4,{3}) = 15.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 72

El problema del viajante de


comercio
Ahora, utilizando de nuevo (*) para conjuntos de
dos elementos:

g (2,{ 3, 4}) = min L23 + g (3,{4}) , L24 + g (4 ,{3}) =


= min {29, 25} = 25;

g (3,{ 2, 4}) = min L32 + g (2,{4}) , L24 + g (4 ,{2}) =


= min {31, 25} = 25;

g (4 ,{ 2, 3}) = min L42 + g (2,{3}) , L43 + g (3,{2}) =


= min {23, 27} = 23.

Finalmente:
g (1,{ 2, 3, 4}) = min { L12 + g (2,{3, 4}) ,
L13 + g (3,{2, 4}) ,
L14 + g (4 ,{2, 3}) } =
= min { 35, 40, 43 } = 35.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 73

El problema del viajante de


comercio

Si adems se quiere saber cmo se


construye el circuito ptimo:
Utilizar una funcin adicional
J(i,S) es el valor de j que minimiza g(i,S) al aplicar
la frmula (*).

En el ejemplo:
J(2,{3,4}) = 4; J(3,{2,4}) = 4;
J(4,{2,3}) = 2; J(1,{2,3,4}) = 2.
Y el circuito ptimo ser pues:
1 J(1,{2,3,4}) = 2
J(2,{3,4}) = 4
J(4,{3}) = 3
1

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 74

El problema del viajante de


comercio

Coste del algoritmo:


clculo de g(j,): n-1 consultas a una tabla,
clculo de los g(j,S) tales que 1card(S)=kn-2:
(n 1)

n 2
k sumas en total
k

clculo de g(1,V\{1}): n-1 sumas.


Tiempo de clculo:
n 2

n 2
= n 2 2n
2(n 1) + (n 1)k
k

k =1

( )

Puesto que

k k = r 2r 1

k= 1

(Este tiempo es mejor que (n!) que resultara de


la estrategia de fuerza bruta, pero)
Coste en espacio (para conservar g y J): (n2n)

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 75

El problema del viajante de


comercio

Para hacernos una idea del coste

espacio
tiempo
nmero de
tiempo
vrtices fuerza bruta prog. dinmica prog. dinmica
n2n
n
n!
n2 2n
5
10
15
20

J. Campos - C.P.S.

120
3628800
1, 31 1012
2, 43 1018

800
102400
7372800
419430400

160
10240
491520
20971520

Esquemas algortmicos - Programacin dinmicaPg. 76

El problema del viajante de


comercio

Implementacin recursiva ineficiente:


funcin
funcin g(i,S)
g(i,S) devuelve
devuelve nat
nat
variables
variables msCorto,distancia,j:nat
msCorto,distancia,j:nat
principio
principio
si
si S=
S=
entonces
entonces
devuelve
devuelve L[i,1]
L[i,1]
sino
sino
msCorto:=
msCorto:=;;
para
para todo
todo jj en
en SS hacer
hacer
distancia:=L[i,j]+g(j,S\{j});
distancia:=L[i,j]+g(j,S\{j});
si
si distancia<msCorto
distancia<msCorto
entonces
entonces
msCorto:=distancia
msCorto:=distancia
fsi
fsi
fpara;
fpara;
devuelve
devuelve msCorto
msCorto
fsi
fsi
fin
fin
Se calcula repetidas veces el mismo valor de g: ((n-1)!)

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 77

El problema del viajante de


comercio

Utilizacin de una funcin con


memoria:
{se
{se usa
usa una
una tabla
tabla gtab
gtab cuyos
cuyos elementos
elementos se
se
inicializan
inicializan con
con -1}
-1}

funcin
funcin g(i,S)
g(i,S) devuelve
devuelve nat
nat
variables
variables msCorto,distancia,j:nat
msCorto,distancia,j:nat
principio
principio
si
si S=
S= entonces
entonces devuelve
devuelve L[i,1]
L[i,1]
sino
sino
si
si gtab[i,S]
gtab[i,S]00
entonces
entonces devuelve
devuelve gtab[i,S]
gtab[i,S]
sino
sino
msCorto:=
msCorto:=;;
para
para todo
todo jj en
en SS hacer
hacer
distancia:=L[i,j]+g(j,S\{j});
distancia:=L[i,j]+g(j,S\{j});
si
si distancia<msCorto
distancia<msCorto
entonces
entonces msCorto:=distancia
msCorto:=distancia
fsi
fsi
fpara;
fpara;
gtab[i,S]:=msCorto;
gtab[i,S]:=msCorto;
devuelve
devuelve msCorto
msCorto
fsi
fsi
fsi
fsi
fin
fin
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 78

Planificacin de trabajos

El problema:
Sea un sistema en el que la realizacin de un conjunto de trabajos requiere la ejecucin por parte
de un conjunto de agentes (o procesadores) de
una serie de tareas diferentes para cada trabajo.

n trabajos requiriendo cada uno m tareas:


T1i, T2i, , Tmi, 1in
la tarea Tji la realiza el procesador Pj, 1jm,
y requiere un tiempo tji

Planificacin para los n trabajos:


Es una asignacin de tareas a intervalos de
tiempo en los procesadores.
la tarea Tji debe asignarse a Pj
un procesador no puede tener ms de una
tarea asignada en cada instante de tiempo
para todo trabajo i, el procesamiento de Tji,
j>1, no puede empezar hasta que Tj-1,i haya
terminado

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 79

Planificacin de trabajos

Ejemplo:
Se tiene que planificar la ejecucin de dos
trabajos en tres procesadores, de forma que los
tiempos de cada tarea vienen dados por:
2 0
T = 3 3
5 2

Dos planificaciones posibles:


(a)

(b)

tiempo 0 1
P1
T11
P2
T22
P3
tiempo 0 1
P1
T11
P2
T22
P3

T21

T22
T31
3
T21
T32

10 11 12
T32

10 11 12

T31

La planificacin (b) se dice no apropiativa (nonpreemptive) porque el procesamiento de una tarea


no se interrumpe hasta que sta ha terminado.
La planificacin (a) se dice apropiativa
(preemptive) porque el trabajo 1 se apropia del
procesador 2 antes de que ste termine con el
trabajo 2.
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 80

Planificacin de trabajos
El tiempo de terminacin del trabajo i en la
planificacin S es el instante, fi(S), en que todas
las tareas del trabajo i han terminado.
En el ejemplo (a), f1(Sa)=10 y f2(Sa)=12.
En el ejemplo (b), f1(Sb)=11 y f2(Sb)=5.
El tiempo de terminacin, f(S), de la planificacin
S es:
F (S) = max

1 i n

{f i (S) }

El tiempo medio de terminacin, MFT(S), se


define como:
MFT(S) =

J. Campos - C.P.S.

1
f i (S)
n 1i n

Esquemas algortmicos - Programacin dinmicaPg. 81

Planificacin de trabajos
Planificacin con tiempo de terminacin ptimo
(OFT) para un conjunto de trabajos:
es una planificacin no apropiativa, S, para la
que F(S) es mnimo entre todas las
planificaciones no apropiativas.
Planificacin apropiativa y con tiempo de
terminacin ptimo (POFT):
es una planificacin apropiativa, S, para la que
F(S) es mnimo entre todas las planificaciones
apropiativas.
Planificacin con tiempo medio de terminacin
ptimo (OMFT):
es una planificacin no apropiativa, S, para la
que MFT(S) es mnimo entre todas las
planificaciones no apropiativas.
Planificacin apropiativa y con tiempo medio de
terminacin ptimo (POMFT):
es una planificacin apropiativa , S, para la que
MFT(S) es mnimo entre todas las planificaciones
apropiativas.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 82

Planificacin de trabajos
El clculo de OFT y POFT para m>2 y el clculo
de OMFT es computacionalmente difcil
(es NP-duro).
El clculo de OFT para m=2 puede hacerse
mediante programacin dinmica.

Caso m=2:
Denotemos T1i como ai y T2i como bi.
Una planificacin est completamente
especificada fijando una permutacin de los
trabajos en uno de los procesadores (coincidir
con el otro procesador).
Cada tarea empezar tan pronto como sea
posible.
Ejemplo con 5 trabajos:
P1
P2

a5

a1 a3 a2
b5

a4

b1 b3 b2

b4

planificacin (5,1,3,2,4)

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 83

Planificacin de trabajos
Supongamos, para simplificar, que ai0, 1in
(si hay trabajos con ai=0, se construye primero la
planificacin ptima para los trabajos con ai0 y
despus se aaden delante los trabajos con ai=0).

Principio de optimalidad:
Una permutacin (planificacin) ptima es tal
que, fijado el primer trabajo de la permutacin, el
resto de la permutacin es ptimo con respecto
al estado en que quedan los dos procesadores
despus de terminar el primer trabajo.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 84

Planificacin de trabajos
Sea g(S,t) la longitud (duracin) de una
planificacin ptima para el subconjunto de
trabajos S suponiendo que el procesador 2 no
estar disponible hasta el instante t.
Entonces:

)}

g (S,t) = min ai + g S \ {i},bi + max {t ai ,0}


i S

con g(,t) = max{t,0} y ai0, 1in.


caso tai:

ai

t+bi

aj, jS\{i}

ai

bj, jS\{i}

bi
t+bi-ai

0
caso t<ai:

0 t ai ai+bi
aj, jS\{i}

ai

bj, jS\{i}

bi
0

J. Campos - C.P.S.

bi

Esquemas algortmicos - Programacin dinmicaPg. 85

Planificacin de trabajos
La ecuacin recursiva resultante podra
resolverse de forma anloga a la del problema
del viajante de comercio, pero existe una
solucin mejor
Supongamos que i y j son los dos primeros
trabajos (y en ese orden) en la planificacin
ptima del subconjunto S; entonces:
g (S,t) = ai + g (S \ {i},bi + max {t ai ,0}) =
= ai + aj + g (S \ {i , j},bj + max {bi + max {t ai ,0} aj ,0})
1444444
424444444
3
tij

Pero:

tij = bj + max {bi + max {t ai ,0} aj ,0} =


= bj + bi aj + max {max {t ai ,0},a j bi } =
= bj + bi aj + max {t ai ,a j bi ,0} =
= bj + bi aj ai + max {t ,ai + aj bi ,ai }

Si los dos primeros trabajos fueran j e i:


g (S ,t ) = aj + ai + g (S \ {j ,i},bi + bj ai a j + max {t ,aj + ai bj ,aj })

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 86

Planificacin de trabajos
Entonces:
g (S,t) g (S ,t )
max {t ,ai + aj bi ,ai } max {t ,aj + ai bj ,aj }

Para que esto sea cierto para todo valor de t, se


precisa:
max {ai + a j bi ,ai } max {aj + ai bj ,aj }

Es decir:
ai + a j + max {bi , aj } aj + ai + max {bj , ai }

O sea:
min{bi ,a j } min {bj ,ai }

(*)

Luego existe una planificacin ptima en la que


cada par (i,j) de trabajos adyacentes verifica (*).
Puede demostrarse que todas las planificaciones
que verifican (*) tienen la misma longitud.
Por tanto, basta generar una permutacin para la
que se cumpla (*) para todo par de trabajos
adyacentes.
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 87

Planificacin de trabajos
Ahora, si
min{a1 ,a2 ,K,an ,b1 ,b2 ,Kbn } = ai

Entonces el trabajo i debera ser el primero en


una planificacin ptima.
En cambio, si
min{a1 ,a2 ,K,an ,b1 ,b2 ,Kbn } = bj

Entonces el trabajo j debera ser el ltimo en una


planificacin ptima.
Luego podemos decidir la posicin de uno de los
trabajos (el primero o el ltimo).
Repitiendo el proceso, se puede construir la
planificacin ptima.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 88

Planificacin de trabajos

Por tanto la solucin es:


i) ordenar los ai y bi en orden no decreciente;
ii)si el siguiente nmero de la secuencia es ai y el
trabajo i no ha sido planificado todava,
planificar el trabajo i en la posicin ms a la
izquierda de entre los que restan;
si el siguiente nmero es bj y el trabajo j no ha
sido planificado todava, planificar el trabajo j en
la posicin ms a la derecha de entre los que
restan;
(ntese que el algoritmo sirve tambin si hay
trabajos con ai=0)

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 89

Planificacin de trabajos

Ejemplo:
Sean n=4, (a1,a2,a3,a4) = (3,4,8,10) y
(b1,b2,b3,b4) = (6,2,9,15).
La secuencia ordenada de los ai y los bi es:
(b2,a1,a2,b1,a3,b3,a4,b4) = (2,3,4,6,8,9,10,15).
Sea 1,2,3,4 la secuencia ptima.
Como el nmero menor es b2, entonces 4=2.
El siguiente nmero es a1 luego 1=1.
El siguiente es a2 pero el trabajo 2 ya ha sido
planificado.
El siguiente es b1 pero 1 ya ha sido
planificado.
El siguiente es a3 luego hacemos 2=3.
Por tanto, 3=4.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 90

Planificacin de trabajos

Coste: O(n log n)

Ntese que la solucin directa de

)}

g (S,t) = min ai + g S \ {i},bi + max {t ai ,0}


i S

hubiera llevado al menos O(2n), que es


el nmero de subconjuntos S diferentes
para los que habra que calcular g(S,t).

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 91

Una competicin internacional

El problema:
Dos equipos A y B se enfrentan un mximo de
2n-1 veces, ganando el primer equipo que
acumule n victorias.
Supongamos que no es posible un partido nulo,
que los resultados de cada partido son
independientes y que hay una probabilidad
constante p de que A gane un partido y q = 1-p de
que lo gane B.
Cul es la probabilidad, a priori, de que gane A?

El planteamiento:
Sea P(i,j) la probabilidad de que A gane la
competicin sabiendo que le faltan todava i
victorias y a B le faltan j.
Entonces, antes del primer partido, la probabilidad de que A gane la competicin es P(n,n).
Si A ya ha acumulado todas las victorias
necesarias entonces es el ganador de la
competicin, es decir: P(0,j) = 1, 1jn.
Igualmente, P(i,0) = 0, para 1in.
La ecuacin recurrente es:
P(i,j) = pP(i-1,j) + qP(i,j-1), para i,j1.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 92

Una competicin internacional

La solucin directa:
funcin
funcin P(i,j)
P(i,j) devuelve
devuelve real
real
{pp
{pp (pq)
(pq) es
es la
la probabilidad
probabilidad de
de que
que gane
gane AA (B)}
(B)}

principio
principio
si
si i=0
i=0
entonces
entonces
devuelve
devuelve 11
sino
sino
si
si j=0
j=0
entonces
entonces
devuelve
devuelve 00
sino
sino
devuelve
devuelve pp*P(i-1,j)+pq*P(i,j-1)
pp*P(i-1,j)+pq*P(i,j-1)
fsi
fsi
fsi
fsi
fin
fin

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 93

Una competicin internacional

Coste de la solucin directa:


Sea T(k) el tiempo necesario en el caso peor para
calcular P(i,j) con i+j=k.
T (1) = c
T (k ) 2T (k 1) + d , k > 1

donde c y d son dos constantes.


Luego, T(k) es O(2k) y por tanto T(2n) es O(22n).
i + j
2
Exactamente el n de llamadas recursivas es 2
j

Por tanto, el tiempo para calcular P(n,n) es ( 2n )
n
y puede demostrarse que
2n
22n (2n + 1)
n

En definitiva, el tiempo de la solucin directa


para calcular P(n,n) es O(4n) y (4n/n).
Puede demostrarse que el tiempo es 4n n

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 94

Una competicin internacional

El problema de la solucin directa:


Como siempre en programacin dinmica, se
calcula muchas veces el valor de cada P(i,j).
Solucin mejor: usar una tabla para almacenar
los P(i,j).
Ejemplo (para p = q = 1/2):
1 2 21 32 13 16 15 16
11 32 1 2 11 16 7 8
3 16 5 16 1 2
34
1 16 1 8
14
12
0
0
0
0
4
3
2
1

P(i,j) = pP(i-1,j) + qP(i,j-1)

1
1
1
1

4
3
2
1
0

la matriz se completa
por diagonales desde
la esquina inferior derecha

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 95

Una competicin internacional

La solucin:
funcin
funcin apuestas(n:natural;
apuestas(n:natural; p:real)
p:real)
devuelve
devuelve real
real
variables
variables tabP:vector[0..n,0..n]de
tabP:vector[0..n,0..n]de real;
real;
q:real;
q:real; s,k:natural
s,k:natural
principio
principio
q:=1-p;
q:=1-p;
para
para s:=1
s:=1 hasta
hasta nn hacer
hacer
tabP[0,s]:=1;
tabP[0,s]:=1; tabP[s,0]:=0;
tabP[s,0]:=0;
para
para k:=1
k:=1 hasta
hasta s-1
s-1 hacer
hacer
tabP[k,s-k]:=p*tabP[k-1,s-k]+
tabP[k,s-k]:=p*tabP[k-1,s-k]+
q*tabP[k,s-k-1]
q*tabP[k,s-k-1]
fpara
fpara
fpara;
fpara;
devuelve
devuelve tabP[n,n]
tabP[n,n]
fin
fin

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 96

Una competicin internacional

Coste:
En tiempo: (n2)
En espacio: (n2)
Pero se puede reducir fcilmente a (n)

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 97

Triangulacin de polgonos

Problema:
Dados los vrtices de un polgono se trata de
seleccionar un conjunto de cuerdas (lneas entre
vrtices no adyacentes) de modo que ningn par
de cuerdas se cruce entre s y que todo el
polgono quede dividido en tringulos.
(8,26)

v2

v3

(15,26)
v4 (27,21)

(0,20) v1

v5 (22,12)

(0,10) v0
v6

(10,0)

Adems, la longitud total de las cuerdas debe ser


mnima (triangulacin minimal).
Utilidad: se puede emplear para sombrear
objetos tridimensionales en una imagen virtual
(bidimensional).
Otra: interpolacin numrica de funciones de
dos variables.
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 98

Triangulacin de polgonos

Resolucin de programacin dinmica:


Consideremos un polgono definido por sus
vrtices v0, v1, , vn-1.
Sea Sis el subproblema de tamao s partiendo del
vrtice vi, es decir, el problema de la triangulacin minimal del polgono formado por los s
vrtices que comienzan en vi y siguen en el
sentido de las agujas del reloj (vi, vi+1, , vi+s-1),
contando con la cuerda (vi,vi+s-1).
v2
v1

v3
v4

S65
v5

v0
v6

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 99

Triangulacin de polgonos
Ahora, para triangular
el polgono Sis, hay tres
posibilidades:
1) Tomar el vrtice vi+1 para
formar un tringulo con
las cuerdas (vi,vi+s-1) y
(vi+1,vi+s-1) y con el tercer
lado (vi,vi+1), y despus
resolver el subproblema Si+1,s-1.
2) Tomar el vrtice vi+s-2 para
formar un tringulo con las
cuerdas (vi,vi+s-1) y (vi,vi+s-2)
y con el tercer lado (vi+s-2,vi+s-1),
y despus resolver el
subproblema Si,s-1.
3) Para algn k entre 2 y s-3,
tomar el vrtice vi+k y formar
un tringulo con lados
(vi,vi+k), (vi+k,vi+s-1) y (vi,vi+s-1),
y despus resolver los
subproblemas Si,k+1 y Si+k,s-k.

v2
v1

v3

S04
S65

v0
v6
v2

v3

v1

S65

S64
v0
v6
v2
v1

v3

S13
S65

S63

v0

v6
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 100

Triangulacin de polgonos
Por tanto, si denotamos por Cis el coste de la
triangulacin Sis, se obtiene la siguiente relacin
recursiva:
Cis =

min

1 k s 2

{Ci , k + 1 + Ci + k , s k + D(vi ,vi + k ) +


+ D(vi + k ,vi + s 1 )

para 0in-1, 4sn;


donde:
D(vp,vq) es la longitud de la cuerda entre los
vrtices vp y vqsi vp y vq no son vrtices
adyacentes en el polgono; y
D(vp,vq) es 0 si vp y vq son adyacentes.
Adems, Cis = 0 para 0in-1, 2s<4.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 101

Triangulacin de polgonos

Solucin recursiva inmediata:


Aplicando la ecuacin recurrente anterior
Problema: el nmero de llamadas crece
exponencialmente con el nmero de vrtices
Sin embargo, sin contar el problema original,
slo hay n(n-4) subproblemas diferentes que hay
que resolver
Por tanto, la solucin recursiva resuelve muchas
veces un mismo subproblema

Solucin eficiente:
Utilizacin de una tabla para almacenar los
costes de las soluciones de los subproblemas

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 102

Triangulacin de polgonos
C65 = min{ C62 + C04 + D(v6 ,v 0 ) + D(v0 ,v 3 ) ,
C63 + C13 + D(v6 ,v 1 ) + D(v1 ,v 3 ) ,
C64 + C22 + D(v6 ,v 2 ) + D(v2 ,v 3 ) } =
= min {38,09 ; 38,52 ; 43,97 } = 38,09
(8,26)

v2

v3

(15,26)

(0,20) v1

v4

(0,10) v0

v5 (22,12)
v6
7
6
5

(1)

4
3
2
s

D(v2 ,v3 ) = D (v 6 ,v 0 ) = 0
(son aristas y no cuerdas)
D (v 6 ,v 2 ) = 26,08;
D (v 1 ,v 3 ) = 16,16;

(27,21)

D (v 6 ,v 1 ) = 22, 36;
D (v 0 ,v 3 ) = 21,93

(10,0)

C07 =
75, 43
C06 = C16 = C26 = C36 = C46 = C56 = C66 =
53, 54 55, 22 57 , 58 64 ,69 59,78 59,78 63,62
C05 = C15 = C25 = C35 = C45 = C55 = C65 =
37 , 54 31, 81 35, 49 37 ,74 45, 50 39,98 38,09
C04 = C14 = C24 = C34 = C44 = C54 = C64 =

(3)

16,16 16,16 15,65 15,65 22,69 22,69 17 , 89


C03 = C13 = C23 = C33 = C43 = C53 = C63 =
0
0 (2) 0
0
0
0
0 (2)
C02 = C12 = C22 = C32 = C42 = C52 = C62 =
0
i=0

J. Campos - C.P.S.

0
1

(3)
2

0
3

0
4

0
5

(1)

Esquemas algortmicos - Programacin dinmicaPg. 103

Triangulacin de polgonos

Hemos calculado el coste de la


triangulacin mnima pero,
cul es esa triangulacin?
Para cada posicin (i,s) de la tabla se necesita
almacenar, adems del coste, el valor del ndice k
que produjo el mnimo.
Entonces la solucin consta de las cuerdas
(vi,vi+k) y (vi+k,vi+s-1)
(a menos que una de ellas no sea cuerda, porque
k=1 o k=s-2),
ms las cuerdas que estn implicadas por las
soluciones de Si,k+1 y Si+k,s-k.

J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 104

Triangulacin de polgonos

En el ejemplo:
El valor de C07 procede de k=5. Es decir, el
problema S07 se divide en S06 y S52.
S52 es un problema trivial, de coste 0.
As, se introduce la cuerda (v0,v5), de coste 2209,
y se debe resolver S06.
v2

v1

v0

v3

2
1

v4

3
v5

v6

El valor de C06 procede de k=2. Por tanto, el


problema se divide en S03 y S24.
S03 es un tringulo con vrtices v0, v1 y v2, luego
no precisa ser resuelto, mientras que S24 es un
cuadriltero, definido por v2, v3, v4 y v5, y debe
ser resuelto.
Adems, hay que incluir los costes de las cuerdas
(v0,v2) y (v2,v5), que son 1789 y 1980.
El valor de C24 se obtiene con k=1, dando los
subproblemas S22 y S33, que tienen tamao
menor o igual que tres y, por tanto, coste 0.
Se introduce la cuerda (v3,v5), con coste 1565.
J. Campos - C.P.S.

Esquemas algortmicos - Programacin dinmicaPg. 105

También podría gustarte