Vous êtes sur la page 1sur 70

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.
maximizar
b
i ximochila, de capacidad
El objetivo
es llenar
la
1i n
C, de manera que se maximice el beneficio.

sujeto a pi xi C
1i n

con 0 xi 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.

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.

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.

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.

El problema de la
mochila 0-1

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


l

maximizar bi xi
ik

sujeto a pi xi P
ik

con xi {0,1}, k i l

El problema de la mochila 0-1 es


mochila(1,n,C).

El problema de la
mochila 0-1

Ecuacin de recurrencia hacia


adelante:

g
j (c)
Si es el beneficio (o ganancia total)

de una
gj (c) max gj1(c), gj1(c pj ) bj

solucin
ptima de mochila(j,n,c), entonces

dependiendo de que el objeto j-simo


entre o no en la solucin (ntese que slo
puede entrar si

c-pj0).
g
c
n1(c) 0, para cualquier capacidad
Adems,
v
g1(C)
Ambas ecuaciones permiten calcular,
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 atr

El problema de la
mochila 0-1

Ecuacin de recurrencia hacia


atrs:

g
j (c)
Sies el beneficio (o ganancia total)

de g
una
j (c) max gj1(c), gj1(c pj ) bj

solucin
ptima de mochila(1,j,c), entonces

dependiendo de que el objeto j-simo


entre o no en la solucin (ntese que slo
puede entrar si
c-pj0).
g0(c) 0, para cualquier capacidad
c

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

(Ahora la recurrencia es hacia atrs pero el clcul


se realiza hacia adelante.)

El problema de la
mochila 0-1

Tanto la recurrencia hacia adelante como


hacia atrs permiten escribir un algoritmo
recursivo de forma
inmediata.
funcinmochila1(p,b:vector[1..n]denat;
funcinmochila1(p,b:vector[1..n]denat;
C:nat)devuelvenat
C:nat)devuelvenat
principio
principio
devuelveg(n,C)
devuelveg(n,C)
fin
fin
funcing(j,c:nat)devuelvenat
funcing(j,c:nat)devuelvenat
principio
principio
sij=0entoncesdevuelve0
sij=0entoncesdevuelve0
sino
sino
sic<p[j]
sic<p[j]
entoncesdevuelveg(j1,c)
entoncesdevuelveg(j1,c)
sino
sino
sig(j1,c)?g(j1,cp[j])+b[j]
sig(j1,c)?g(j1,cp[j])+b[j]
entonces
entonces
devuelveg(j1,c)
devuelveg(j1,c)
sino
sino
devuelveg(j1,cp[j])+b[j]
devuelveg(j1,cp[j])+b[j]
fsi
fsi
fsi
fsi
fsi
fsi
fin
fin

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


sub-problemas
a resolver no es tan

gj (c)
grande:
La funcintiene 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.

El problema de la
mochila 0-1

Para evitar la repeticin de


clculos,
las soluciones de los subproblemas

