Está en la página 1de 97

Algoritmos voraces

v
v
v
v
v
v
v
v
v
v
v

Introduccin y primer ejemplo


El problema de la mochila
Caminos mnimos en grafos
rboles de recubrimiento de
coste mnimo
Consideraciones sobre
la correccin del esquema voraz
Cdigos de Huffman
El problema de la seleccin de
actividades
El problema de la minimizacin
del tiempo de espera
Fundamentos tericos
del esquema voraz
Un problema de planificacin
de tareas a plazo fijo
Heursticas voraces

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

Esquemas algortmicos - Algoritmos voraces Pg. 1

El esquema voraz:
Introduccin y primer ejemplo
v
v

Es uno de los esquemas ms simples y


al mismo tiempo de los ms utilizados.
Tpicamente se emplea para resolver
problemas de optimizacin:
existe una entrada de tamao n que son los
candidatos a formar parte de la solucin;
existe un subconjunto de esos n
candidatos que satisface ciertas restricciones: se
llama solucin factible;
hay que obtener la solucin factible que
maximice o minimice una cierta funcin objetivo:
se llama solucin ptima.

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.

Esquemas algortmicos - Algoritmos voraces Pg. 2

El esquema voraz:
Introduccin y primer ejemplo
v

El esquema voraz procede por pasos:


inicialmente el conjunto de candidatos escogidos
es vaco;
en cada paso, se intenta aadir al conjunto de los
escogidos el mejor de los no escogidos (sin
pensar en el futuro), utilizando una funcin de
seleccin basada en algn criterio de optimizacin (puede ser o no ser la funcin objetivo);
tras cada paso, hay que ver si el conjunto
seleccionado es completable (i.e., si aadiendo
ms candidatos se puede llegar a una solucin);
u si el conjunto no es completable, se rechaza
el ltimo candidato elegido y no se vuelve a
considerar en el futuro;
u si es completable, se incorpora al conjunto
de escogidos y permanece siempre en l;
tras cada incorporacin se comprueba si el
conjunto resultante es una solucin;
el algoritmo termina cuando se obtiene una
solucin;
el algoritmo es correcto si la solucin encontrada
es siempre ptima;

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 3

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.

Esquemas algortmicos - Algoritmos voraces Pg. 4

El esquema voraz:
Introduccin y primer ejemplo
v

Problema del cambio en monedas.


Se trata de devolver una
cantidad de pesetas con el
menor nmero posible
de monedas.
Se parte de:
u un conjunto de tipos de monedas vlidas, de
las que se supone que hay cantidad
suficiente para realizar el desglose, y de
u un importe a devolver.

Elementos fundamentales del esquema:


Conjunto de candidatos: cada una de las
monedas de los diferentes tipos que se pueden
usar para realizar el desglose del importe dado.
Solucin: un conjunto de monedas devuelto tras
el desglose y cuyo valor total es igual al importe
a desglosar.
Completable: la suma de los valores de las
monedas escogidas en un momento dado no
supera el importe a desglosar.
Funcin de seleccin: elegir si es posible la
moneda de mayor valor de entre las candidatas.
Funcin objetivo: nmero total de monedas
utilizadas en la solucin (debe minimizarse).

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 5

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.

Esquemas algortmicos - Algoritmos voraces Pg. 6

El esquema voraz:
Introduccin y primer ejemplo
v

Ejercicios sobre el problema del cambio


en monedas:
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?
Si es as, cules son las funciones utilizadas
(seleccin, completable, solucin)?

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 7

El problema de la mochila
v
v
v
v

Se tienen n objetos fraccionables y una


mochila.
El objeto i tiene peso pi, 1i n.
La mochila tiene capacidad C.
Si se mete una fraccin xi, 0 xi 1, del
objeto i en la mochila, entonces se
consigue un beneficio bixi.
El objetivo es llenar la mochila de
manera que se maximice el beneficio
total.
Pero como la mochila tiene capacidad
C, el peso total de todos los objetos
metidos en ella no puede superar esa
cantidad.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 8

El problema de la mochila
v

Formalmente:
maximizar
sujeto a

b ixi

(1)

pixi C

(2)

1in

1in

con 0xi1, bi>0, pi>0, 1in


v
v

v
v
v

(3)

Una solucin factible es cualquier


