Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2-Algoritmos Voraces
2-Algoritmos Voraces
v
v
v
v
v
v
v
v
v
v
v
2
8
16
Coloreado de grafos
El problema del viajante de comercio
89
92
J. Campos - C.P.S.
38
54
57
65
69
73
83
89
El esquema voraz:
Introduccin y primer ejemplo
v
v
Ejemplos:
encontrar la secuencia ptima para procesar un
conjunto de tareas por un computador,
hallar un camino mnimo en un grafo,
problema de la mochila,
J. Campos - C.P.S.
El esquema voraz:
Introduccin y primer ejemplo
v
J. Campos - C.P.S.
El esquema voraz:
Introduccin y primer ejemplo
v
Esquema genrico:
funcin
funcin voraz(C:conjunto)
voraz(C:conjunto)
devuelve
devuelve conjunto
conjunto
{C
{C es
es el
el conjunto
conjunto de
de todos
todos los
los candidatos}
candidatos}
principio
principio
S:=;
S:=; {S
{S es
es el
el conjunto
conjunto en
en el
el que
que se
se
construye
construye la
la solucin}
solucin}
mq
mq solucin(S)
solucin(S) CC hacer
hacer
x:=elemento
x:=elemento de
de CC que
que
maximiza
maximiza seleccionar(x);
seleccionar(x);
C:=C-{x};
C:=C-{x};
si
si completable(S
completable(S{x})
{x})
entonces
entonces S:=S
S:=S{x}
{x}
fsi
fsi
fmq;
fmq;
si
si solucin(S)
solucin(S)
entonces
entonces devuelve
devuelve SS
sino
sino devuelve
devuelve no
no hay
hay solucin
solucin
fsi
fsi
fin
fin
J. Campos - C.P.S.
El esquema voraz:
Introduccin y primer ejemplo
v
J. Campos - C.P.S.
El esquema voraz:
Introduccin y primer ejemplo
v
Solucin:
tipo
tipo moneda=(M25,M10,M5,M1)
moneda=(M25,M10,M5,M1)
{por
{por ejemplo}
ejemplo}
funcin
funcin cambia(importe:nat;
cambia(importe:nat;
valor:vector[moneda]
valor:vector[moneda] de
de nat)
nat)
devuelve
devuelve vector[moneda]
vector[moneda] de
de nat
nat
variable
variable mon:moneda;
mon:moneda;
cambio:vector[moneda]
cambio:vector[moneda] de
de nat
nat
principio
principio
para
para todo
todo mon
mon en
en moneda
moneda hacer
hacer
cambio[mon]:=0
cambio[mon]:=0
fpara;
fpara;
para
para mon:=M25
mon:=M25 hasta
hasta M1
M1 hacer
hacer
mq
mq valor[mon]
valor[mon]importe
importe hacer
hacer
cambio[mon]:=cambio[mon]+1;
cambio[mon]:=cambio[mon]+1;
importe:=importe-valor[mon]
importe:=importe-valor[mon]
fmq
fmq
fpara;
fpara;
devuelve
devuelve cambio
cambio
fin
fin
J. Campos - C.P.S.
El esquema voraz:
Introduccin y primer ejemplo
v
J. Campos - C.P.S.
El problema de la mochila
v
v
v
v
J. Campos - C.P.S.
El problema de la mochila
v
Formalmente:
maximizar
sujeto a
b ixi
(1)
pixi C
(2)
1in
1in
v
v
v
(3)
J. Campos - C.P.S.
El problema de la mochila
v
Ejemplo:
n=3
C=17
(b1,b2,b3)=(40,36,22)
(p1,p2,p3)=(15,12,8)
J. Campos - C.P.S.
(x1,x2,x3)
bixi
1i3
(i) (1,1/6,0)
(ii) (0,3/4,1)
(iii) (0,1,5/8)
46
49
4975
El problema de la mochila
v
Solucin voraz:
El conjunto de candidatos son los objetos,
tomndose de ellos cierta fraccin.
Un conjunto de candidatos es completable si la
suma de sus pesos no supera la capacidad de la
mochila, y es una solucin si iguala dicha
capacidad.
La funcin objetivo a maximizar es bixi.
1in
J. Campos - C.P.S.
El problema de la mochila
Cul es el mejor candidato (es decir, la mejor
funcin de seleccin)?
Volvamos al ejemplo:
u Primera estrategia: elegir el objeto con
mayor beneficio total (el primero).
Sin embargo, la mochila se llena muy
rpidamente con poco beneficio total.
u Segunda estrategia: elegir el objeto que llene
menos la mochila, para acumular beneficios
de un nmero mayor de objetos. Sin
embargo, es posible que se elija un objeto
con poco beneficio simplemente porque
pesa poco.
u La tercera estrategia, que es la ptima, es
tomar siempre el objeto que proporcione
mayor beneficio por unidad de peso.
Los algoritmos resultantes de aplicar cualquiera
de las dos primeras estrategias tambin son
voraces, pero no calculan la solucin ptima.
J. Campos - C.P.S.
El problema de la mochila
constante
constante n=...
n=... {nmero
{nmero de
de objetos}
objetos}
tipo
tipo vectReal=vector[1..n]
vectReal=vector[1..n] de
de real
real
{Pre:
{Pre: i1..n:peso[i]>0
i1..n:peso[i]>0
i1..n-1:benef[i]/peso[i]benef[i+1]/peso[i+1]}
i1..n-1:benef[i]/peso[i]benef[i+1]/peso[i+1]}
funcin
funcin mochila(benef,peso:vectReal;
mochila(benef,peso:vectReal;
cap:real)
cap:real) devuelve
devuelve vectReal
vectReal
variables
variables resto:real;
resto:real; i:entero;
i:entero;
sol:vectReal
sol:vectReal
principio
principio
para
para todo
todo ii en
en 1..n
1..n hacer
hacer
sol[i]:=0.0
sol[i]:=0.0 {inicializar
{inicializar solucin}
solucin}
fpara;
fpara;
resto:=cap;
resto:=cap; {capacidad
{capacidad restante}
restante}
i:=1;
i:=1;
mq
mq (i
(in)
n) and
and (peso[i]
(peso[i]resto)
resto) hacer
hacer
sol[i]:=1;
sol[i]:=1;
resto:=resto-peso[i];
resto:=resto-peso[i];
i:=i+1
i:=i+1
fmq;
fmq;
si
si iinn entonces
entonces sol[i]:=resto/peso[i]
sol[i]:=resto/peso[i] fsi;
fsi;
devuelve
devuelve sol
sol
fin
fin
{Post:
{Post: sol
sol es
es solucin
solucin ptima
ptima del
del problema
problema de
de
la
mochila}
la mochila}
J. Campos - C.P.S.
El problema de la mochila
v
Demostracin de la correccin:
Sea X=(x1,,xn) la solucin generada por el
algoritmo voraz.
Si todos los xi son iguales a 1, la solucin es
claramente ptima.
Luego, sea j el menor ndice tal que xj1. Por
tanto xi=1 para 1i<j, xi=0 para j<in, y 0xj<1.
Si X no es ptima entonces existe otra solucin
factible Y=(y1,,yn) tal que biyi > bix i.
Sin perdida de generalidad, asumimos que
piyi =C.
Sea k el menor ndice tal que ykxk (claramente,
existe ese k).
Se verifica: yk<xk . En efecto:
u Si k<j entonces xk=1. Pero yk xk luego yk<xk .
u
J. Campos - C.P.S.
El problema de la mochila
Ahora, supongamos que aumentamos yk hasta xk
y disminumos tantos (yk+1,,yn) como sea
necesario para que la capacidad utilizada siga
siendo C.
Se obtiene as una nueva solucin Z=(z1,,zn)
con zi=xi, para 1ik y k<in p i(yi -zi)=pk(zk-yk).
Entonces:
1in
J. Campos - C.P.S.
12
5
21
12
5
21
J. Campos - C.P.S.
Representaciones de grafos:
Matriz de adyacencia
Grafo dirigido G=(V,A) con V={1,2,,n}.
La matriz de adyacencia para G es una matriz A
de dimensiones n n de elementos booleanos en
la que A[i,j] es verdad si y slo si existe una
arista en G que va del vrtice i al vrtice j.
constante
constante nn == ...
... {cardinal
{cardinal de
de V}
V}
tipo
tipo grafo
grafo ==
== vector[1..n,1..n]de
vector[1..n,1..n]de booleano
booleano
1
A =
falso
verdad
falso
verdad
falso
verdad
falso
falso
falso
Grafo
dirigido
Matriz de adyacencia
J. Campos - C.P.S.
Listas de adyacencia
Esta representacin sirve para mejorar la
eficiencia de los algoritmos sobre grafos que
necesitan acceder a los vrtices sucesores a uno
dado.
Consiste en almacenar n listas enlazadas
mediante punteros de forma que la lista i-sima
contiene los vrtices sucesores del vrtice i.
constante
constante nn == ...
... {cardinal
{cardinal de
de V}
V}
tipos
tipos ptNodo
ptNodo == nodo;
nodo;
nodo
nodo == registro
registro
vrtice:1..n;
vrtice:1..n;
sig:ptNodo
sig:ptNodo
freg
freg
grafo
grafo == vector[1..n]
vector[1..n] de
de ptNodo
ptNodo
1
2 nil
2
1
2
3 nil
3 nil
J. Campos - C.P.S.
Grafo
dirigido
J. Campos - C.P.S.
1
2
3
1 nil
2 nil
1 2 3
1 2 nil nil
Grafo dirigido
1
2
3 nil
2 1 nil
2 3 nil nil
Listas de adyacencia
J. Campos - C.P.S.
J. Campos - C.P.S.
1
2
3
nil
nil
nil
nil
Grafo no dirigido
Listas de adyacencia
1
1
2
3
4
nil
nil
nil nil
J. Campos - C.P.S.
J. Campos - C.P.S.
Utilidad:
el grafo representa una distribucin geogrfica,
donde las aristas dan el coste (precio, distancia...)
de la conexin entre dos lugares y se desea
averiguar el camino ms corto (barato...) para
llegar a un punto partiendo de otro
J. Campos - C.P.S.
J. Campos - C.P.S.
funcin
funcin Dijkstra(g:grafo;
Dijkstra(g:grafo; v:vrt)
v:vrt)
devuelve
vector[vrt]
devuelve vector[vrt] de
de etiq
etiq
variables
variables S:cjtVrt;
S:cjtVrt;
D:vector[vrt]
D:vector[vrt] de
de etiq
etiq
principio
principio
wvrt:D[w]:=etiqueta(g,v,w);
wvrt:D[w]:=etiqueta(g,v,w);
D[v]:=0;
D[v]:=0; S:={v};
S:={v};
mq
mq SS no
no contenga
contenga todos
todos los
los vrtices
vrtices hacer
hacer
{D
{D contiene
contiene caminos
caminos mnimos
mnimos formados
formados ntegrantegramente
mente por
por nodos
nodos de
de SS (excepto
(excepto el
el ltimo),
ltimo), yy
los
los nodos
nodos de
de SS corresponden
corresponden aa los
los caminos
caminos mmnimos
ms
cortos
calculados
hasta
el
momento}
nimos ms cortos calculados hasta el momento}
elegir
elegir wS
wS t.q.
t.q. D[w]
D[w] es
es mnimo;
mnimo;
S:=S{w};
S:=S{w};
uS:actualizar
uS:actualizar dist.mn.
dist.mn. comprobando
comprobando
si
si por
por ww hay
hay un
un atajo
atajo
fmq;
fmq;
devuelve
devuelve DD
fin
fin
{Post:
{Post: D=caminosMnimos(g,v)}
D=caminosMnimos(g,v)}
J. Campos - C.P.S.
Correccin:
Apuntes de la asignatura de Matemtica Discreta
o buscar en bibliografa.
J. Campos - C.P.S.
funcin
funcin Dijkstra(g:grafo;
Dijkstra(g:grafo; v:vrt)
v:vrt)
devuelve
devuelve vector[vrt]
vector[vrt] de
de etiq
etiq
variables
variables T:cjtVrt;
T:cjtVrt;
D:vector[vrt]
D:vector[vrt] de
de etiq;
etiq;
u,w:vrt;
u,w:vrt; val:etiq
val:etiq
principio
principio
T:=;
T:=;
para
para todo
todo ww en
en vrt
vrt hacer
hacer
D[w]:=etiqueta(g,v,w);
D[w]:=etiqueta(g,v,w); T:=T{w}
T:=T{w}
fpara;
fpara;
D[v]:=0;
D[v]:=0; T:=T-{v};
T:=T-{v};
repetir
n-2
repetir n-2 veces
veces {quedan
{quedan n-1
n-1 caminos
caminos por
por
determinar}
determinar}
{seleccin
{seleccin del
del mn.w:
mn.w: wwTT uuT:D[w]D[u]}
T:D[w]D[u]}
val:=;
val:=;
para
para todo
todo uu en
en TT hacer
hacer
si
si D[u]
D[u]val
val ent
ent w:=u;
w:=u; val:=D[u]
val:=D[u] fsi
fsi
{siempre
{siempre hay
hay un
un nodo
nodo que
que cumple
cumple la
la condic}
condic}
fpara;
fpara;
...
...
J. Campos - C.P.S.
T:=T-{w};
T:=T-{w};
{se
{se recalculan
recalculan las
las nuevas
nuevas dist.
dist. mnimas}
mnimas}
para
para todo
todo uu en
en TT hacer
hacer
si
si D[w]+etiqueta(g,w,u)<D[u]
D[w]+etiqueta(g,w,u)<D[u]
ent
ent D[u]:=D[w]+etiqueta(g,w,u)
D[u]:=D[w]+etiqueta(g,w,u)
fsi
fsi
fpara
fpara
frepetir;
frepetir;
devuelve
devuelve DD
fin
fin
{Post:
{Post: D=caminosMnimos(g,v)
D=caminosMnimos(g,v)
J. Campos - C.P.S.
Tiempo de ejecucin:
se supone que las operaciones sobre cjtos. estn
implementadas en tiempo constante, excepto la
creacin (p.ej., mediante un vector de booleanos)
fase de inicializacin:
u creacin del cjto. y ejecucin n veces de
diversas operaciones constantes: (n)
fase de seleccin:
u las instrucciones del interior del bucle son
(1)
u n de ejecuciones del bucle:
1 vuelta: se consultan n-1 vrtices,
2 vuelta: n-2, etc.
(el cardinal de T decrece en 1 en cada paso)
n de ejecuciones: n(n-1)/2-1 (n2)
fase de marcaje:
u n supresiones a lo largo del algoritmo: (n)
fase de reclculo de las distancias mnimas:
u queda (n2) por igual razn que la seleccin
Coste total: (n2)
J. Campos - C.P.S.
J. Campos - C.P.S.
etiq
valor: cpa vrt etiq
est?:
est?: cpa
cpa vrt
vrt
bool
bool
vaca?:
vaca?: cpa
cpa
bool
bool
(1)
(1)
(log
(logn)
n)
(1)
(1)
(log
(logn)
n)
(log
(logn)
n)
(1)
(1)
(1)
(1)
(1)
(1)
<4,20>
<3,75>
<5,60>
el valor de la etiqueta
significa que el vrtice
no est en la cola
<2,>
J. Campos - C.P.S.
funcin
funcin Dijkstra(g:grafo;
Dijkstra(g:grafo; v:vrt)
v:vrt)
devuelve
devuelve vector[vrt]
vector[vrt] de
de etiq
etiq
variables
variables A:cpa;
A:cpa; {cola
{cola de
de aristas
aristas con
con prior.}
prior.}
D:vector[vrt]
D:vector[vrt] de
de etiq;
etiq;
u,w:vrt;
u,w:vrt; et,val:etiq
et,val:etiq
principio
principio
{crear
{crear la
la cola
cola con
con todas
todas las
las aristas
aristas <v,w>}
<v,w>}
creaVaca(A);
creaVaca(A);
para
para todo
todo ww en
en vrt
vrt hacer
hacer
inserta(A,w,etiqueta(g,v,w))
inserta(A,w,etiqueta(g,v,w))
fpara;
fpara;
mq
mq not
not esVaca(A)
esVaca(A) hacer
hacer
<w,val>:=primero(A);
<w,val>:=primero(A);{selecc.
{selecc. arista
arista mn.}
mn.}
D[w]:=val;
D[w]:=val; borra(A);
borra(A);{marca
{marca ww como
como tratado}
tratado}
{se
{se recalculan
recalculan las
las nuevas
nuevas dist.
dist. mnimas}
mnimas}
para
para todo
todo <u,et>
<u,et> en
en suc(g,w)
suc(g,w) hacer
hacer
si
si est(A,u)
est(A,u) entonces
entonces
si
si val+et<valor(A,u)
val+et<valor(A,u)
ent
ent sustituye(A,u,val+et)
sustituye(A,u,val+et)
fsi
fsi
fsi
fsi
fpara
fpara
fmq;
fmq;
D[v]:=0;
D[v]:=0; devuelve
devuelve DD
fin
fin
{Post:
{Post: D=caminosMnimos(g,v)}
D=caminosMnimos(g,v)}
J. Campos - C.P.S.
Eficiencia temporal:
inicializacin: (nlog n)
seleccin y supresin: (nlog n)
bucle interno: examina todas las aristas del grafo
y en el caso peor efecta una sustitucin por
arista, por tanto: (alog n)
J. Campos - C.P.S.
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
v
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
v
Terminologa:
rbol libre:
es un grafo no dirigido conexo acclico
u
u
u
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
v
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
{Pre:
{Pre: gg es
es un
un grafo
grafo no
no dirigido
dirigido conexo
conexo
etiquetado
no
negativamente}
etiquetado no negativamente}
funcin
funcin Prim(g:grafo)
Prim(g:grafo) devuelve
devuelve grafo
grafo
variables
variables U:cjtVrt;
U:cjtVrt; gsol:grafo;
gsol:grafo;
u,v:vrt;
u,v:vrt; x:etiq
x:etiq
principio
principio
creaVaco(gsol);
creaVaco(gsol); U:={cualquier
U:={cualquier vrtice};
vrtice};
mq
mq UU no
no contenga
contenga todos
todos los
los vrt.
vrt. hacer
hacer
seleccionar
seleccionar <u,v,x>
<u,v,x> mnima
mnima t.q.
t.q. uuU;v
U;vUU
aade(gsol,u,v,x);
aade(gsol,u,v,x); U:=U
U:=U{v}
{v}
fmq;
fmq;
devuelve
devuelve gsol
gsol
fin
fin
{Post:
{Post: gsolarm(g)}
gsolarm(g)}
Coste: (na)
(es decir, (n3) si el grafo es denso)
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
v
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
{Pre:
{Pre: gg es
es un
un grafo
grafo no
no dirigido
dirigido conexo
conexo
etiquetado
no
negativamente}
etiquetado no negativamente}
funcin
funcin Prim(g:grafo)
Prim(g:grafo) devuelve
devuelve grafo
grafo
variables
variables
arisMn:vector[vrt]
arisMn:vector[vrt] de
de <vrt,etiq>;
<vrt,etiq>;
gsol:grafo;
gsol:grafo; prim,mn,v,w:vrt;
prim,mn,v,w:vrt; x:etiq
x:etiq
principio
principio
{inicializacin
{inicializacin del
del resultado}
resultado}
prim:=unVrticeCualquiera;
prim:=unVrticeCualquiera;
arisMn[prim]:=<prim,
arisMn[prim]:=<prim,>;
>;
para
para todo
todo vv en
en vrt
vrt hacer
hacer
arisMn[v]:=<prim,etiqueta(g,prim,v)>
arisMn[v]:=<prim,etiqueta(g,prim,v)>
fpara;
fpara;
{a
{a continuacin
continuacin se
se aplica
aplica el
el mtodo}
mtodo}
creaVaco(gsol);
creaVaco(gsol);
hacer
hacer n-1
n-1 veces
veces
mn:=prim;
mn:=prim; {centinela:
{centinela: arisMn[mn].et=}
arisMn[mn].et=}
para
para todo
todo vv en
en vrt
vrt hacer
hacer
<w,x>:=arisMn[v];
<w,x>:=arisMn[v];
si
si x<arisMn[mn].et
x<arisMn[mn].et
ent
ent mn:=v
mn:=v {como
{como mnimo
mnimo habr
habr uno}
uno}
fsi;
fsi;
fpara;
fpara;
...
...
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
...
...
{a
{a continuacin
continuacin se
se aade
aade aa la
la solucin}
solucin}
aade(gsol,mn,arisMn[mn].v,
aade(gsol,mn,arisMn[mn].v,
arisMn[mn].et);
arisMn[mn].et);
{se
{se aade
aade mn
mn al
al conjunto
conjunto de
de vrtices
vrtices tratados}
tratados}
arisMn[mn]:=<mn,
arisMn[mn]:=<mn,>;
>;
{se
{se reorganiza
reorganiza el
el vector
vector comprobando
comprobando si
si la
la
arista
mnima
de
los
vrtices
todava
no
arista mnima de los vrtices todava no
tratados
tratados los
los conecta
conecta aa mn}
mn}
para
para todo
todo <v,x>
<v,x> en
en
adyacentes(g,mn)
adyacentes(g,mn) hacer
hacer
si
si (arisMn[v].v
(arisMn[v].vv)and(x<arisMn[v].et)
v)and(x<arisMn[v].et)
entonces
arisMn[v]:=<mn,x>
entonces arisMn[v]:=<mn,x> fsi
fsi
fpara
fpara
frepetir;
frepetir;
devuelve
devuelve gsol
gsol
fin
fin
{Post:
{Post: gsolarm(g)}
gsolarm(g)}
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
v
Eficiencia temporal:
inicializacin: lineal en caso de matriz de
adyacencia y cuadrtica en caso de listas
bucle principal:
u el bucle de seleccin: (n)
u el aadido de una arista al grafo: constante
usando matriz, lineal usando listas
u el bucle de reorganizacin:
con matriz de adyacencia: el clculo de los
adyacentes es (n) y el coste total queda (n2)
con listas: el coste total es (a+n)
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
J.B. Kruskal: On the shortest spanning subtree of a graph
and the traveling salesman problem, Proceedings of the
American Mathematical Society, 7, pp. 48-50, 1956.
Algoritmo de Kruskal:
Se basa tambin en la propiedad de los rboles
de recubrimiento de coste mnimo:
Partiendo del rbol vaco, se selecciona en cada
paso la arista de menor etiqueta que no
provoque ciclo sin requerir ninguna otra
condicin sobre sus extremos.
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
{Pre:
{Pre: gg es
es un
un grafo
grafo no
no dirigido
dirigido conexo
conexo
etiquetado
no
negativamente}
etiquetado no negativamente}
funcin
funcin Kruskal(g:grafo)
Kruskal(g:grafo) devuelve
devuelve grafo
grafo
variables
variables gsol:grafo;
gsol:grafo;
u,v:vrt;
u,v:vrt; x:etiq
x:etiq
principio
principio
creaVaco(gsol);
creaVaco(gsol);
mq
mq gsol
gsol no
no sea
sea conexo
conexo hacer
hacer()
seleccionar
seleccionar <u,v,x>
<u,v,x> mnima
mnima no
no examinada;
examinada;
si
si no
no provoca
provoca ciclo
ciclo
entonces
entonces aade(gsol,u,v,x)
aade(gsol,u,v,x)
fsi
fsi
fmq;
fmq;
devuelve
devuelve gsol
gsol
fin
fin
{Post:
{Post: gsolarm(g)}
gsolarm(g)}
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
v
Implementacin eficiente:
En cada momento, los vrtices que estn dentro
de una componente conexa en la solucin
forman una clase de equivalencia, y el algoritmo
se puede considerar como la fusin continuada
de clases hasta obtener una nica componente
con todos los vrtices del grafo.
A
50
30
40 40
C
10 20
50
60
{[A,B],[C,D,E]}
{[A,B,C,D,E]}
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
v
gnero
gnero rev
rev {relac.
{relac. de
de equiv.
equiv. sobre
sobre vrt.}
vrt.}
operaciones
operaciones
creaREV:
creaREV:
rev
rev {cada
{cada vrt.
vrt. una
una clase}
clase}
clase:
rev
vrt
nat
clase: rev vrt nat
fusiona:
fusiona: rev
rev nat
nat nat
nat
rev
rev
numClases:
numClases: rev
rev
nat
nat
Implementacin asintticamente ptima:
u basada en una representacin del tipo rev
usando rboles y una tcnica de compresin
de caminos [AHU88, pp. 182-191]
u el coste de creaREV es lineal
u el coste de numClases es constante
u el coste de k ejecuciones combinadas de
fusiona y clase es (k(k,n)), lo cual es
prcticamente constante, porque
es una funcin inversa de la
funcin de Ackerman que crece MUY
despacio ((k,n)4, para todos los valores de
k y n imaginables)
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
{Pre:
{Pre: gg es
es un
un grafo
grafo no
no dirigido
dirigido conexo
conexo
etiquetado
no
negativamente}
etiquetado no negativamente}
funcin
funcin Kruskal(g:grafo)
Kruskal(g:grafo) devuelve
devuelve grafo
grafo
variables
variables T:cpa;
T:cpa; gsol:grafo;
gsol:grafo;
u,v:vrt;
u,v:vrt; x:etiq;
x:etiq;
C:rev;
C:rev; ucomp,vcomp:nat
ucomp,vcomp:nat
principio
principio
creaREV(C);
creaREV(C); {cada
{cada vrt.
vrt. forma
forma una
una clase}
clase}
creaVaco(gsol);
creaVaco(gsol); creaVaca(T);
creaVaca(T);
{se
{se colocan
colocan todas
todas las
las aristas
aristas en
en la
la cola}
cola}
para
para todo
todo vv en
en vrt
vrt hacer
hacer
para
para todo
todo <u,x>
<u,x> en
en adyacentes(g,v)
adyacentes(g,v) hacer
hacer
inserta(T,v,u,x)
inserta(T,v,u,x)
fpara
fpara
fpara;
fpara;
...
...
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
...
...
mq
mq numClases(C)>1
numClases(C)>1 hacer
hacer
{obtener
{obtener yy elim.
elim. la
la arista
arista mn.de
mn.de la
la cola}
cola}
<u,v,x>:=primero(T);
<u,v,x>:=primero(T); borra(T);
borra(T);
{si
{si la
la arista
arista no
no provoca
provoca ciclo
ciclo se
se aade
aade aa la
la
solucin
solucin yy se
se fusionan
fusionan las
las clases
clases corresp.}
corresp.}
ucomp:=clase(C,u);
ucomp:=clase(C,u); vcomp:=clase(C,v);
vcomp:=clase(C,v);
si
si ucomp
ucompvcomp
vcomp entonces
entonces
fusiona(C,ucomp,vcomp);
fusiona(C,ucomp,vcomp);
aade(gsol,u,v,x)
aade(gsol,u,v,x)
fsi
fsi
fmq;
fmq;
devuelve
devuelve gsol
gsol
fin
fin
{Post:
{Post: gsolarm(g)}
gsolarm(g)}
J. Campos - C.P.S.
rboles de recubrimiento de
coste mnimo
v
J. Campos - C.P.S.
Consideraciones sobre la
correccin del esquema voraz
v
J. Campos - C.P.S.
Consideraciones sobre la
correccin del esquema voraz
v
J. Campos - C.P.S.
Consideraciones sobre la
correccin del esquema voraz
v
Subestructura ptima:
Un problema posee una subestructura ptima si
una solucin ptima de ese problema incluye
soluciones ptimas de subproblemas.
J. Campos - C.P.S.
Cdigos de Huffman
D.A. Huffman: A method for the construction of
minimum-redundancy codes,
Proceedings of the IRE, 40(9), pp. 1098-1101, 1952.
v
v
Los cdigos de Huffman son una tcnica muy til para comprimir ficheros.
El algoritmo voraz de Huffman utiliza
una tabla de frecuencias de aparicin
de cada carcter para construir una
forma ptima de representar los
caracteres con cdigos binarios.
Ejemplo:
Se tiene un fichero con 100.000 caracteres que se
desea compactar. Las frecuencias de aparicin de
caracteres en el fichero son las siguientes:
a
b
c
d
e
f
frec. en miles 45
13
12
16
9
5
Puede usarse un cdigo de longitud fija (de 3
bits). El fichero requerira 300.000 bits.
a
b
c
d
e
f
cd.long.fija 000 001 010 011 100 101
J. Campos - C.P.S.
Cdigos de Huffman
Puede hacerse mejor con un cdigo de longitud
variable, dando codificaciones cortas a los
caracteres ms frecuentes y ms largas a los
menos frecuentes.
a
cd.long.var. 0
b
101
c
100
d
111
e
f
1101 1100
J. Campos - C.P.S.
Cdigos de Huffman
Ejemplo: rboles de los dos cdigos
anteriores.
100
86
14
0
58
28
100
a:45
14
55
1
25
30
a:45
b:13
c:12
d:16
e:9
f:5
c:12
b:13
d:16
14
0
f:5
e:9
J. Campos - C.P.S.
Cdigos de Huffman
v
J. Campos - C.P.S.
Cdigos de Huffman
{Pre:
{Pre: CC es
es un
un conjunto
conjunto de
de caracteres
caracteres yy ff es
es el
el
vector
de
frecuencias
de
esos
caracteres}
vector de frecuencias de esos caracteres}
funcin
funcin Huffman(C:conjunto;f:vectFrec)
Huffman(C:conjunto;f:vectFrec)
devuelve
devuelve rbol
rbol
variables
variables Q:colaPri;
Q:colaPri; i,fx,fy,fz:entero;
i,fx,fy,fz:entero;
z,x,y:rbol
z,x,y:rbol
principio
principio
creaVaca(Q);
creaVaca(Q);
para
para todo
todo xx en
en CC hacer
hacer
inserta(Q,<x,f[x]>)
inserta(Q,<x,f[x]>)
fpara;
fpara;
para
para i:=1
i:=1 hasta
hasta |C|-1
|C|-1 hacer
hacer
<x,fx>:=primero(Q);
<x,fx>:=primero(Q); borra(Q);
borra(Q);
<y,fy>:=primero(Q);
<y,fy>:=primero(Q); borra(Q);
borra(Q);
fz:=fx+fy;
fz:=fx+fy;
z:=crearbol(raz=>fz,
z:=crearbol(raz=>fz,
hijoIzq=>x;
hijoIzq=>x;
hijoDer=>y);
hijoDer=>y);
inserta(Q,<z,fz>)
inserta(Q,<z,fz>)
fpara;
fpara;
<z,fz>:=primero(Q);
<z,fz>:=primero(Q); borra(Q)
borra(Q)
devuelve
devuelve zz
fin
fin
{Post:
{Post: zz es
es el
el rbol
rbol de
de un
un cdigo
cdigo libre
libre de
de
prefijos
ptimo
para
(C,f)}
prefijos ptimo para (C,f)}
J. Campos - C.P.S.
Cdigos de Huffman
v
f:5
c:12
(1)
(3)
14
b:13
(2)
d:16
a:45
25
f:5
e:9
c:12
b:13
c:12
14
0
f:5
e:9
(5)
0
c:12
55
25
30
1
b:13
d:16
14
b:13
0
f:5
e:9
a:45
f:5
e:9
c:12
d:16
14
100
(6)
J. Campos - C.P.S.
a:45
30
25
(4)
a:45
d:16 a:45
55
1
25
30
0
1
b:13
d:16
14
0
f:5
e:9
Cdigos de Huffman
v
Coste temporal:
inicializacin de Q: (|C|) (ejercicio)
el interior del bucle: (log |C|)
J. Campos - C.P.S.
Cdigos de Huffman
Por tanto, el proceso de construir un rbol
ptimo mediante mezclas puede empezar, sin
prdida de generalidad, con la eleccin voraz de
mezclar los dos caracteres de menor frecuencia.
v
J. Campos - C.P.S.
El problema de la seleccin de
actividades
v
v
Es un problema de planificacin de
tareas (en ingls, scheduling).
Se tiene un conjunto S={1,2,,n} de
actividades (por ej., clases) que deben
usar un recurso (por ej., un aula) que
slo puede ser usado por una actividad
en cada instante.
Cada actividad i tiene asociado un
instante de comienzo ci y un instante de
finalizacin fi, tales que cifi, de forma
que la actividad i, si se realiza, debe
hacerse durante [ci,fi).
Dos actividades i, j se dicen compatibles si los intervalos [ci,fi) y [cj,fj) no se
superponen (i.e., (cifj)(cjfi)).
El problema de seleccin de actividades
consiste en seleccionar un conjunto de
actividades mutuamente compatibles
que tenga cardinal mximo.
J. Campos - C.P.S.
El problema de la seleccin de
actividades
constante
constante n=...
n=... {nmero
{nmero de
de actividades}
actividades}
tipo
tipo vectReal=vector[1..n]
vectReal=vector[1..n] de
de real
real
{Pre:
{Pre: i1..n:c[i]f[i]
i1..n:c[i]f[i] i1..n-1:f[i]f[i+1]}
i1..n-1:f[i]f[i+1]}
funcin
funcin selec(c,f:vectReal)devuelve
selec(c,f:vectReal)devuelve conjunto
conjunto
variables
variables i,j:entero;
i,j:entero; A:conjunto
A:conjunto
principio
principio
A:={1};
A:={1};
j:=1;
j:=1; {j
{j es
es la
la ltima
ltima actividad
actividad seleccionada}
seleccionada}
para
i:=2
hasta
n
hacer
para i:=2 hasta n hacer
si
si c[i]
c[i]f[j]
f[j]
entonces
entonces A:=A
A:=A{i};
{i}; j:=i
j:=i
fsi
fsi
fpara;
fpara;
devuelve
devuelve AA
fin
fin
{Post:
{Post: AA es
es solucin
solucin ptima
ptima del
del problema
problema de
de
la
la seleccin
seleccin de
de actividades.}
actividades.}
J. Campos - C.P.S.
El problema de la seleccin de
actividades
v
Demostracin de la correccin:
La actividad 1 tiene el primer instante de finalizacin. Veamos que existe una solucin ptima
que comienza con una seleccin voraz, es decir,
con la actividad 1.
Supongamos que AS es una solucin ptima y
que las actividades de A estn ordenadas por
tiempos de finalizacin. Supongamos que la
primera actividad de A es la actividad k.
Si k=1, entonces A empieza con una seleccin
voraz.
Si k1, veamos que existe otra solucin ptima B
que comienza con 1.
Sea B=A-{k}{1}. Como f1fk, las actividades
en B son disjuntas y como tiene el mismo
nmero de actividades que A entonces B es
tambin ptima.
J. Campos - C.P.S.
El problema de la seleccin de
actividades
Despus de la seleccin voraz de la actividad 1,
el problema se reduce a encontrar una solucin
ptima del problema de seleccin actividades
sobre las actividades de S que son compatibles
con la actividad 1.
Entonces, si A es una solucin ptima para el
problema original S, se tiene que A=A\{1} es
una solucin ptima para el problema
S={iS|cif1}.
En efecto, si existiera una solucin B para S
con ms actividades que A, aadiendo la
actividad 1 a B tendramos una solucin B
para S con ms actividades que A, en contra
de la optimalidad de A.
Por tanto, despus de cada seleccin voraz, nos
encontramos con otro problema de optimizacin
con igual forma que el problema original.
Por induccin sobre el nmero de selecciones, y
realizando una seleccin voraz en cada paso, se
obtiene una solucin ptima.
n
J. Campos - C.P.S.
v
v
i=1
T=
J. Campos - C.P.S.
Ejemplo:
3 clientes con t1=5, t2=10, t3=3.
orden
1 2 3:
1 3 2:
2 1 3:
2 3 1:
3 1 2:
3 2 1:
T
5+
5+
10 +
10 +
3+
3+
J. Campos - C.P.S.
(5+10) +
(5+3) +
(10+5) +
(10+3) +
(3+5) +
(3+10) +
(5+10+3)
(5+3+10)
(10+5+3)
(10+3+5)
(3+5+10)
(3+10+5)
= 38
= 31
= 43
= 41
= 29
= 34
ptimo
Estrategia voraz:
Atender en cada paso al cliente no
atendido con menor tiempo de servicio.
Demostracin de la correccin:
Sea I=(i1,i2,,in) una permutacin cualquiera de
los naturales {1,2,,n}.
Si se atiende a los clientes segn la secuencia I, el
tiempo total que los clientes estn en el sistema
es:
T(I) = ti1 + (ti1+ti2) + ((ti1+ti2)+ti3) +
= nti1 + (n-1)ti2 + (n-2)ti3 +
n
(n-k+1)t
k=1
ik
J. Campos - C.P.S.
(n-k+1)t
k=1
ik
ka,b
J. Campos - C.P.S.
J. Campos - C.P.S.
Ejemplos de matroides:
Dada una matriz de nmeros reales, sea S el
conjunto de sus vectores fila, y considerese que
un subconjunto de S es independiente si los
vectores que lo componen son linealmente independientes (en el sentido habitual).
Se llama matroide matricial y es el primero
que se estudi (H. Whitney, 1935).
Sea un grafo no dirigido G=(V,A).
Sea MG=(SG,IG), donde:
u SG=A (el conjunto de aristas).
u Si BA, entonces BIG si y slo si B es
acclico.
Se llama matroide grfico y est muy
relacionado con el clculo de rboles de
recubrimiento de coste mnimo.
J. Campos - C.P.S.
Si A es un subconjunto independiente
de un matroide M, se dice que A es
maximal si no tiene extensiones.
Teorema. Todos los subconjuntos
independientes maximales de un
matroide tienen el mismo cardinal.
(Dem.: muy fcil [CLR90].)
Ejemplo: Dado un grafo no dirigido y conexo G,
todo subconjunto independiente maximal de MG
es un rbol libre con |V|-1 aristas que conecta
todos los vrtices de G.
Ese rbol se llama rbol de recubrimiento de G.
J. Campos - C.P.S.
J. Campos - C.P.S.
Voracidad y matroides.
J. Campos - C.P.S.
{Pre:
{Pre: SS yy la
la funcin
funcin indep
indep definen
definen un
un matroide;
matroide;
ww es
una
funcin
de
peso
positiva
es una funcin de peso positiva sobre
sobre S}
S}
funcin
funcin voraz(S:conjunto)
voraz(S:conjunto) devuelve
devuelve conjunto
conjunto
variable
variable A:conjunto
A:conjunto
principio
principio
A:=;
A:=;
ordenar
ordenar SS por
por valores
valores no
no crecientes
crecientes de
de w;
w;
para
para todo
todo xx en
en SS tomado
tomado en
en orden
orden
no
no creciente
creciente de
de w(x)
w(x) hacer
hacer
si
si indep(A{x})
indep(A{x}) entonces
entonces A:=A{x}
A:=A{x} fsi
fsi
fpara;
fpara;
devuelve
devuelve AA
fin
fin
{Post:
{Post: AA es
es subconjunto
subconjunto ptimo
ptimo de
de (S,indep,w)}
(S,indep,w)}
J. Campos - C.P.S.
Eficiencia temporal:
Denotando |S| como n,
u fase de ordenacin: (nlog n)
u bucle: (n f(n)), suponiendo que el coste de
la funcin indep es (f(n))
Total: (nlog n + n f(n))
Correccin:
Teorema 17.10 en [CLR90, pp. 348-350]
(un par de pginas; sin gran dificultad).
J. Campos - C.P.S.
Utilidad fundamental:
Dados un problema y una
solucin voraz,
para demostrar la correccin de
esa solucin basta con
identificar una estructura
de matroide subyacente al
problema
J. Campos - C.P.S.
Resumen:
La teora de matroides no cubre todos los
problemas en los que el esquema voraz calcula la
solucin ptima.
Sin embargo cubre muchos casos interesantes
(por ej., rboles de recubrimiento de coste
mnimo).
Ms an, se ha demostrado que una estructura es
un matroide si y slo si el esquema voraz calcula
para ella una solucin ptima sea cual sea la
funcin de peso escogida (la demostracin puede
verse en [Koz92, pp. 13-18]).
La investigacin contina
J. Campos - C.P.S.
Un problema de planificacin
de tareas a plazo fijo
v
v
v
v
v
J. Campos - C.P.S.
Un problema de planificacin
de tareas a plazo fijo
v
J. Campos - C.P.S.
Un problema de planificacin
de tareas a plazo fijo
v
J. Campos - C.P.S.
Un problema de planificacin
de tareas a plazo fijo
v
v
J. Campos - C.P.S.
Un problema de planificacin
de tareas a plazo fijo
v
J. Campos - C.P.S.
Un problema de planificacin
de tareas a plazo fijo
Sea x una tarea de B\A con plazo k+1.
Sea A=A{x}.
Demostramos ahora que A es independiente
usando la propiedad (2) del Lema anterior.
Como A es independiente, Nt(A)=Nt(A)t, para
1tk.
Como B es independiente, Nt(A)Nt(B)t, para
k<tn.
Por tanto, A es independiente.
n
v
J. Campos - C.P.S.
Heursticas voraces:
Coloreado de grafos
v
5
4
J. Campos - C.P.S.
Heursticas voraces:
Coloreado de grafos
Algoritmo voraz de coloreado de un grafo:
u
5
4
J. Campos - C.P.S.
Heursticas voraces:
Coloreado de grafos
Sin embargo, tomando el mismo grafo pero
ordenando los vrtices de otra forma, 1,5,2,3,4, el
algoritmo voraz coloreara 1 y 5 de un color, 2 en
otro, y necesitara un tercer color para 3 y 4.
3
1
5
4
J. Campos - C.P.S.
J. Campos - C.P.S.
Ejemplo:
Cinco cabinas de telfonos, b, c, d, e, f, para las
que se conocen sus coordenadas relativas a la
central telefnica, a, desde la que parten los
recolectores y a donde deben regresar al
terminar, y se supone que la distancia entre cada
dos viene dada por la lnea recta.
c
a
(1,7)
b (4,3)
(0,0)
a
b
5
c
7,07
d
16,55
e
15,52
f
18
distan. a
J. Campos - C.P.S.
5
11,70
11,05
14,32
b
d
e
(15,7)
(15,4)
f
14
14,32
18,38
c
(18,0)
3
7,6
d
5
e
J. Campos - C.P.S.
d
f
Heurstica voraz:
Ir seleccionando parejas de puntos que sern
visitados de forma consecutiva:
se seleccionar primero aquella pareja de puntos
entre los que la distancia sea mnima;
a continuacin, se selecciona la siguiente pareja
separada con una distancia mnima siempre que
esta nueva eleccin no haga que:
u se visite un punto dos veces o ms (es decir,
que el punto aparezca tres o ms veces en
las parejas de puntos seleccionadas), o
u se cierre un recorrido antes de haber
visitado todos los puntos.
De esta forma, si hay que visitar n puntos
(incluido el origen), se selecciona un conjunto de
n parejas de puntos (que sern visitados de
forma consecutiva) y la solucin consiste en
reordenar todas esas parejas de forma que
constituyan un recorrido.
J. Campos - C.P.S.
En el ejemplo anterior:
Las parejas ordenadas por distancia entre sus
puntos son: (d,e), (a,b), (b,c), (e,f), (a,c), (d,f),
(b,e), (b,d), (c,d), (b,f), (c,e), (a,e), (a,d), (a,f) y (c,f).
Se selecciona primero la pareja (d,e) pues la
distancia entre ambos puntos es mnima
(3 unidades).
(d,e)
Despus se seleccionan las parejas (a,b), (b,c) y
(e,f). La distancia es para todas ellas igual
(5 unidades).
(d,e), (a,b), (b,c), (e,f)
La siguiente pareja de distancia mnima es (a,c),
con longitud 7,07.
Sin embargo, esta pareja cierra un recorrido junto
con otras dos ya seleccionadas, (b,c) y (a,b), por lo
que se descarta.
La siguiente pareja es (d,f) y se descarta tambin
por motivos similares.
J. Campos - C.P.S.
d
b
e
f
J. Campos - C.P.S.