g
se
j (c)
deben almacenan en una tabla.
Matriz nC cuyo elemento (j,c) almacena
Para el ejemplo anterior:
n=3
C=15
(b1,b2,b3)=(38,40,24)
01 2 3 4 5
1,p2,p3)=(9,6,5)
p(p
1 9 0 0 0 0 0 0
p2 6 0 0 0 0 0 0
p3 5 0 0 0 0 0 24

6
0
40
40

7
0
40
40

8 9
0 38
40 40
40 40

10 11 12 13 14
38 38 38 38 38
40 40 40 40 40
40 64 64 64 64

gj (c) max gj1(c), gj1(c pj ) bj

15
38
78
78

El problema de la
mochila 0-1
algoritmomochila(entp,b:vect[1..n]denat;
algoritmomochila(entp,b:vect[1..n]denat;
entCap:nat;
entCap:nat;
salg:vect[0..n,0..Cap]denat)
salg:vect[0..n,0..Cap]denat)
variablesc,j:nat
variablesc,j:nat
principio
principio
parac:=0hastaCaphacerg[0,c]:=0fpara;
parac:=0hastaCaphacerg[0,c]:=0fpara;
paraj:=1hastanhacerg[j,0]:=0fpara;
paraj:=1hastanhacerg[j,0]:=0fpara;
paraj:=1hastanhacer
paraj:=1hastanhacer
parac:=1hastaCaphacer
parac:=1hastaCaphacer
sic<p[j]
sic<p[j]
entonces
entonces
g[j,c]:=g[j1,c]
g[j,c]:=g[j1,c]
sino
sino
sig[j1,c]?g[j1,cp[j]]+b[j]
sig[j1,c]?g[j1,cp[j]]+b[j]
entonces
entonces
g[j,c]:=g[j1,c]
g[j,c]:=g[j1,c]
sino
sino
g[j,c]:=g[j1,cp[j]]+b[j]
g[j,c]:=g[j1,cp[j]]+b[j]
fsi
fsi
fsi
fsi
fpara
fpara
fpara
fpara
fin
fin

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:

algoritmoobjetos(entp,b:vect[1..n]denat;
algoritmoobjetos(entp,b:vect[1..n]denat;
entCap:nat;
entCap:nat;
entg:vect[0..n,0..Cap]denat)
entg:vect[0..n,0..Cap]denat)
principio
principio
test(n,Cap)
test(n,Cap)
fin
fin
algoritmotest(entj,c:nat)
algoritmotest(entj,c:nat)
principio
principio
sij>0entonces
sij>0entonces
sic<p[j]entoncestest(j1,c)
sic<p[j]entoncestest(j1,c)
sino
sino
sig[j1,cp[j]]+b[j]>g[j1,c]
sig[j1,cp[j]]+b[j]>g[j1,c]
entonces
entonces
test(j1,cp[j]);
test(j1,cp[j]);
escribir('meter',j)
escribir('meter',j)
sinotest(j1,c)
sinotest(j1,c)
fsi
fsi
fsi
fsi
fsi
fsi
fin
fin

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.

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
V1 d, respectivamente.
V2
V3
V4
V5
destino,
2
5

1
2

3
1

3 4
4

11
6

8
9

5
9

10 d

12

Consideraremos grafos etiquetados.


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

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
V4
V5
2
5

1
2

3
1

3 4
4

11
6

5
9
12

10 d

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.

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,
max {Nr ,p}.
1i<r.
0pn j

Adems hay arcos de la forma


(vr,j,vr+1,n), que tienen asignado un
coste

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 1,1

N 2,0

v2,1

o v1,0

i 0,1,2,3

N 2,1

v2,2

N 2,0

v3,2

N 2,1

N 1,3

N 2,2

v2,3
N 1,4

max {N 3,i }

N 2,2

N 2,3
N 1,2

v3,1

N 2,0

N 2,1

v2,4

N
N 2,2 2,3

max{N 3,i }
i 0,1

v3,3
N 2,4

N 2,0

max{N 3,i }

i 0,1,2

v3,4

N 3,0

d v4,4

Camino de coste mnimo


en un grafo multietapa

Solucin de programacin dinmica:


V1

V2

V3

2
5

1
2

3
1

3 4
4

8
11
6

V4

8
9

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.

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), si ( j ,d) A
C (k 1, j)
en otro caso
,

C (i , j) min c( j ,l) C (i 1,l) , para 1 i k 2


lV i 1
( j ,l)A

V1

V2

V3

2
5

1
2

3
1

3 4
4

8
11
6

V4

8
9

V5
5
9
12

10 d

Camino de coste mnimo


en un grafo multietapa
c( j ,d),
C (k 1, j)
,

si ( j ,d) A
en otro caso

C (i , j) min c( j ,l) C (i 1,l) , para 1 i k 2


lV i 1
( j ,l)A

V1

V2

V3

2
5

1
2

3
1

3 4
4

8
11
6

V4

V5
5
9

10 d

12

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


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

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

1
2

3
1

3 4
4

8
11
6

V4

8
9

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
v2 D(1,1) 2
v3 D(2,D(1,1)) 6
v4 D(3,D(2,D(1,1))) 8

V5
5
9
12

10 d

Camino de coste mnimo