n-tupla (x1,,xn) que satisfaga (2) y (3).
Una solucin ptima es cualquier
solucin factible para la que (1) sea
mximo.
Si p1++pnC, entonces obviamente
xi=1, 1in, es una solucin ptima.
Por tanto, supongamos que p1++pn>C.
Ntese adems que todas las soluciones
ptimas llenarn la mochila por
completo (podemos poner = en (2)).

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 9

El problema de la mochila
v

Ejemplo:
n=3
C=17
(b1,b2,b3)=(40,36,22)
(p1,p2,p3)=(15,12,8)

Tres soluciones factibles:

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

Esquemas algortmicos - Algoritmos voraces Pg. 10

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

La funcin de seleccin es la ms difcil de


determinar.
u Si procedemos vorazmente, en cada paso
debemos considerar un objeto y tomar cierta
fraccin suya.
u La cuestin de qu fraccin se toma es ms
fcil de resolver: si hemos elegido el mejor
candidato, tomamos todo lo que podamos
de l.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 11

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.

Esquemas algortmicos - Algoritmos voraces Pg. 12

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.

Esquemas algortmicos - Algoritmos voraces Pg. 13

El problema de la mochila
v

Coste temporal: (n)


(nlog n) si se tiene en cuenta que hay que
ordenar primero los vectores.

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

Si k=j entonces, puesto que piyi =C y y i=xi


para 1i<j, se sigue que yk<xk piy i >C.
Si k>j entonces piyi >C, y eso no es posible.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 14

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

bizi = 1in biyi + (zk-yk)pkbk/pk - k<in (yi -zi)pib i/pi


1in biy i +
+ [(zk-yk)pk - k<in (yi -zi)pi]bk/pk
= 1in biyi

Si 1in bizi > 1in biy i entonces Y no puede ser


ptima.
Si esas sumas son iguales entonces bien Z=X y X
es ptima, o bien ZX.
En este ltimo caso, se usa de nuevo el mismo
argumento hasta demostrar que bien Y no es
ptima o bien Y se transforma en X,
demostrando que X tambin es ptima.
n

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 15

Caminos mnimos en grafos


v

Grafos etiquetados con pesos no


negativos
1

12

5
21

12

5
21

Bsqueda de caminos de longitud


mnima
longitud o coste de un camino: suma de los
pesos de las aristas que lo componen
clculo de la longitud mnima de los caminos
existentes entre dos vrtices dados

Caractersticas del tipo de dato de las


etiquetas (o pesos):
dominio ordenado (<, =, )
operacin suma (+):
u conmutativa
u con elemento neutro (0), que es adems el
peso ms pequeo posible
u con elemento idempotente (), que es
adems el peso ms grande posible

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 16

Caminos mnimos en grafos


v

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

En el caso de un grafo no dirigido, la matriz de


adyacencia tiene la particularidad de ser
simtrica y los elementos de su diagonal son
todos igual a falso.
J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 17

Caminos mnimos en grafos


La representacin de la matriz de adyacencia es
til para aquellos algoritmos que precisan saber
si existe o no una arista entre dos vrtices dados.
En el caso de grafos etiquetados con pesos, los
elementos de la matriz pueden ser enteros o
reales (en lugar de booleanos) y representar el
peso de la arista. Si no existe una arista de i a j,
debe emplearse un valor que no pueda ser una
etiqueta vlida para almacenarse en A[i,j].
Un inconveniente de la representacin de la
matriz de adyacencia es que requiere un espacio
en (n2) aunque el grafo tenga muy pocas
aristas.
Dado un grafo G=(V,A) representado mediante
su matriz de adyacencia, la pregunta (u,v)A?
se puede contestar en un tiempo en (1).
Sin embargo, la operacin sucesores(g,v)
necesita un tiempo en (n) (pues hay que
recorrer una fila completa de la matriz).
Ms an, para saber, por ejemplo, si un grafo no
dirigido representado mediante su matriz de
adyacencia es conexo, o simplemente para
conocer el nmero de aristas, los algoritmos
requieren un tiempo en (n2), lo cual es ms de
lo que cabra esperar.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 18

Caminos mnimos en grafos


v

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

Vector de listas de adyacencia


Grafo
dirigido
J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 19

Caminos mnimos en grafos


