Vous êtes sur la page 1sur 63

Algoritmos voraces Pg.

1
Problemas de Decisin y
Optimizacin
Un problema de decisin se puede
expresar como:
Un conjunto de variables X=(x
1
,x
2
,...,x
n
)
Cada variable x
i
tiene un dominio D
i
=(v
1
,v
2
,...,v
m
)
con los valores que se le pueden asignar
Un conjunto de restricciones

Una solucin al problema es una
asignacin de valores a todas las
variables que satisface las restricciones

SOL es el conjunto de soluciones

Algoritmos voraces Pg. 2
Ej. 1: n-reinas
Poner n reinas en un tablero n x n de
manera que no se ataquen

1 2 3 4 5 6 7 8
1
2
3
4
5
6
7
8
Algoritmos voraces Pg. 3
Ej. 1: n-reinas
Formulacin 1:
Variables: X={x
ij
}
x
ij
e{0,1} no hay/hay reina en (i,j)
Restricciones:





Formulacin 2:

Variables: X={x
i
}
x
ij
e{1,..,n} la reina de la fila i est en la
columna j
Restricciones:


|) | | (| ,
) ,..., 2 , 1 ( ) ,..., , (
2 1
j i
n
x x j i j i
n Permut x x x
=
e
|) | | (| ) ( ) (
) 1 ( ) , ( ), , (
l j k i l j j i
x x l k j i
n x
kl ij
ij
= . = . =
= =
=

Algoritmos voraces Pg. 4


Ej. 2: k-coloreado
Dado un grafo G=(V,E) no dirigido, y k
colores, asignar a cada vrtice un color
de manera que vrtices adyacentes no
tengan el mismo color. Sea
V=(1,2,...,n).

Formulacin:
Variables: X={x
1
, x
2
,..., x
n
}
x
i
e{1,2,...,k} color del vrtice i
Restricciones:


j i
x x E j i = e ) , (
Algoritmos voraces Pg. 5
Ej. 3: Circuito Hamiltoniano
Dado un grafo G=(V,E) encontrar un
ciclo que pase por todos los vrtices
exactamente una vez. Sea V=(1,2,...,n).

Formulacin:
Variables: X={x
1
, x
2
,..., x
n
}
x
i
e{1,2,...,n} vrtice visitado en la etapa i
Restricciones:


E x x n i
n Permut x x x
i i
n
e s s
e
+
) , ( 1
) ,..., 2 , 1 ( ) ,..., , (
2 )% 1 (
2 1
Algoritmos voraces Pg. 6
Problemas de Decisin y
Optimizacin
Un problema de optimizacin se puede
expresar como:
Un conjunto de variables X=(x
1
,x
2
,...,x
n
)
Cada variable x
i
tiene un dominio D
i
=(v
1
,v
2
,...,v
m
)
con los valores que se le pueden asignar
Un conjunto de restricciones
Una funcin objetivo, F(X), a maximizar o
minimizar

Una solucin al problema es una
asignacin de valores a todas las
variables que satisface las restricciones

Una solucin ptima es una solucin
maximal (o minimal) respecto a la
funcin objetivo

Algoritmos voraces Pg. 7
Ej. 4: Arboles de expansin
mnima (MSTs)
Dado un grafo G=(V,E) no dirigido,
conexo y etiquetado, encontrar un rbol
de expansin cuya suma de etiquetas
sea mnima. Sea E=(1,2,...,n).

Formulacin:
Variables: X={x
1
, x
2
,..., x
n
}
x
i
e{0,1} Escojo o no la arista i
Restricciones: El grafo inducido por las aristas
escogidas es conexo y sin ciclos
Funcin Objetivo: F(X)= E x
n
etiq(i)


Algoritmos voraces Pg. 8
Ej. 5: Problema del viajante
de comercio (TSP)
Dado un grafo G=(V,E) dirigido, conexo
y etiquetado, encontrar un circuito
hamiltoniano con suma de etiquetas
mnima. V=(1,2,...,n)

Formulacin:
Variables: X={x
1
, x
2
,..., x
n
}
x
i
e{1,2,...,n} vrtice visitado en la etapa i
Restricciones:





Funcin Objetivo: F(X)= E etiq(x
i
, x
(i+1)%2
)


E x x n i
n Permut x x x
i i
n
e s s
e
+
) , ( 1
) ,..., 2 , 1 ( ) ,..., , (
2 )% 1 (
2 1
Algoritmos voraces Pg. 9
Algoritmos voraces
Introduccin y 1er. ejemplo
El problema de la mochila
Caminos mnimos en grafos
rboles de recubrimiento de
coste mnimo
Cdigos de Huffman
El problema de la minimizacin
del tiempo de espera
Un problema de planificacin
de tareas a plazo fijo
Heursticas voraces
Coloreado de grafos
El problema del viajante de comercio
Algoritmos voraces Pg. 10
El esquema voraz:
Introduccin
El esquema voraz se aplica
normalmente a problemas de decisin
y optimizacin
Procede por pasos:
En cada paso se toma una decisin de la que
estamos seguros.
Las decisiones tomadas nunca se reconsideran
el algoritmo termina cuando no quedan
decisiones por tomar.
el algoritmo es correcto si podemos garantizar
que la solucin encontrada es siempre ptima;
Algoritmos voraces Pg. 11
Se trata de devolver una cantidad de
dinero con el menor nmero posible de
monedas.
Se parte de:
un sistema monetario (v
1
,v
2
,...,v
n
), y suficientes
monedas de cada tipo
un importe a devolver C.
Formulacin:
Variables: X=(x
1
,x
2
,...,x
n
),
x
i
e{0,1,..,C} nmero de monedas de tipo i
Restricciones: E x
i
v
i
= C
Funcin objetivo: E x
i

Criterio voraz:
Tomar el mximo de monedas (sin sobrepasar
C) en orden decreciente de valor
Problema del cambio en
monedas
Algoritmos voraces Pg. 12
funcin cambia(importe:nat;
valor:vector[moneda] de nat)
devuelve vector[moneda] de nat
variable mon:moneda;
cambio:vector[moneda] de nat
principio
para todo mon en moneda hacer
cambio[mon]:=0
fpara;
para mon:=M25 hasta M1 hacer
mq valor[mon]importe hacer
cambio[mon]:=cambio[mon]+1;
importe:=importe-valor[mon]
fmq
fpara;
devuelve cambio
fin
tipo moneda=(M25,M10,M5,M1)
Cambio de monedas
Algoritmos voraces Pg. 13
Ejercicios :

Demostrar la correccin del algoritmo.

Demostrar, buscando contraejemplos, que el
algoritmo no es ptimo si se aade un nuevo tipo
de moneda de 12 pesetas o si se elimina alguno
de los tipos existentes.
Demostrar que, en esas condiciones, el
algoritmo puede incluso no encontrar solucin
alguna aunque sta exista.

Es el mtodo de ordenacin por seleccin
directa un algoritmo voraz?

Cambio de monedas
Algoritmos voraces Pg. 14
El problema de la mochila
Sean:
n objetos fraccionables.
(p
1
,...,p
n
), pesos.
(b
1
,...,b
n
), beneficios.
mochila con capacidad C.
Problema: poner en la mochila aquellos
objetos que maximicen el beneficio, sin
sobrepasar la capacidad de la mochila
Formulacin:
Variables: X=(x
1
,x
2
,...,x
n
),
0 s x
i
s 1 porcin que tomo del objeto i
Restricciones: E x
i
p
i
s C
Funcin objetivo: F(X) = E x
i
b
i


Observaciones:
Podemos suponer p
1
++p
n
>C.
Podemos poner un = en la restriccin
Algoritmos voraces Pg. 15
Ejemplo:
n=3 C=17
(b
1
,b
2
,b
3
)=(40,36,22)
(p
1
,p
2
,p
3
)=(15,12,8)

Tres soluciones factibles:
El problema de la mochila
(x
1
,x
2
,x
3
)

(i) (1,1/6,0) 46
(ii) (0,3/4,1) 49
(iii) (0,1,5/8) 4975
1i3
E b
i
x
i
Algoritmos voraces Pg. 16
Cul es un criterio voraz correcto?
Volvamos al ejemplo:
1 estrategia: elegir el objeto con mayor
beneficio total (el primero).
Sin embargo, la mochila se llena muy
rpidamente con poco beneficio total.
2 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.
3 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.
El problema de la mochila
Algoritmos voraces Pg. 17

El problema de la mochila
{Pre: ie1..n:peso[i]>0,
ie1..n-1:
benef[i]/peso[i]benef[i+1]/peso[i+1]}
funcin mochila(benef,peso:vectReal;
cap:real) devuelve vectReal
variables resto:real; i:entero;
sol:vectReal
principio
para todo i en 1..n hacer
sol[i]:=0.0 {inicializar solucin}
fpara;
resto:=cap; {capacidad restante}
i:=1;
mq (in) and (peso[i]resto) hacer
sol[i]:=1;
resto:=resto-peso[i];
i:=i+1
fmq;
si in entonces sol[i]:=resto/peso[i] fsi;
devuelve sol


constante n=... {nmero de objetos}
tipo vectReal=vector[1..n] de real
Algoritmos voraces Pg. 18
Caminos mnimos
Dado un grafo G=(V,E) etiquetado con
pesos no negativos y un vrtice
distinguido v, calcular el coste del
camino mnimo desde v al resto de
vrtices.
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
E.W. Dijkstra:
A note on two problems in connexion with graphs,
Numerical Mathematica, 1, pp. 269-271, 1959.
Algoritmos voraces Pg. 19
Caminos mnimos

Solucin voraz: Algoritmo de Dijkstra
para grafos dirigidos (la extensin a no dirigidos
es inmediata)
genera uno a uno los caminos de un nodo v al
resto por orden creciente de longitud
usa un conjunto de vrtices donde, a cada paso,
se guardan los nodos para los que ya se sabe el
camino mnimo
devuelve un vector indexado por vrtices: en
cada posicin w se guarda el coste del camino
mnimo que conecta v con w
cada vez que se incorpora un nodo a la solucin
se comprueba si los caminos todava no
definitivos se pueden acortar pasando por l
se supone que el camino mnimo de un nodo a s
mismo tiene coste nulo
un valor en la posicin w del vector indica que
no hay ningn camino desde v a w
Algoritmos voraces Pg. 20
Caminos mnimos

{Pre: g es un grafo dirigido etiquetado no neg.}
funcin Dijkstra(g:grafo; v:vrt)
devuelve vector[vrt] de etiq
variables S:cjtVrt;
D:vector[vrt] de etiq
principio
wevrt:D[w]:=etiqueta(g,v,w);
D[v]:=0; S:={v};
mq S no contenga todos los vrtices hacer

elegir weS t.q. D[w] es mnimo;
S:=S{w};
ueS:actualizar dist.mn. comprobando
si por w hay un atajo
fmq;
devuelve D
fin

Algoritmos voraces Pg. 21
Caminos mnimos
Implementacin ms detallada
Se utiliza en lugar de S su complementario T
Se supone que n es el nmero de vrtices

funcin Dijkstra(g:grafo; v:vrt)
devuelve vector[vrt] de etiq
variables T:cjtVrt;
D:vector[vrt] de etiq;
u,w:vrt; val:etiq
principio
T:=C;
para todo w en vrt hacer
D[w]:=etiqueta(g,v,w); T:=T{w}
fpara;
D[v]:=0; T:=T-{v};
repetir n-2 veces {quedan n-1 caminos por
determinar}
{seleccin del mn.w: weT , ueT:D[w]D[u]}
val:=;
para todo u en T hacer
si D[u]val ent w:=u; val:=D[u] fsi
fpara;
...
Algoritmos voraces Pg. 22
Caminos mnimos

...
T:=T-{w};
{se recalculan las nuevas dist. mnimas}
para todo u en T hacer
si D[w]+etiqueta(g,w,u)<D[u]
ent D[u]:=D[w]+etiqueta(g,w,u)
fsi
fpara
frepetir;
devuelve D
fin
{Post: D=caminosMnimos(g,v)
Nota: el bucle principal se ejecuta n-2 veces porque
el ltimo camino queda calculado despus del
ltimo paso (no quedan vrtices para hallar atajos)
Algoritmos voraces Pg. 23
Caminos mnimos
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:
creacin del cjto. y ejecucin n veces de
diversas operaciones constantes: O(n)
fase de seleccin:
las instrucciones del interior del bucle son
O(1)
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 O(n
2
)
fase de marcaje:
n supresiones a lo largo del algoritmo: O(n)
fase de reclculo de las distancias mnimas:
queda O(n
2
) por igual razn que la seleccin

Coste total: O(n
2
)
Algoritmos voraces Pg. 24
Caminos mnimos
Mejoras en el tiempo de ejecucin
Si la representacin es por listas de adyacencia,
la fase de reclculo se ejecuta slo a (a<n
2
)
veces (sustituyendo el bucle sobre los vrt. de T
por otro bucle sobre los vrt. sucesores de w).
Si el conjunto T se sustituye con una cola con
prioridades, se rebaja tambin el coste de la fase
de seleccin (puesto que se selecciona el
mnimo).

Problema: la fase de reclculo puede exigir
cambiar la prioridad de un elemento cualquiera
de la cola.

Solucin: nuevo tipo de cola con prioridades que
permita el acceso directo a cualquier elemento.
Algoritmos voraces Pg. 25
Caminos mnimos











Implementacin: heap junto con un vector
indexado por vrtices
TAD cpa {cola Prior. De Aristas}
operaciones
creaVaca: cpa O(1)
inserta: cpa vrt etiq cpa O(log n)
primero: cpa (vrt,etiq) O(1)
borra: cpa cpa O(log n)
sustit: cpa vrt etiq cpa O(log n)
valor: cpa vrt etiq O(1)
est?: cpa vrt bool O(1)
vaca?: cpa bool O(1)
1
2
3
4
5
<4,20>
<3,75>
<2,>
<5,60>
el valor de la etiqueta
significa que el vrtice
no est en la cola
Algoritmos voraces Pg. 26
Caminos mnimos

funcin Dijkstra(g:grafo; v:vrt)
devuelve vector[vrt] de etiq
variables A:cpa; {cola de aristas con prior.}
D:vector[vrt] de etiq;
u,w:vrt; et,val:etiq
principio
creaVaca(A);
para todo w en vrt hacer
inserta(A,w,etiqueta(g,v,w))
fpara;
mq no esVaca(A) hacer
<w,val>:=primero(A);
D[w]:=val; borra(A);

para todo <u,et> en suc(g,w) hacer
si est(A,u) entonces
si val+et<valor(A,u)
ent sustituye(A,u,val+et)
fsi
fsi
fpara
fmq;
D[v]:=0; devuelve D
fin
Algoritmos voraces Pg. 27
Caminos mnimos
Coste temporal:
inicializacin: O(nlog n)
seleccin y supresin: O(nlog n)
bucle interno: examina todas las aristas del grafo
y en el caso peor efecta una sustitucin por
arista, por tanto: O(alog n)
El coste total es:O((a+n)log n), luego es mejor
que la versin anterior si el grafo es disperso.
Si el grafo es denso, el algoritmo original es
mejor.

Algoritmos voraces Pg. 28
Caminos mnimos
Ejercicio: clculo de la secuencia de
nodos que componen el camino
mnimo
si el camino mnimo entre v y w pasa por u, el
camino mnimo entre v y u es un prefijo del
camino mnimo entre v y w
basta con devolver un vector C tal que C[w]
contenga el nodo anterior en el camino mnimo
de v a w (que ser v si est directamente unido
al nodo de partida o si no hay camino entre v y
w)
el vector debe actualizarse al encontrarse un
atajo en el camino
es necesario tambin disear un nuevo algoritmo
para recuperar el camino a un nodo dado, que
tendra como parmetro C
Algoritmos voraces Pg. 29
rboles de recubrimiento de
coste mnimo (minimum
spanning trees, MST)
Objetivo: dado un grafo, obtener un
nuevo grafo que slo contenga las
aristas imprescindibles para una
optimizacin global de las conexiones
entre todos los nodos

Aplicacin: problemas que tienen que
ver con distribuciones geogrficas
conjunto de computadores distribuidos
geogrficamente en diversas ciudades de
diferentes pases a los que se quiere conectar
para intercambiar datos, compartir recursos, etc.;

se pide a las compaas telefnicas respectivas
los precios de alquiler de lneas entre ciudades

asegurar que todos los computadores pueden
comunicar entre s, minimizando el precio total
de la red
Algoritmos voraces Pg. 30
MSTs
Terminologa:
rbol libre (spanning tree):
es un grafo no dirigido conexo acclico
todo rbol libre con n vrtices tiene n-1 aristas
si se aade una arista se introduce un ciclo
si se borra una arista quedan vrtices no
conectados
cualquier par de vrtices est unido por un nico
camino simple
un rbol libre con un vrtice distinguido es un
rbol con raz
rbol de recubrimiento de un grafo no dirigido y
etiquetado no negativamente:
es cualquier subgrafo que contenga todos los
vrtices y que sea un rbol libre
rbol de recubrimiento de coste mnimo:
es un rbol de recubrimiento y
no hay ningn otro rbol de recubrimiento cuya
suma de aristas sea menor
Algoritmos voraces Pg. 31
MSTs







Algoritmo de Prim (debido a Jarnk)
Aplica reiteradamente la propiedad de los
rboles de recubrimiento de coste mnimo
incorporando a cada paso una arista
Se usa un conjunto U de vrtices tratados y se
selecciona en cada paso la arista mnima que
une un vrtice de U con otro de su
complementario
V. Jarnk: O jistm problmu minimlnm,
Prca Moravsk Prrodovedeck Spolecnosti, 6, pp.
57-63, 1930.

R.C. Prim:
Shortest connection networks and some generalizations,
Bell System Technical Journal, 36, pp. 1389-1401, 1957.
Algoritmos voraces Pg. 32
MSTs

{Pre: g es un grafo no dirigido conexo
etiquetado no negativamente}
funcin Prim(g:grafo) devuelve grafo
variables U:cjtVrt; gsol:grafo;
u,v:vrt; x:etiq
principio
creaVaco(gsol); U:={cualquier vrtice};
mq U no contenga todos los vrt. hacer
seleccionar <u,v,x> mnima t.q. ueU;veU
aade(gsol,u,v,x); U:=U{v}
fmq;
devuelve gsol
fin
{Post: gsolearm(g)}
Coste: O(na)
(es decir, O(n
3
) si el grafo es denso)
Algoritmos voraces Pg. 33
MSTs
La versin previa puede refinarse hasta
obtener un algoritmo en O(n
2
), es decir,
mejor que el anterior (an-1).

Se usa un vector arisMn, indexado por vrtices,
que contiene:

si veU: arisMn[v]=<w,g(v,w)> t.q. <v,w> es la
arista ms pequea que conecta v
con un vrtice weU

si veU: arisMn[v]=<v,>
Algoritmos voraces Pg. 34
MSTs

{Pre: g es un grafo no dirigido conexo
etiquetado no negativamente}
funcin Prim(g:grafo) devuelve grafo
variables
arisMn:vector[vrt] de <vrt,etiq>;
gsol:grafo; prim,mn,v,w:vrt; x:etiq
principio
prim:=unVrticeCualquiera;
arisMn[prim]:=<prim,>;
para todo v en vrt hacer
arisMn[v]:=<prim,etiqueta(g,prim,v)>
fpara;

creaVaco(gsol);
hacer n-1 veces
mn:=prim; {centinela: arisMn[mn].et=}
para todo v en vrt hacer
<w,x>:=arisMn[v];
si x<arisMn[mn].et
ent mn:=v
fsi;
fpara;
...
Algoritmos voraces Pg. 35
MSTs

...
aade(gsol,mn,arisMn[mn].v,
arisMn[mn].et);
arisMn[mn]:=<mn,>;
paratodo <v,x>en adyacentes(g,mn) hacer
si(arisMn[v].vv)y(x<arisMn[v].et)
entonces arisMn[v]:=<mn,x> fsi
fpara
frepetir;
devuelve gsol
fin
{Post: gsolearm(g)}
Algoritmos voraces Pg. 36
MSTs
Eficiencia temporal:
inicializacin: lineal en caso de matriz de
adyacencia y cuadrtica en caso de listas
bucle principal:
el bucle de seleccin: O(n)
el aadido de una arista al grafo: constante
usando matriz, lineal usando listas
el bucle de reorganizacin:
con matriz de adyacencia: el clculo de los
adyacentes es O(n) y el coste total queda O(n
2
)
con listas: el coste total es O(a+n)
Coste total: O(n
2
), independientemente
de la representacin.

Coste espacial: O(n) de espacio adicional.
Algoritmos voraces Pg. 37
MSTs




Algoritmo de Kruskal:
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.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.
Algoritmos voraces Pg. 38

MSTs
{Pre: g es un grafo no dirigido conexo
etiquetado no negativamente}
funcin Kruskal(g:grafo) devuelve grafo
variables gsol:grafo;
u,v:vrt; x:etiq
principio
creaVaco(gsol);
mq gsol no sea conexo hacer
seleccionar <u,v,x> mnima no examinada;
si no provoca ciclo
entonces aade(gsol,u,v,x)
fsi
fmq;
devuelve gsol
fin
{Post: gsolearm(g)}
Nota: componentes(gsol) devuelve el conjunto de
componentes conexos de gsol.
(-) Utilizar una cola con prioridades.
(-)
Algoritmos voraces Pg. 39
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.
MSTs
C
E
A B
D
30
50
50
60
40 40
10 20
C
E
A B
D
3
4
1 2
Evolucin de las clases de equivalencia:

{[A],[B],[C],[D],[E]} {[A],[B],[C,D],[E]}

{[A],[B],[C,D,E]} {[A,B],[C,D,E]}

{[A,B,C,D,E]}
Algoritmos voraces Pg. 40
Se utiliza el TAD relacin de
equivalencia sobre los vrtices







Implementacin asintticamente ptima:
MF sets
el coste de creaREV es lineal
el coste de numClases es constante
el coste de k ejecuciones combinadas de
fusiona y clase es O(ko(k,n)), lo cual es
prcticamente constante, porque

o es una funcin inversa de la
funcin de Ackerman que crece MUY
despacio (o(k,n)4, para todos los valores
de k y n imaginables)
MSTs
gnero rev {relac. de equiv. sobre vrt.}
operaciones
creaREV: rev {cada vrt. una clase}
clase: rev vrt nat
fusiona: rev nat nat rev
numClases: rev nat
Algoritmos voraces Pg. 41

MSTs
{Pre: g es un grafo no dirigido conexo
etiquetado no negativamente}
funcin Kruskal(g:grafo) devuelve grafo
variables T:cpa; gsol:grafo;
u,v:vrt; x:etiq;
C:rev; ucomp,vcomp:nat
principio
creaREV(C); {cada vrt. forma una clase}
creaVaco(gsol); creaVaca(T);
{se colocan todas las aristas en la cola}
para todo v en vrt hacer
para todo <u,x> en adyacentes(g,v) hacer
inserta(T,v,u,x)
fpara
fpara;
...
Algoritmos voraces Pg. 42

...
mq numClases(C)>1 hacer
{obtener y eliminar la arista mn.de la cola}
<u,v,x>:=primero(T); borra(T);
{si la arista no provoca ciclo se aade a la
solucin y se fusionan las clases corresp.}
ucomp:=clase(C,u); vcomp:=clase(C,v);
si ucompvcomp entonces
fusiona(C,ucomp,vcomp);
aade(gsol,u,v,x)
fsi
fmq;
devuelve gsol
fin
{Post: gsolearm(g)}
MSTs
Algoritmos voraces Pg. 43
Coste del algoritmo:
las a inserciones consecutivas de aristas en la
cola con prioridades dan O(alog a); como an
2
:
O(alog a)<=O(alog n
2
)=O(2alog n)=O(alog n)
como mucho hay a consultas y supresiones de la
arista mnima, el coste de la consulta es
constante y el de la supresin es O(log a); por
ello, este paso queda en O(alog n)
averiguar cuntas clases hay en la relacin de
equivalencia es constante
en el caso peor, la operacin de fusin de clases
se ejecuta n-1 veces y la operacin de localizar
la clase 2a veces; por tanto, el coste total es en
la prctica O(a)
las n-1 inserciones de aristas quedan en O(n)
con matriz de adyacencia y O(n
2
) con listas,
aunque en el caso de las listas puede reducirse
tambin a O(n) si se elimina en la operacin de
aade la comprobacin de existencia de la arista
(el
algoritmo de Kruskal garantiza que no habrn
inserciones repetidas de aristas)

Coste total: O(alog n)
(menos que el algoritmo de Prim, aunque con
mayor espacio adicional)
MSTs
Algoritmos voraces Pg. 44
Cdigos de Huffman



Los cdigos de Huffman son una tcni-
ca 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:


Puede usarse un cdigo de longitud fija (de 3
bits). El fichero requerira 300.000 bits.
D.A. Huffman: A method for the construction of
minimum-redundancy codes,
Proceedings of the IRE, 40(9), pp. 1098-1101, 1952.
a b c d e f
frec. en miles 45 13 12 16 9 5
a b c d e f
cd.long.fija 000 001 010 011 100 101
Algoritmos voraces Pg. 45
Puede hacerse mejor con un cdigo de
longitud variable, dando codificaciones cortas a
los caracteres ms frecuentes y ms largas a los
menos frecuentes.



Este cdigo ahorra algo ms del 25% (requiere
224.000 bits en lugar de 300.000).
Se precisa un cdigo libre de prefijos:
Ninguna codificacin puede ser prefijo de otra.
De esta forma, la decodificacin es inmediata
pues no hay ambigedades.
Por ejemplo: 001011101 slo puede ser aabe.
El cdigo se representa mediante un
trie (rbol lexicogrfico):
rbol binario cuyas hojas son los caracteres
codificados;
el cdigo de cada carcter es el camino desde la
raz hasta la hoja, donde ir al hijo izquierdo
significa 0 e ir hacia el derecho significa 1.
Cdigos de Huffman
a b c d e f
cd.long.var. 0 101 100 111 1101 1100
Algoritmos voraces Pg. 46
Ejemplo: rboles de los dos cdigos
anteriores.










Cada hoja est etiquetada con un carcter y su
frecuencia.
Cada nodo interno est etiquetado con la suma
de los pesos de las hojas de su subrbol.
Un cdigo ptimo siempre est representado
por un rbol lleno: cada nodo interno tiene dos
hijos.
Si el alfabeto que se quiere codificar es C,
en-tonces el rbol del cdigo ptimo tiene
|C| hojas y |C|-1 nodos internos.
Cdigos de Huffman
100
14
14 58 28
a:45 b:13 c:12 d:16 e:9 f:5
86
0
1
0
0 0
0
0
1
1
1
1
100
0
1
25 30
c:12 b:13 d:16
55
0
0 0
1
1
1
14
f:5 e:9
0
1
a:45
Algoritmos voraces Pg. 47
El algoritmo voraz de Huffman cons-
truye el rbol A de un cdigo ptimo de
abajo hacia arriba.
Utiliza una cola Q de rboles con
prioridades (las frecuencias hacen de
prioridades).
Empieza con un conjunto de |C| hojas
en Q y realiza una secuencia de |C|-1
mezclas hasta crear el rbol final.
En cada paso, se mezclan los dos
objetos (rboles) de Q que tienen
menos frecuencia y el resultado es un
nuevo objeto (rbol) cuya frecuencia es
la suma de las frecuencias de los dos
objetos mezclados.
Cdigos de Huffman
Algoritmos voraces Pg. 48
Cdigos de Huffman
{Pre: C es el conjunto de caracteres y f es el
vector de frecuencias}
funcin Huffman(C:conjunto;f:vectFrec)
devuelve rbol
variables Q:colaPri; i,fx,fy,fz:entero;
z,x,y:rbol
principio
creaVaca(Q);
para todo x en C hacer
inserta(Q,<x,f[x]>)
fpara;
para i:=1 hasta |C|-1 hacer
<x,fx>:=primero(Q); borra(Q);
<y,fy>:=primero(Q); borra(Q);
fz:=fx+fy;
z:=crearbol(raz=>fz,
hijoIzq=>x;
hijoDer=>y);
inserta(Q,<z,fz>)
fpara;
<z,fz>:=primero(Q); borra(Q)
devuelve z
fin
{Post: z es el rbol de un cdigo libre de
prefijos ptimo para (C,f)}
Coste temporal: O(|C|log |C|)
Algoritmos voraces Pg. 49
Para el ejemplo anterior:
Cdigos de Huffman
c:12 b:13 d:16 f:5 e:9 a:45
(1)
c:12 b:13 d:16 14
f:5 e:9
0
1
a:45
(2)
25
c:12 b:13
0
1
d:16 14
f:5 e:9
0
1
a:45
(3)
25
c:12 b:13
0
1
30
d:16
0
1
14
f:5 e:9
0
1
a:45
(4)
25 30
c:12 b:13 d:16
55
0
0 0
1
1
1
14
f:5 e:9
0
1
a:45
(5)
100
0
1
25 30
c:12 b:13 d:16
55
0
0 0
1
1
1
14
f:5 e:9
0
1
a:45
(6)
Algoritmos voraces Pg. 50
El problema de la seleccin
de actividades
Es un problema de planificacin de
tareas (en ingls, scheduling).
Se tienen n 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:
c
i
instante de comienzo
f
i
instante de finalizacin f
i
debe hacerse durante [c
i
,f
i
).
Dos actividades i, j se dicen compati-
bles si los intervalos [c
i
,f
i
) y [c
j
,f
j
) no se
superponen (i.e., (c
i
f
j
) (c
j
f
i
)).
El problema de seleccin de
actividades consiste en seleccionar un
conjunto de actividades mutuamente
compatibles que tenga cardinal
mximo.
Algoritmos voraces Pg. 51
Seleccin de Actividades


Formulacin:
Variables: X={x
1
, x
2
,..., x
n
}
x
i
e{0,1} Escojo o no la actividad i
Restricciones:

Funcin Objetivo: F(X)= E x
n



i j j i j i
f c f c x x j i > v > = = ) 1 ( ,
Algoritmos voraces Pg. 52
{Pre: ie1..n:c[i]f[i] , ie1..n-1:f[i]f[i+1]}
funcin selec(c,f:vectReal)devuelve conjunto
variables i,j:entero; A:conjunto
principio
A:={1};
j:=1; {j es la ltima actividad seleccionada}
para i:=2 hasta n hacer
si c[i]f[j]
entonces A:=A{i}; j:=i
fsi
fpara;
devuelve A
fin
{Post: A es solucin ptima del problema de
la seleccin de actividades.}
constante n=... {nmero de actividades}
tipo vectReal=vector[1..n] de real
seleccin de actividades
Coste temporal: O(n)
O(nlog n) si se tiene en cuenta que hay que
ordenar primero los vectores.
Algoritmos voraces Pg. 53
Es otro problema de planificacin de
tareas.
Un servidor (por ej., un procesador, un
cajero automtico, un surtidor de gaso-
lina, etc.) tiene que atender n clientes
que llegan todos juntos al sistema.
El tiempo de servicio para cada cliente
es t
i
, i=1,2,,n.
Se quiere minimizar el tiempo de
espera global
Formulacin:
Variables: X={x
i
}
x
i
e{1,..,n} persona atendida en posicin i
Restricciones: X e Permut(1,2,...,n)
Funcin Objetivo:

El problema de la minimiza-
cin del tiempo de espera
] [
1 1

= =
i
j
j
n
i
x T
Algoritmos voraces Pg. 54
Ejemplo:

3 clientes con t
1
=5, t
2
=10, t
3
=3.
minimizacin del tiempo de
espera
orden T
1 2 3: 5 + (5+10) + (5+10+3) = 38
1 3 2: 5 + (5+3) + (5+3+10) = 31
2 1 3: 10 + (10+5) + (10+5+3) = 43
2 3 1: 10 + (10+3) + (10+3+5) = 41
3 1 2: 3 + (3+5) + (3+5+10) = 29
3 2 1: 3 + (3+10) + (3+10+5) = 34
ptimo
Algoritmos voraces Pg. 55
Heursticas voraces:
Coloreado de grafos
A veces se utilizan algoritmos voraces
a pesar de que no calculan soluciones
ptimas:
bien porque el clculo de una solucin ptima es
demasiado costoso,
bien porque el algoritmo voraz calcula un
solucin subptima que resulta suficiente.

Problema del coloreado de un grafo.
Sea G=(V,A) un grafo no dirigido cuyos vrtices
se desea colorear.
Se exige que todo par de vrtices unidos por una
arista tengan asignados colores diferentes.
Se pretende emplear el menor nmero posible
de colores.
1
3
4
2 5
Algoritmos voraces Pg. 56
Algoritmo voraz de coloreado de un grafo:

escoger inicialmente un color y un vrtice
arbitrario como punto de partida;
tratar de asignarle ese color al mayor
nmero posible de vrtices, respetando la
restriccin impuesta (vrtices adyacentes
deben tener distinto color);
escoger otro vrtice an no coloreado y un
color distinto y repetir el proceso hasta
haber coloreado todos los vrtices.

Aplicado al ejemplo anterior, se obtiene la
solucin ptima: dos colores.
Heursticas voraces:
Coloreado de grafos
1
3
4
2 5
Algoritmos voraces Pg. 57
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.






Por tanto es un algoritmo heurstico que tiene
la posibilidad, pero no la certeza, de
encontrar la solucin ptima.
Todos los algoritmos exactos conocidos para el
problema del coloreado de un grafo emplean un
tiempo exponencial, de ah la utilidad de la
heurstica voraz.
Heursticas voraces:
Coloreado de grafos
3
5 1
4
2
Algoritmos voraces Pg. 58
Heursticas voraces: El
problema del viajante de
comercio
El problema del viajante de comercio
consiste en 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.

Se lo plantean, por ejemplo, las
compaas de telfonos para elegir la
ruta que deben seguir los recolectores
de dinero de las cabinas pblicas
instaladas en una ciudad.
Algoritmos voraces Pg. 59
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.
Heursticas voraces: TSP
a
b
c
d
e
f
(1,7)
(4,3)
(0,0)
(15,7)
(15,4)
(18,0)
a
b 5
c 7,07 5
d 16,55 11,70 14
e 15,52 11,05 14,32 3
f 18 14,32 18,38 7,6 5
distan. a b c d e f
Algoritmos voraces Pg. 60
El algoritmo de fuerza bruta para
resolver el problema consiste en
intentar todas las posibilidades, es
decir, calcular las longitudes de todos
los recorridos posibles, y seleccionar la
de longitud mnima (veremos una
solucin algo mejor mediante
programacin dinmica).
Obviamente, el coste de tal algoritmo
crece exponencialmente con el nmero
de puntos a visitar.
En el ejemplo anterior, la solucin viene
dada por el siguiente recorrido
(en realidad dos recorridos, pues
ambos sentidos de marcha son
posibles)
de longitud 48,39:
Heursticas voraces:TSP
a
b
c
d
e
f
Algoritmos voraces Pg. 61
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:
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
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.
Heursticas voraces:TSP
Algoritmos voraces Pg. 62
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.
Heursticas voraces:TSP
Algoritmos voraces Pg. 63
(d,e), (a,b), (b,c), (e,f)
La siguiente es la pareja (b,e), pero debe rechazarse
tambin porque su inclusin hara visitar ms de una
vez los puntos b y e.
La pareja (b,d) se rechaza por motivos similares (el
punto b habra que visitarlo dos veces).
La siguiente pareja es (c,d), y se selecciona.
(d,e), (a,b), (b,c), (e,f), (c,d)
Las parejas (b,f), (c,e), (a,e) y (a,d) no son
aceptables.
Finalmente, la pareja (a,f) cierra el recorrido:









Este recorrido no es el ptimo pues su longitud es de
50 unidades.
No obstante, es el cuarto mejor recorrido de entre los
sesenta (esencialmente distintos) posibles y es ms
costoso que el ptimo en slo un 3,3%.
Heursticas voraces: TSP
a
b
c
d
e
f

Vous aimerez peut-être aussi