en un grafo multietapa
algoritmomultietapa(entG=(V,A,c):grafo;
algoritmomultietapa(entG=(V,A,c):grafo;
entk,n:nat;
entk,n:nat;
salP:vect[1..k]de1..n)
salP:vect[1..k]de1..n)
{Losvrticesestnnumeradosdeformaquelos
{Losvrticesestnnumeradosdeformaquelos
ndicesdelosvrticesdeunaetapasonmayores
ndicesdelosvrticesdeunaetapasonmayores
quelosndicesdelosdelaetapaanterior.
quelosndicesdelosdelaetapaanterior.
*
ElprimerndicedeC
*
ElprimerndicedeCyD,quesloidentificaba
yD,quesloidentificaba
laetapa,sehasuprimido.}
laetapa,sehasuprimido.}

variablesC:vect[1..n]dereal;
variablesC:vect[1..n]dereal;
D:vect[1..n]de1..n;
D:vect[1..n]de1..n;
j,r:1..n
j,r:1..n
principio
principio
*
C[n]:=0.0;
*
C[n]:=0.0;{ClculodeC
{ClculodeCyD}
yD}
paraj:=n1descendiendohasta1hacer
paraj:=n1descendiendohasta1hacer
r:=vrticet.q.(j,r)A3
r:=vrticet.q.(j,r)A3
c(j,r)+C[r]esmnimo;
c(j,r)+C[r]esmnimo;
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;P[k]:=n;
P[1]:=1;P[k]:=n;{Construccindelcamino}
{Construccindelcamino}
paraj:=2hastak1hacer
paraj:=2hastak1hacer
P[j]:=D[P[j1]]
P[j]:=D[P[j1]]
fpara
fpara
fin
fin

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

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

si (o, j) A
en otro caso

C (i , j) min c(l , j) C (i 1,l) , para 3 i k


lV i 1
(l , j)A

V1

V2

V3

2
5

1
2

3
1

3 4
4

8
11
6

V4

V5
5
9
12

10 d

Camino de coste mnimo


en un grafo multietapa
algoritmomultietapaB(entG=(V,A,c):grafo;
algoritmomultietapaB(entG=(V,A,c):grafo;
entk,n:nat;
entk,n:nat;
salP:vect[1..k]de1..n)
salP:vect[1..k]de1..n)
{Losvrticesestnnumeradosdeformaquelos
{Losvrticesestnnumeradosdeformaquelos
ndicesdelosvrticesdeunaetapasonmayores
ndicesdelosvrticesdeunaetapasonmayores
quelosndicesdelosdelaetapaanterior.
quelosndicesdelosdelaetapaanterior.
*
ElprimerndicedeC
*
ElprimerndicedeCyD,quesloidentificaba
yD,quesloidentificaba
laetapa,sehasuprimido.}
laetapa,sehasuprimido.}

variablesC:vect[1..n]dereal;
variablesC:vect[1..n]dereal;
D:vect[1..n]de1..n;
D:vect[1..n]de1..n;
j,r:1..n
j,r:1..n
principio
principio
*
C[1]:=0.0;
*
C[1]:=0.0;{ClculodeC
{ClculodeCyD}
yD}
paraj:=2hastanhacer
paraj:=2hastanhacer
r:=vrticet.q.(r,j)A3
r:=vrticet.q.(r,j)A3
c(r,j)+C[r]esmnimo;
c(r,j)+C[r]esmnimo;
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[k]:=n;
P[1]:=1;P[k]:=n;{Construccindelcamino}
{Construccindelcamino}
paraj:=k1descendiendohasta2hacer
paraj:=k1descendiendohasta2hacer
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.

Multiplicacin de una
secuencia de matrices

Se desea calcular el producto


matricial: M M1M 2L Mn
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
n multip.
ABCD, de((AB)C)D)
las matrices A(135),
10582 B(589),
C(893) y D(334).
(AB)(CD)
54201
(A(BC))D
2856
A((BC)D)
4055
A(B(CD))
26418

El caso ms eficiente es casi 19 veces ms


rpido que el ms lento!

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 (M1M 2L Mi )(Mi 1M i 2L M n)
Entonces tenemos T(i)T(n-i) formas distintas.
Como i puede tomar valores entre 1 y n-1:

T (n)

n1

T (i)T (n i) ,

i 1

T (1) 1
Nmeros de Catalan

para n 1

Multiplicacin de una
secuencia de matrices