La representacin de un grafo con listas de
adyacencia requiere un espacio del orden del
mximo entre n (el nmero de vrtices) y a (el
nmero de aristas).
En el caso de un grafo no dirigido, si (u,v)A
entonces el vrtice v estar en la lista
correspondiente al vrtice u, y el vrtice u lo
estar a su vez en la lista de adyacencia del
vrtice v.
Para representar un grafo etiquetado con pesos
basta con aadir otro campo al tipo nodo que
almacene el peso correspondiente.
Acceder a la lista de los vrtices sucesores de
uno dado lleva un tiempo constante.
Sin embargo, consultar si una determinada arista
(u,v) est en el grafo precisa recorrer la lista
asociada al vrtice u, lo que en el caso peor se
realiza en (n).

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 20

Caminos mnimos en grafos


En el caso de un grafo dirigido, si se necesita
saber los predecesores de un vrtice dado, la
representacin con listas de adyacencia no es
adecuada.
Ese problema puede superarse si se almacena
otro vector de n listas de forma que la lista
i-sima contenga los vrtices predecesores del
vrtice i.
Estas listas se llaman listas de adyacencia
inversa.
1
2 nil
2

Grafo
dirigido

J. Campos - C.P.S.

1
2
3

1 nil
2 nil

Vector de listas de adyacencia inversa

Esquemas algortmicos - Algoritmos voraces Pg. 21

Caminos mnimos en grafos


v

Listas mltiples de adyacencia


En el caso de grafos dirigidos, las listas de
adyacencia directa e inversa pueden
representarse de forma ms compacta
Una lista mltiple es una estructura dinmica de
datos enlazados mediante punteros en la que
cada dato puede pertenecer a dos o ms listas.
Hay un nodo por cada una de las aristas del
grafo.
Cada nodo guarda la clave de dos vrtices
(origen y destino de la arista) y dos punteros: el
primero al nodo que guarda la siguiente arista
que tiene el mismo vrtice destino y el segundo
al nodo que guarda la siguiente arista que tiene
el mismo vrtice origen.
Listas de adyacencia inversa

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.

Esquemas algortmicos - Algoritmos voraces Pg. 22

Caminos mnimos en grafos


constante
constante nn == ...
... {cardinal
{cardinal de
de V}
V}
tipos
tipos ptNodo
ptNodo == nodo;
nodo;
nodo
nodo == registro
registro
origen,destino:
origen,destino: 1..n;
1..n;
sigInvAdy,sigAdy:ptNodo
sigInvAdy,sigAdy:ptNodo
freg
freg
grafoDirigido
grafoDirigido ==
== registro
registro
adyacentes,
adyacentes, invAdyacentes:
invAdyacentes:
vector[1..n]
vector[1..n] de
de ptNodo
ptNodo
freg
freg
Ntese que se emplea la palabra adyacente con
el significado de sucesor, mientras que
adyacente inverso se refiere a predecesor.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 23

Caminos mnimos en grafos


Las listas mltiples pueden utilizarse tambin
para representar grafos no dirigidos.
De esta forma, en lugar de que a cada arista le
correspondan dos nodos en la estructura
dinmica (como ocurre con la representacin
basada en listas simples de adyacencia),
puede representarse cada arista con un solo nodo
y hacer que ste pertenezca a dos listas de
adyacencia diferentes.
1
2

1
2
3

nil

nil

nil

nil

Grafo no dirigido

Listas de adyacencia
1

1
2
3
4

nil

nil

nil nil

Listas mltiples de adyacencia

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 24

Caminos mnimos en grafos


La definicin de la estructura de datos es la
siguiente:
constante
constante nn == ...
... {cardinal
{cardinal de
de V}
V}
tipos
tipos ptNodo
ptNodo == nodo;
nodo;
nodo
nodo == registro
registro
v1,v2:1..n;
v1,v2:1..n;
sig1,sig2:ptNodo
sig1,sig2:ptNodo
freg
freg
grafoNoDirigido
grafoNoDirigido ==
== vector[1..n]
vector[1..n] de
de ptNodo
ptNodo
Una ventaja de esta representacin es que es til
para implementar aquellos algoritmos que
necesitan recorrer un grafo y al mismo tiempo
marcar las aristas por las que se pasa (bastara
con aadir un campo booleano al tipo nodo).

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 25

Caminos mnimos en grafos


v

Clculo del coste del camino mnimo


desde un vrtice dado al resto, en un
grafo etiquetado con pesos no
negativos

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.

