Você está na 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.
El objetivo es llenar la mochila, de capacidad C,
de manera que se maximice el beneficio.
maximizar bi xi
1i n

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 (ces
g
Si ) el beneficio (o ganancia total) de una
solucin ptima de mochila(j,n,c), entonces



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,

n 1 (c ) 0, para cualquier capacidad c
g

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 atrs.)
El problema de la mochila 0-1

Ecuacin de recurrencia hacia atrs:



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



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,

0 (c ) 0, para cualquier capacidad c
g

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 clculo


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 grande:
g j (c )
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
deben almacenan en una tabla.

g j (c )
Matriz nC cuyo elemento (j,c) almacena
Para el ejemplo anterior:
n=3 C=15
(b1,b2,b3)=(38,40,24)
(p1,p2,p3)=(9,6,5)

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
p1 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



g j (c ) max g j 1(c), g j 1(c p j ) b j

El problema de la mochila 0-1
goritmomochila(entp,b:vect[1..n]denat;
goritmomochila(entp,b:vect[1..n]denat;
entCap:nat;
entCap:nat;
salg:vect[0..n,0..Cap]denat)
salg:vect[0..n,0..Cap]denat)
riablesc,j:nat
riablesc,j:nat
incipio
incipio
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
nn
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:
goritmoobjetos(entp,b:vect[1..n]denat;
lgoritmoobjetos(entp,b:vect[1..n]denat;
entCap:nat;
entCap:nat;
entg:vect[0..n,0..Cap]denat)
entg:vect[0..n,0..Cap]denat)
incipio
rincipio
test(n,Cap)
test(n,Cap)
n
in

ritmotest(entj,c:nat)
oritmotest(entj,c:nat)
cipio
ncipio
j>0entonces
ij>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
i
si
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 destino, d,
respectivamente.

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

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 v , 0jn, en cada etapa i,


i,j
2ir.
Las etapas 1 y r+1 tienen un vrtice, o=v
1,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
max { Nr , p }.
tienen asignado un coste 0p n j
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{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
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

oritmomultietapa(entG=(V,A,c):grafo;
oritmomultietapa(entG=(V,A,c):grafo;
entk,n:nat;
entk,n:nat;
salP:vect[1..k]de1..n)
salP:vect[1..k]de1..n)
vrticesestnnumeradosdeformaquelos
svrticesestnnumeradosdeformaquelos
icesdelosvrticesdeunaetapasonmayores
dicesdelosvrticesdeunaetapasonmayores
losndicesdelosdelaetapaanterior.
elosndicesdelosdelaetapaanterior.
primerndicedeC*yD,quesloidentificaba
primerndicedeC *
yD,quesloidentificaba
etapa,sehasuprimido.}
etapa,sehasuprimido.}
iablesC:vect[1..n]dereal;
iablesC:vect[1..n]dereal;
D:vect[1..n]de1..n;
D:vect[1..n]de1..n;
j,r:1..n
j,r:1..n
ncipio
ncipio
[n]:=0.0;
[n]:=0.0;{ClculodeC
{ClculodeCyD}
*
*
yD}
araj:=n1descendiendohasta1hacer
araj:=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
para;
para;
[1]:=1;P[k]:=n;
[1]:=1;P[k]:=n;{Construccindelcamino}
{Construccindelcamino}
araj:=2hastak1hacer
araj:=2hastak1hacer
P[j]:=D[P[j1]]
P[j]:=D[P[j1]]
para
para
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
oritmomultietapaB(entG=(V,A,c):grafo;
oritmomultietapaB(entG=(V,A,c):grafo;
entk,n:nat;
entk,n:nat;
salP:vect[1..k]de1..n)
salP:vect[1..k]de1..n)
vrticesestnnumeradosdeformaquelos
svrticesestnnumeradosdeformaquelos
icesdelosvrticesdeunaetapasonmayores
dicesdelosvrticesdeunaetapasonmayores
losndicesdelosdelaetapaanterior.
elosndicesdelosdelaetapaanterior.
primerndicedeC*yD,quesloidentificaba
primerndicedeC *
yD,quesloidentificaba
etapa,sehasuprimido.}
etapa,sehasuprimido.}
iablesC:vect[1..n]dereal;
iablesC:vect[1..n]dereal;
D:vect[1..n]de1..n;
D:vect[1..n]de1..n;
j,r:1..n
j,r:1..n
ncipio
ncipio
[1]:=0.0;
[1]:=0.0;{ClculodeC
{ClculodeCyD}
*
*
yD}
araj:=2hastanhacer
araj:=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
para;
para;
[1]:=1;P[k]:=n;
[1]:=1;P[k]:=n;{Construccindelcamino}
{Construccindelcamino}
araj:=k1descendiendohasta2hacer
araj:=k1descendiendohasta2hacer
P[j]:=D[P[j+1]]
P[j]:=D[P[j+1]]
para
para