Los nmeros de Catalan crecen


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

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.

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 2L M i y M i1Mi 2L Mn
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
Mi Mi 1L M j
escalares requeridas) para la parte
del producto total.
La solucin final vendr dada por m1n.

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


s 0: tales
m que
0,j-i=s:
para i 1,2,K ,n

i ,i

s 1:

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

1 s n: mi ,i s

min

(mik mk 1,i s di 1dkdi s),

i ki s1

para i 1,2,K ,n s

Mi Mi 1L M i s
El tercer caso(Mrepresenta
que para
i M i 1L M k)(M k1M k 2L M i s)
calcular
se intentan todas las

posibilidades
y se escoge
0, la mejor.
si i j
ij min
{mcompacta:
De m
forma
ms
ik mk1, j di 1dkdj }, si i j
i k j

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.
m13
Para
s=2: 11 m23 13 5 3,m12 m33 13 89 3)
min(m
min(1530,9256) 1530
m24 min(m22 m34 5 89 34,m23 m44 5 3 34)
min(24208
,1845) 1845
m14 min({k 1} m11 m24 13 5 34,
{k 2} m12 m34 13 89 34,
Para s=3:
{k 3} m13 m44 13 3 34)
min(4055,54201
,2856) 2856

j 1 2
3
4
i 1 0 57851530 2856

La matriz es:
2

s 3

1335 1845
s 2

9078
s1

0
s0

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

Multiplicacin de una
secuencia de matrices
algoritmoparentOpt(entd:vect[0..n]denat;
algoritmoparentOpt(entd:vect[0..n]denat;
salm:vect[1..n,1..n]denat;
salm:vect[1..n,1..n]denat;
salkm:vect[1..n,1..n]de1..n)
salkm:vect[1..n,1..n]de1..n)

{meslamatriz[m
{meslamatriz[mijij]definidaantes;
]definidaantes;
km[i,j]guardaelndicekparaelquesealcanza
km[i,j]guardaelndicekparaelquesealcanza
elmnimoalcalcularm[i,j].}
elmnimoalcalcularm[i,j].}

variablesi,r,j,k,q:nat;
variablesi,r,j,k,q:nat;
principio
principio
parai:=1hastanhacer
parai:=1hastanhacer
m[i,i]:=0
m[i,i]:=0
fpara;
fpara;
parar:=2hastanhacer
parar:=2hastanhacer
parai:=1hastanr+1hacer
parai:=1hastanr+1hacer
j:=i+r1;
j:=i+r1;
m[i,j]:=?;
m[i,j]:=?;
parak:=ihastaj1hacer
parak:=ihastaj1hacer
q:=m[i,k]+m[k+1,j]+d[i1]*d[k]*d[j];
q:=m[i,k]+m[k+1,j]+d[i1]*d[k]*d[j];
siq<m[i,j]
siq<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

Multiplicacin de una
secuencia de matrices

Coste en tiempo:
(n3)

Coste en memoria:
(n2)

Multiplicacin de una
secuencia de matrices

Falta hacer el producto!


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

funcinmultSec(M:vect[1..n]dematriz;
funcinmultSec(M:vect[1..n]dematriz;
km:vect[1..n,1..n]de1..n;
km:vect[1..n,1..n]de1..n;
i,j:1..n)
i,j:1..n)
devuelvematriz
devuelvematriz
variablesX,Y:matriz
variablesX,Y:matriz
principio
principio
sij>i
sij>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];
devuelvemult(X,Y)
devuelvemult(X,Y)
sino
sino
devuelveM[i]
devuelveM[i]
fsi
fsi
fin
fin

Caminos mnimos entre


todos
los pares de nodos de
R.W. un
Floyd:
grafo

Algorithm 97: Shortest path,


Communications of the ACM, 5(6), p. 345, 19

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.

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 Dk1(i ,k) Dk 1(k, j) , C(i , j)


1 kn

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) Dk1(k, j)

Si no pasa por k entonces ningn


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

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 Dk1(i , j), Dk 1(i ,k) Dk 1(k, j) ,

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

k1

Caminos mnimos entre


todos
los pares de nodos de
un grafo
{Pre:gesungrafodirigidoetiquetadosin
{Pre:gesungrafodirigidoetiquetadosin
ciclosnegativos}
ciclosnegativos}