Esquemas algortmicos - Algoritmos voraces Pg. 26

Caminos mnimos en grafos


E.W. Dijkstra:
A note on two problems in connexion with graphs,
Numerical Mathematica, 1, pp. 269-271, 1959.

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

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 27

Caminos mnimos en grafos


{Pre:
{Pre: gg es
es un
un grafo
grafo dirigido
dirigido etiquetado
etiquetado no
no neg.}
neg.}

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.

Esquemas algortmicos - Algoritmos voraces Pg. 28

Caminos mnimos en grafos


v

Correccin:
Apuntes de la asignatura de Matemtica Discreta
o buscar en bibliografa.

Se presenta a continuacin una


implementacin ms detallada
Se utiliza en lugar de S su complementario T
Se supone que n es el nmero de vrtices

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 29

Caminos mnimos en grafos


{Pre:
{Pre: gg es
es un
un grafo
grafo dirigido
dirigido etiquetado
etiquetado no
no neg.}
neg.}

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.

Esquemas algortmicos - Algoritmos voraces Pg. 30

Caminos mnimos en grafos


...
...
{se
{se marca
marca ww como
como vrtice
vrtice tratado}
tratado}

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)

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)

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 31

Caminos mnimos en grafos


v

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.

Esquemas algortmicos - Algoritmos voraces Pg. 32

Caminos mnimos en grafos


v

Mejoras en el tiempo de ejecucin


Si la representacin es por listas de adyacencia,
la fase de reclculo se ejecuta slo a (a<n2) 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.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 33

Caminos mnimos en grafos


gnero
gnero cpa
cpa {colaPriAristas}
{colaPriAristas}
operaciones
operaciones
creaVaca:
creaVaca:
cpa
cpa
inserta:
inserta: cpa
cpa vrt
vrt etiq
etiq
cpa
cpa
primero:
primero: cpa
cpa
(vrt,etiq)
(vrt,etiq)
borra:
borra: cpa
cpa
cpa
cpa
sustit:
sustit: cpa
cpa vrt
vrt etiq
etiq
cpa
cpa
valor:
cpa
vrt

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)

Implementacin: montculo junto con un vector


indexado por vrtices
1
2
3
4
5

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

Esquemas algortmicos - Algoritmos voraces Pg. 34

Caminos mnimos en grafos


{Pre:
{Pre: gg es
es un
un grafo
grafo dirigido
dirigido etiquetado
etiquetado no
no neg.}
neg.}

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.

Esquemas algortmicos - Algoritmos voraces Pg. 35

Caminos mnimos en grafos


v

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)

El coste total es:((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.
Puede conseguirse un coste en (n2) para grafos
densos y en (alog n) para no densos,
representando el montculo en un rbol k-ario
en lugar de binario [BB90, pp. 93-94].

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 36

Caminos mnimos en grafos


v

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

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 37

rboles de recubrimiento de
coste mnimo
v

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
optimizacin global: algunos pares de nodos
pueden no quedar conectados entre ellos con el
mnimo coste posible en el grafo original

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

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 38

rboles de recubrimiento de
coste mnimo
v

Terminologa:
rbol libre:
es un grafo no dirigido conexo acclico
u
u
u

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
notacin: arm(g)={rboles de recubrimiento
de coste mnimo de g}

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 39

rboles de recubrimiento de
coste mnimo
v

Propiedad fundamental de los rboles


de recubrimiento de coste mnimo:
Sea g un grafo no dirigido conexo y etiquetado
no negativamente, g{f:VVE},
sea U un conjunto de vrtices, UV, U,
si <u,v> es la arista ms pequea de g tal que
uU y vV\U,
entonces existe algn rbol de recubrimiento
de coste mnimo de g que la contiene.
Dem: Por reduccin al absurdo [AHU88, p. 234].

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 40

rboles de recubrimiento de
coste mnimo

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.

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

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 41

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.

Esquemas algortmicos - Algoritmos voraces Pg. 42

rboles de recubrimiento de
coste mnimo
v

La versin previa puede refinarse hasta


obtener un algoritmo en (n2), es decir,
mejor que el anterior (an-1).
Se usa un vector arisMn, indexado por vrtices,
que contiene:
si vU: arisMn[v]=<w,g(v,w)> t.q. <v,w> es la
arista ms pequea que conecta v
con un vrtice wU
si vU: arisMn[v]=<v,>

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 43

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.

Esquemas algortmicos - Algoritmos voraces Pg. 44

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.

Esquemas algortmicos - Algoritmos voraces Pg. 45

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)

Coste total: (n2), independientemente


de la representacin.
Coste espacial: (n) de espacio adicional.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 46

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.

Esquemas algortmicos - Algoritmos voraces Pg. 47

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

Nota: componentes(gsol) devuelve el conjunto de


componentes conexos de gsol.
() Utilizar una cola con prioridades.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 48

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

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]}

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 49

