Está en la página 1de 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
El objetivo b
es llenar i ximochila, de capacidad
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
l
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:

j (c)
g
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).

n1(c) 0, para cualquier capacidad
g c

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:

j (c)
g
Sies el beneficio (o ganancia total)
de g
una
solucin


j (c) max gj1(c), gj1(c pj ) bj
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

se j (c)
g
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 6 7 8 9 10 11 12 13 14 15
p(p1,p2,p3)=(9,6,5)
1 9 0 0 0 0 0 0 0 0 0 38 38 38 38 38 38 38
p2 6 0 0 0 0 0 0 40 40 40 40 40 40 40 40 40 78
p3 5 0 0 0 0 0 24 40 40 40 40 40 64 64 64 64 78



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

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.
destino, V2 V3 V4 V5
2 3
8
7 5
5 1 5 11
7 9
o 1 3 4 6 8 10 d
2 5 6 4
12
4 9 9

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 3
8
7 5
5 1 5 11
7 9
o 1 3 4 6 8 10 d
2 5 6 4
12
4 9 9
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,
1i<r. max {Nr ,p}.
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

v2,1 N 2,0
v3,1
N 1,1
N 2,2 max {N 3,i }
N 2,3 i 0,1,2,3

N 2,1 max{N 3,i }


N 1,2 N 2,0 i 0,1,2
o v1,0 v2,2 v3,2 d v4,4

N max{N 3,i }
N 2,1 N 2,2 2,3 i 0,1
N 1,3 N 2,2
v2,3 v3,3
N 2,0
N 2,1 N 3,0
N 1,4 N 2,4

v2,4 v3,4
N 2,0
Camino de coste mnimo
en un grafo multietapa

Solucin de programacin dinmica:


V1 V2 V3 V4 V5
2 3
8
7 5
5 1 5 11
7 9
o 1 3 4 6 8 10 d
2 5 6 4
12
4 9 9

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 V4 V5
2 3
8
7 5
5 1 5 11
7 9
o 1 3 4 6 8 10 d
2 5 6 4
12
4 9 9
Camino de coste mnimo
en un grafo multietapa

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 V4 V5
2 3
8
7 5
5 1 5 11
7 9
o 1 3 4 6 8 10 d
2 5 6 4
12
4 9 9

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 V4 V5
2 3
8
7 5
5 1 5 11
7 9
o 1 3 4 6 8 10 d
2 5 6 4
12
4 9 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
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), si (o, j) A
C (2, j)
, 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 V4 V5
2 3
8
7 5
5 1 5 11
7 9
o 1 3 4 6 8 10 d
2 5 6 4
12
4 9 9
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:

n1
T (n) T (i)T (n i) , para n 1
i 1
T (1) 1
Nmeros de Catalan
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
escalares requeridas) para la parteMi Mi 1L M j
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:
i ,i 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: 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
0, la mejor.
y se escoge si i j
De mij min
forma ms ik mk1, j di 1dkdj }, si i j
{mcompacta:
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,


Para s=3: {k 2} m12 m34 13 89 34,
{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: s 3
2 0 1335 1845
s 2
3 0 9078
s1
4 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
que la divisin ptima 1L
Mj
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 grafo
Floyd:
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
intermedio (i , j)ndice superior a k-1:
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) ,
k1
D0(i , j) C(i , j), 1 i n, 1 j n
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
n del sistema sistema
entero es: i 1 i
r

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


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

Una forma de aumentar la fiabilidad es


duplicar los dispositivos (en paralelo).

D1 D2 D3 Dn
D1 D2 D3 Dn
D1 D3 Dn
D3
Fase 1 Fase 2 Fase 3 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
1 (1rno m
mismo dispositivo i ) son completamente
i
independien-tes pues su diseo es comn,
por ejemplo);
si denotamos la fiabilidad de la fase i pori (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 ci
j 1
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 j (mj )


1 j i
sujeto a cj mj x
1 j i
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
Se cumple
n (mde
principio
1mnun
n) foptimalidad
n1(c cnmn) y

En general, max fi(x),


fi (x) para
1mi ui

i (mii1, se
) f i 1 tiene:
(x
ci mi )

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

(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 10 15 20
5 0 9 10
L
6 13 0 12
8 8 9 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.
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(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
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
k1
k
n22n

r
r
k
Puesto que k 1 k
r 2r 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)
El problema del viajante
de comercio

Para hacernos una idea del coste

nmero de tiempo tiempo espacio


vrtices fuerza brutaprog. dinmica prog. dinmica
n n! n22n n2n
5 120 800 160
10 3628800 102400 10240
15 1,31 1012 7372800 491520
20 2,43 1018 419430400 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 2 3 4 5 6 7 8 9 10 11 12
P1 T11
(a)
P2 T22 T21 T22
P3 T31 T32

tiempo 0 1 2 3 4 5 6 7 8 9 10 11 12
P1 T11
(b)
P2planificacin
La T22 (b)Tse
21 dice no apropiativa (non-
preemptive)
P3 porqueT32el procesamiento
T31 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.
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
F(S)
terminacin,
max f i (S) f(S), de la
planificacin S es:
1i n

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 a5 a1 a3 a2 a4
P2 b5 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:
i
g(S,t) min a g S\ {i},b max{t a ,0}
i S
i i

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

caso tai: 0 ai t t+bi


ai aj, jS\{i}
bi bj, jS\{i}

0 t+bi-ai

caso t<ai: 0 t ai ai+bi


ai aj, jS\{i}
bi bj, jS\{i}

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 }

g(S,t) aSi
j los
ai dos
g(S\primeros trabajos
{j ,i},bi bj ai aj fueran je
max{t,aj 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).

También podría gustarte