funcinFloyd(g:grafo)
funcinFloyd(g:grafo)
devuelvevector[vrt,vrt]deetiq
devuelvevector[vrt,vrt]deetiq
variablesD:vector[vrt,vrt]deetiq;
variablesD:vector[vrt,vrt]deetiq;
u,v,w:vrt;et,val:etiq
u,v,w:vrt;et,val:etiq
principio
principio

{inicialmenteladistanciaentredosvrtices
{inicialmenteladistanciaentredosvrtices
tieneelvalordelaaristaquelosune;
tieneelvalordelaaristaquelosune;
lasdiagonalesseponenacero}
lasdiagonalesseponenacero}

paratodovenvrthacer
paratodovenvrthacer
paratodowenvrthacer
paratodowenvrthacer
D[v,w]:=etiqueta(g,v,w)
D[v,w]:=etiqueta(g,v,w)

{?sinohayarco}
{?sinohayarco}

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

Caminos mnimos entre


todos
los pares de nodos de
un
grafo
...
...
paratodouenvrthacer
paratodouenvrthacer
paratodovenvrthacer
paratodovenvrthacer
paratodowenvrthacer
paratodowenvrthacer
siD[v,u]+D[u,w]<D[v,w]
siD[v,u]+D[u,w]<D[v,w]
entoncesD[v,w]:=D[v,u]+D[u,w]
entoncesD[v,w]:=D[v,u]+D[u,w]
fsi
fsi
fpara
fpara
fpara
fpara
fpara;
fpara;
devuelveD
devuelveD
fin
fin
{Post:D=caminosMnimos(g)}
{Post:D=caminosMnimos(g)}

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


han sido pivotes en pasos anteriores del algoritmo.

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

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
n
r
i 1 i
entero es:

Por ejemplo, si n=10 y ri=0,99, 1i10, la


fiabilidad de cada
dispositivo es muy alta y
10
sin embargoi 1ri 0,904

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

D2
D2

Fase 2

D3
D3
D3
D3
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 )mi
Luego la fiabilidad de la fase i es