rboles de recubrimiento de
coste mnimo
v

Se utiliza el TAD relacin de


equivalencia sobre los vrtices

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.

Esquemas algortmicos - Algoritmos voraces Pg. 50

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.

Esquemas algortmicos - Algoritmos voraces Pg. 51

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.

Esquemas algortmicos - Algoritmos voraces Pg. 52

rboles de recubrimiento de
coste mnimo
v

Coste del algoritmo:


las a inserciones consecutivas de aristas en la cola
con prioridades dan (alog a); como an2:
(alog a)(alog n2)=(2alog n)=(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 (log a); por ello, este
paso queda en (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 (a)
las n-1 inserciones de aristas quedan en (n) con
matriz de adyacencia y (n2) con listas, aunque
en el caso de las listas puede reducirse tambin a
(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: (alog n)
(menos que el algoritmo de Prim, aunque con
mayor espacio adicional)

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 53

Consideraciones sobre la
correccin del esquema voraz
v

La seleccin de una candidata ptima


en cada paso es una estrategia
heurstica que no siempre conduce a la
solucin ptima.
En ocasiones, se utilizan heursticas
voraces para obtener soluciones
subptimas cuando el clculo de las
ptimas es demasiado costoso.
Puede saberse si una estrategia voraz
servir para resolver un problema
concreto de optimizacin?
La respuesta es: NO siempre.
Sin embargo, existen ciertos indicios:
la propiedad de la seleccin voraz y la
existencia de una subestructura
ptima.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 54

Consideraciones sobre la
correccin del esquema voraz
v

La propiedad de la seleccin voraz:


Se verifica esta propiedad cuando una solucin
globalmente ptima puede ser alcanzada
mediante selecciones localmente ptimas que
son tomadas en cada paso sin depender de las
selecciones futuras;
en otras palabras, una estrategia voraz progresa
de arriba hacia abajo, tomando una decisin
voraz tras otra, reduciendo iterativamente el
problema a otro ms pequeo.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 55

Consideraciones sobre la
correccin del esquema voraz
v

Cmo se comprueba si se verifica la


propiedad de la seleccin voraz?
Normalmente, se examina una solucin
globalmente ptima,
se trata de demostrar que esa solucin puede ser
manipulada de forma que se obtiene tras una
primera seleccin voraz (localmente ptima),
y esa seleccin reduce el problema a otro similar
pero ms pequeo;
se aplica induccin para demostrar que se puede
usar una seleccin voraz en cada paso
hay que demostrar que una solucin ptima
posee una subestructura ptima

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.

Esquemas algortmicos - Algoritmos voraces Pg. 56

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.

Esquemas algortmicos - Algoritmos voraces Pg. 57

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

Este cdigo ahorra algo ms del 25% (requiere


224.000 bits en lugar de 300.000).
v

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.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 58

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

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.
u Si el alfabeto que se quiere codificar es C, entonces el rbol del cdigo ptimo tiene |C|
hojas y |C|-1 nodos internos.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 59

Cdigos de Huffman
v

El algoritmo voraz de Huffman construye 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.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 60

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.

Esquemas algortmicos - Algoritmos voraces Pg. 61

Cdigos de Huffman
v

Para el ejemplo anterior:

f:5

e:9 c:12 b:13 d:16 a:45

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

Esquemas algortmicos - Algoritmos voraces Pg. 62

Cdigos de Huffman
v

Coste temporal:
inicializacin de Q: (|C|) (ejercicio)
el interior del bucle: (log |C|)

Coste total: (|C|log |C|)


Correccin: ver que se verifican las
propiedades de la seleccin voraz y de
la subestructura ptima.
Propiedad de la seleccin voraz:
Sea C un alfabeto en el que cada carcter c tiene
frecuencia f[c]. Sean x e y dos caracteres de C con
frecuencias mnimas. Entonces existe un cdigo
libre de prefijos ptimo para C en el que las
codificaciones de x e y tienen igual longitud y se
diferencian slo en el ltimo bit.
La idea de la demostracin consiste en tomar un
rbol que represente un cdigo libre de prefijos
ptimo arbitrario y modificarlo hasta convertirlo
en otro rbol que represente otro cdigo libre de
prefijos ptimo y tal que los caracteres x e y
aparezcan como hojas hermanas de mxima
profundidad.
Detalles en [CLR90, pp. 342-343].

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 63

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

Propiedad de la subestructura ptima:


Sea T un rbol binario lleno que representa un
cdigo libre de prefijos ptimo sobre un alfabeto
C, con frecuencia f[c] para cada carcter cC.
Sean x e y dos caracteres que aparecen como
hojas hermanas en T, y sea z su padre. Entonces,
considerando z como un carcter con frecuencia
f[z]=f[x]+f[y], el rbol T=T-{x,y} representa un
cdigo libre de prefijos ptimo para el alfabeto
C=C-{x,y}{z}.
La demostracin, en [CLR90, p. 343].

La correccin del algoritmo se sigue de


los dos resultados anteriores, aplicando
induccin.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 64

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.

Esquemas algortmicos - Algoritmos voraces Pg. 65

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.

Esquemas algortmicos - Algoritmos voraces Pg. 66

El problema de la seleccin de
actividades
v

Coste temporal: (n)


(nlog n) si se tiene en cuenta que hay que
ordenar primero los vectores.

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.

Esquemas algortmicos - Algoritmos voraces Pg. 67

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.

Esquemas algortmicos - Algoritmos voraces Pg. 68

El problema de la minimizacin del tiempo de espera


v
v

v
v

Es otro problema de planificacin de


tareas.
Un servidor (por ej., un procesador, un
cajero automtico, un surtidor de gasolina, etc.) tiene que atender n clientes
que llegan todos juntos al sistema.
El tiempo de servicio para cada cliente
es ti, i=1,2,,n.
Se quiere minimizar:
n

tiempo total que el cliente i est en el sistema

i=1

T=

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 69

El problema de la minimizacin del tiempo de espera


v

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

Esquemas algortmicos - Algoritmos voraces Pg. 70

El problema de la minimizacin del tiempo de espera


v

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

Supongamos que I es tal que es posible encontrar


dos naturales a y b con a<b y tia>tib, es decir, que
el cliente a-simo es atendido antes que el
b-simo aunque su tiempo de servicio es mayor.
Si se invierten sus posiciones en I se obtiene una
nueva secuencia I.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 71

El problema de la minimizacin del tiempo de espera


Entonces:

T(I) = (n-a+1)tib + (n-b+1)tia +

(n-k+1)t

k=1

ik

ka,b

T(I) - T(I) = (n-a+1)(tia-tib) + (n-b+1)(tib-tia)


= (b-a)(tia-tib)
>0
Es decir, se puede mejorar cualquier secuencia en
la que un cliente que necesita ms tiempo sea
atendido antes que otro que necesita menos.
Las nicas secuencias que no pueden mejorarse,
y por tanto son ptimas, son aqullas en las que
los clientes estn ordenados por tiempos de
servicio decrecientes (todas ellas dan igual
tiempo total).
n

Puede generalizarse a s procesadores.


Se numeran los clientes de forma que t1t2 tn.
El procesador i, 1is, atender a los clientes i,
i+s, i+2s,

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 72

Fundamentos tericos del


esquema voraz
v

Existe una teora matemtica


que sirve de base a los
algoritmos voraces:
Teora de matroides

Un matroide es un par M=(S,I) t.q.:


S es un conjunto finito no vaco.
I es una familia no vaca de subconjuntos de S,
llamados subconjuntos independientes, t.q. si
BI y AB, entonces AI.
Por cumplir esta propiedad, I se dice hereditaria
(ntese que el conjunto vaco es necesariamente
un miembro de I).
Si AI, BI y |A|<|B|, entonces existe algn
xB\A t.q. A{x}I.
Se dice que M satisface la propiedad de
intercambio.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 73

Fundamentos tericos del


esquema voraz
v

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.

Esquemas algortmicos - Algoritmos voraces Pg. 74

Fundamentos tericos del


esquema voraz
v

Sea M=(S,I) y BI. Un elemento xB se


dice extensin de B si B{x}I.
Ejemplo: en un matroide grfico MG, si B es un
conjunto independiente de aristas, entonces la
arista a es una extensin de B si y slo si a no est
en B y la incorporacin de a a B no crea un ciclo.

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.

Esquemas algortmicos - Algoritmos voraces Pg. 75

Fundamentos tericos del


esquema voraz
v

Un matroide M=(S,I) al que se le asocia


una funcin que asigna un peso
estrictamente positivo w(x) a cada xS
se llama matroide ponderado.
La funcin de peso w se extiende a los
subconjuntos de S mediante la suma:
w(A) = w(x), para todo AS.
xA

Ejemplo: si w(a) denota la longitud de la arista a


en un matroide grfico MG, entonces w(B) es la
longitud total de todas las aristas del
subconjunto de aristas B.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 76

Fundamentos tericos del


esquema voraz
v

Voracidad y matroides.

Muchos de los problemas para


los que un algoritmo voraz calcula la solucin ptima pueden
formularse en trminos de
encontrar un subconjunto
independiente de mximo peso
en un matroide ponderado.

Es decir, dado un matroide ponderado M=(S,I),


se quiere encontrar un subconjunto A
independiente (i.e., AI) tal que w(A) sea
mximo.
Un subconjunto independiente y de mximo
peso en un matroide ponderado se llama
subconjunto ptimo del matroide.
Como la funcin de peso w es positiva, un
subconjunto ptimo siempre es maximal
(i.e., no tiene extensiones, ya que aumentar un
conjunto siempre incrementa su peso).
J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 77

Fundamentos tericos del


esquema voraz
v

Ejemplo: el problema del rbol de


recubrimiento de coste mnimo.
Sea un grafo no dirigido y conexo G=(V,A) y una
funcin de longitud w tal que w(a) es la longitud
positiva de la arista a
(llamamos longitudes a las etiquetas del grafo en
lugar de pesos por reservar esta palabra para la
funcin definida sobre un matroide).
El problema consiste en encontrar un subconjunto de aristas que conecte todos los vrtices del
grafo y tenga longitud mnima.
Considerar MG y la funcin de peso w definida
como: w(a) = w0-w(a), donde w0 es un valor
mayor que la longitud de todas las aristas.
En este matroide ponderado, todos los pesos son
positivos y un subconjunto ptimo es
precisamente un rbol de recubrimiento del
grafo original con longitud total mnima.
Ms especficamente, cada subconjunto independiente maximal B corresponde a un rbol de
recubrimiento, y puesto que
w(B) = (|V|-1)w0-w(B)
para todo subconjunto independiente maximal B,
el subconjunto independiente que maximiza
w(B) debe minimizar w(B).

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 78

Fundamentos tericos del


esquema voraz
v

Algoritmo voraz de clculo de un


subconjunto ptimo en un matroide
arbitrario:

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

Esquemas algortmicos - Algoritmos voraces Pg. 79

Fundamentos tericos del


esquema voraz
v

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.

Esquemas algortmicos - Algoritmos voraces Pg. 80

Fundamentos tericos del


esquema voraz
v

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.

Esquemas algortmicos - Algoritmos voraces Pg. 81

Fundamentos tericos del


esquema voraz
v

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.

Esquemas algortmicos - Algoritmos voraces Pg. 82

Un problema de planificacin
de tareas a plazo fijo
v
v
v
v
v

Se tiene un conjunto S={1,2,,n} de


tareas de duracin unidad.
En cada instante, slo se puede realizar
una tarea.
La tarea i, 1in, debe terminarse antes
del instante (o plazo) di, con 1din.
Hay una penalizacin wi, 1in, si la
tarea i no termina antes de su plazo.
Se trata de encontrar una secuencia de
realizacin de las tareas que minimice
la penalizacin total.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 83

Un problema de planificacin
de tareas a plazo fijo
v

Una tarea en una secuencia se dice


puntual si termina antes de su plazo, y
tarda si lo hace despus de su plazo.
Una secuencia est en forma puntuales primero si todas las tareas puntuales estn antes de las tardas.
Cualquier secuencia puede transformarse en forma puntuales primero.
En efecto, si una tarea puntual x va detrs de una
tarea tarda y, pueden intercambiarse sus
posiciones de forma que x sigue siendo puntual e
y tarda.

Una secuencia est en forma cannica


si est en forma puntuales primero y
las tareas puntuales estn ordenadas
por valores no decrecientes de sus
plazos.
Cualquier secuencia puede transformarse en forma cannica.
Argumentacin similar a la anterior.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 84

Un problema de planificacin
de tareas a plazo fijo
v

Encontrar una secuencia ptima es encontrar un conjunto A de tareas que


sean puntuales en la secuencia ptima.
Una vez encontrado A, la secuencia se
crea ordenando los elementos de A por
plazos no decrecientes y a continuacin
las tareas tardas (en S-A) en cualquier
orden.
Decimos que un conjunto A de tareas es
independiente si existe una ordenacin
de las mismas en la que ninguna es
tarda.
Por ejemplo, el conjunto de tareas puntuales de
una secuencia es un conjunto independiente.

Denotamos con I el conjunto de todos


los conjuntos independientes de tareas.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 85

Un problema de planificacin
de tareas a plazo fijo
v
v

Sea Nt(A), t=1,,n, el nmero de tareas


de A cuyo plazo es menor o igual que t.
Lema. Sea A un conjunto de tareas. Son
equivalentes:
1. A es independiente.
2. Nt(A)t, para t=1,,n.
3. Si las tareas de A se ordenan por plazos no
decrecientes, entonces ninguna tarea es tarda.
Dem.: (1)(2) Si Nt(A)>t para algn t, entonces no
hay forma de construir una secuencia con las
tareas de A de forma que ninguna sea tarda.
(2)(3) El i-simo plazo mayor es como mucho i.
Por tanto, ordenando las tareas por plazos no
decrecientes, no hay forma de que alguna tarea
sea tarda.
(3)(1) Trivial.
n

Corolario. La propiedad (2) del lema


anterior sirve para decidir en tiempo
O(|A|) si un conjunto de tareas es
independiente.
Dem.: Ejercicio.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 86

Un problema de planificacin
de tareas a plazo fijo
v

El problema de minimizar la suma de


penalizaciones de las tareas tardas de
una secuencia es el mismo que el de
maximizar la suma de penalizaciones
de sus tareas puntuales.
Teorema. Si S es un conjunto de tareas
de duracin unidad con penalizaciones
e I es el conjunto de todos los conjuntos
independientes de tareas, entonces (S,I)
es un matroide.
Dem.: Es claro que todo subconjunto de un
conjunto independiente de tareas es tambin
independiente.
Para demostrar la propiedad del intercambio,
supongamos que B y A son conjuntos
independientes de tareas con |B|>|A|.
Sea k el mayor t tal que Nt(B)Nt(A).
Como Nn(B)=|B| y Nn(A)=|A|, se sigue que k<n
y que Nj(B)>Nj(A) para todo j tal que k+1jn.
Por tanto, B tiene ms tareas con plazo k+1 que
A.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 87

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

Corolario. Se puede utilizar un


algoritmo voraz para encontrar un
conjunto independiente de tareas A con
penalizacin mxima.
A continuacin, se puede crear una
secuencia ptima que tiene como tareas
puntuales las de A.
Tiempo de ejecucin: O(n2)
Por qu?

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 88

Heursticas voraces:
Coloreado de grafos
v

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.
3
1

5
4

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 89

Heursticas voraces:
Coloreado de grafos
Algoritmo voraz de coloreado de un grafo:
u

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.
3
1

5
4

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 90

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

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.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 91

Heursticas voraces: El problema del viajante de comercio


v

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.

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 92

Heursticas voraces: El problema del viajante de comercio


v

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

Esquemas algortmicos - Algoritmos voraces Pg. 93

Heursticas voraces: El problema del viajante de comercio


v

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:
c
b
a

J. Campos - C.P.S.

d
f

Esquemas algortmicos - Algoritmos voraces Pg. 94

Heursticas voraces: El problema del viajante de comercio


v

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.

Esquemas algortmicos - Algoritmos voraces Pg. 95

Heursticas voraces: El problema del viajante de comercio


v

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.

Esquemas algortmicos - Algoritmos voraces Pg. 96

Heursticas voraces: El problema del viajante de comercio

(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:
c

d
b

e
f

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

J. Campos - C.P.S.

Esquemas algortmicos - Algoritmos voraces Pg. 97

También podría gustarte