ta: 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 M1M2L 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 ABCD, de


las matrices A(135), B(589), C(893) y D(334).
n multip.
(( AB)C)D) 10582
( 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 (M1M2L Mi ) (Mi 1Mi 2L Mn )


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
M1M2L Mi y Mi1Mi 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 parte Mi 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 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: mi ,i s min (mik mk 1,i s di 1dkdi s ) ,
i ki s 1

para i 1, 2,K ,n s

El
Mitercer
Mi 1Lcaso Mi s representa que para calcular
se intentan todas las
(Mi Mi 1L Mk ) (Mk 1Mk 2L Mi s )
posibilidades
y se escoge la mejor.
De forma ms compacta:
0, si i j
mij min { mik mk 1, j di 1dkd j } , 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.
Para s=2:
m13 min(m11 m23 13 5 3, m 12 m33 13 89 3)
min(1530,9256) 1530
m24 min(m22 m34 5 89 34 , m 23 m44 5 3 34)
min(24208,1845) 1845

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


{k 2} m 12 m34 13 89 34 ,
{k 3} m 13 m44 13 3 34)
min(4055, 54201, 2856) 2856

j 1 2 3 4
La matriz es: i 1 0 5785 1530 2856
s3
2 0 1335 1845
s2
3 0 9078
s 1
4 0
s 0
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

goritmoparentOpt(entd:vect[0..n]denat;
goritmoparentOpt(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)
eslamatriz[mij]definidaantes;
eslamatriz[m ij]definidaantes;
[i,j]guardaelndicekparaelquesealcanza
m[i,j]guardaelndicekparaelquesealcanza
mnimoalcalcularm[i,j].}
lmnimoalcalcularm[i,j].}
riablesi,r,j,k,q:nat;
riablesi,r,j,k,q:nat;
incipio
incipio
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
nn
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 que la
Mi Mi 1L M jparte el
divisin ptima de
producto entre Mk y Mk+1.
Por tanto:

uncinmultSec(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
ariablesX,Y:matriz
variablesX,Y:matriz
rincipio
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
in
fin
Caminos mnimos entre todos
los pares de nodos de un grafo
.W. Floyd:
Algorithm 97: Shortest path,
ommunications 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.
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:

1 kn

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

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)
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
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 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 10
i 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 (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 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 c j 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 (m j )
1 j i
sujeto a cjm j 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.
Se cumple el principio de optimalidad y

f n (c) max
1mn un
n (mn ) 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 )
1mi ui

f 0 (x) 1, para todo x , 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 de los vrtices restantes
(circuito hamiltoniano).

Ms vueltas!
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

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 2
(n 1) 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
k 1
k
n2 2n

r
r
Puesto que k r 2
k r 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)


El problema del viajante de
comercio

Para hacernos una idea del coste

nmero de tiempo tiempo espacio


vrtices fuerza bruta prog. dinmica prog. dinmica
n n! n2 2n 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-1)!)


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)
P2 T22 T21
P3 T32 31 T
La planificacin (b) se dice no apropiativa (non-
preemptive) 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.
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 f i (S)
1i n

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


define como:
1
MFT(S) f i (S)
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:

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

Pero: tij b j max{bi max{t ai ,0} a j ,0}

b j bi a j max{ max{t ai ,0} ,a j bi }

b j bi a j max{t ai ,a j bi ,0}

b j bi a j ai max{t ,ai a j bi ,ai }

Si los dos primeros trabajos fueran j e i:

g(S,t) a j ai g (S \{ j ,i} ,bi b j ai a j max{t ,a j ai b j ,a j })


Planificacin de trabajos

Entonces:
g (S,t) g (S,t)
max{t ,ai a j bi ,ai } max{t ,a j ai b j ,a j }

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


precisa:

max{ai a j bi ,ai } max{a j ai b j ,a j }

Es decir:

ai a j max{ bi , a j } a j ai max{b j , ai }
O sea:

min{bi ,a j } min{b j ,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).

Você também pode gostar