1 (1r 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
(las copias de un
m
i
1 (1rno
mismo dispositivo
i ) son completamente
independien-tes 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 )

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

i (mi )

1i n

sujeto a

ci mi c

1i m

mi 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
n

ui c ci cj
j 1

ci

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 (mj )

1 j i

cj mj x

1 mj u j , 1 j i

Entonces el valor de una solucin ptima


es fn(c).

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.
fn (c) elmax
n (mde
Se cumple
n) foptimalidad
n1(c cnmn) y
principio
1mnun

En general,
se
tiene:
fi (x) para
max fi(x),
) f i 1
(x
ci mi )
i (mii1,
1mi ui

f 0(x) 1, para todox, 0 x c

Se resuelve de forma similar al problema


de la mochila 0-1 (ejercicio).

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
Ms
pase exactamente una
vez por cada uno
vueltas!
de los vrtices restantes
(circuito hamiltoniano).

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.
longitud del circuito ptimo =
Entonces:
g(1,V \ {1})

min L1j g( j ,V \ {1, j})


2 j n

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

El problema del viajante


de comercio

Ejemplo. Sea G el grafo completo


de cuatro vrtices con longitudes:
0
5
L
6
8

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(4,{2}) = 13;

g(3,{4}) = 20;
g(4,{3}) = 15.

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.

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(4,{2,3}) = 2;

J(3,{2,4}) = 4;
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

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:
n2

n 2
2(n 1) (n 1)k
n22n
k

k1

r
k
r 2r 1

Puesto que k 1 k
(Este tiempo es mejor que (n!) que
resultara de la estrategia de fuerza bruta,
pero)
Coste en espacio (para conservar g y J):
(n2n)

El problema del viajante


de comercio

Para hacernos una idea del coste


tiempo
espacio
nmero de tiempo
vrtices fuerza brutaprog. dinmica prog. dinmica
n
n!
n22n
n2n
5
10
15
20

120
3628800
1,31 1012
2,43 1018

800
102400
7372800
419430400

160
10240
491520
20971520

El problema del viajante


de comercio

Implementacin recursiva
ineficiente:
funcing(i,S)devuelvenat

funcing(i,S)devuelvenat
variablesmsCorto,distancia,j:nat
variablesmsCorto,distancia,j:nat
principio
principio
siS=
siS=
entonces
entonces
devuelveL[i,1]
devuelveL[i,1]
sino
sino
msCorto:=?;
msCorto:=?;
paratodojenShacer
paratodojenShacer
distancia:=L[i,j]+g(j,S\{j});
distancia:=L[i,j]+g(j,S\{j});
sidistancia<msCorto
sidistancia<msCorto
entonces
entonces
msCorto:=distancia
msCorto:=distancia
fsi
fsi
fpara;
fpara;
devuelvemsCorto
devuelvemsCorto
fsi
fsi
fin
fin

Se calcula repetidas veces el mismo valor de g: ((n

El problema del viajante


de comercio

Utilizacin de una funcin con


memoria:
{seusaunatablagtabcuyoselementosse
{seusaunatablagtabcuyoselementosse
inicializancon1}
inicializancon1}

funcing(i,S)devuelvenat
funcing(i,S)devuelvenat
variablesmsCorto,distancia,j:nat
variablesmsCorto,distancia,j:nat
principio
principio
siS=entoncesdevuelveL[i,1]
siS=entoncesdevuelveL[i,1]
sino
sino
sigtab[i,S]?0
sigtab[i,S]?0
entoncesdevuelvegtab[i,S]
entoncesdevuelvegtab[i,S]
sino
sino
msCorto:=?;
msCorto:=?;
paratodojenShacer
paratodojenShacer
distancia:=L[i,j]+g(j,S\{j});
distancia:=L[i,j]+g(j,S\{j});
sidistancia<msCorto
sidistancia<msCorto
entoncesmsCorto:=distancia
entoncesmsCorto:=distancia
fsi
fsi
fpara;
fpara;
gtab[i,S]:=msCorto;
gtab[i,S]:=msCorto;
devuelvemsCorto
devuelvemsCorto
fsi
fsi
fsi
fsi
fin
fin

Planificacin de trabajos

El problema:
Sea un sistema en el que la realizacin de un
con-junto 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 T debe asignarse a P
ji
j

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

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:

tiempo 0 1
P1
T11
(a)
P2
T22
P3

2
T21

5
T22
T31

10 11 12

T32

tiempo 0 1 2 3 4 5 6 7 8 9 10 11 12
P1
T11
(b)
P2planificacin
T22
La
(b)Tse
21 dice no apropiativa (nonpreemptive)
porque
de una
P3
T32el procesamiento
T31
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.

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)
max f i (S) f(S), de la
1i n
planificacin S es:

El tiempo medio 1de terminacin,


MFT (S)
fi (S)
MFT(S), se define como:
n 1i n

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.

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)

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.

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 a g S\ {i},b max{t a ,0}
i S

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


ai

caso tai: 0

t+bi

aj, jS\{i}

ai

bi

bj, jS\{i}

t+bi-ai

caso t<ai: 0 t ai ai+bi


aj, jS\{i}

ai

bj, jS\{i}

bi
0

bi

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
g(S,t) ai g(S\ {i},bi max{t ai ,0})
ptima del subconjunto S; entonces:
ai aj g(S\ {i , j},bj max{bi max{t ai ,0} aj ,0})
1 4 4 4 4 4 44 2 4 4 4 4 4 4 43
tij

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

Pero:

bj bi aj max{max{t ai ,0},aj bi }
bj bi aj max{t ai ,aj bi ,0}
bj bi aj ai max{t,ai aj bi ,ai }

trabajos
je
g(S,t) aSi
ai dos
g(S\primeros
{j ,i},bi b
max{t,a
j los
j ai aj fueran
j i:ai bj ,aj })

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 aj bi ,ai } max{aj ai bj ,aj }


Es decir:

ai aj max{bi ,aj } aj ai max{bj ,ai }

O sea:

min{bi ,aj } 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.

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

Entonces el trabajo i debera ser el primero


en
una planificacin ptima.
En cambio, si
min{a1,a2,K ,an ,b1,b2,K bn} 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.

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)

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.

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

Vous aimerez peut-être aussi