Vous êtes sur la page 1sur 63

Problemas de Decisin y

Optimizacin

Un problema de decisin se puede


expresar como:
Un conjunto de variables X=(x1,x2,...,xn)
Cada variable xi tiene un dominio Di =(v1,v2,...,vm)
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. 1

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

Ej. 1: n-reinas

Formulacin 1:
Variables: X={xij}
xij {0,1}

no hay/hay reina en (i,j)

Restricciones:

ij

(i, j ), (k , l )

( xij xkl 1)
(i j ) ( j l ) (| i k || j l |)

Formulacin 2:
Variables: X={xi}
xij {1,..,n}
columna j
Restricciones:

la reina de la fila i est en la

( x1 , x2 ,..., xn ) Permut (1,2,..., n)


i, j

(| i j || xi x j |)

Algoritmos voraces Pg. 3

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={x1, x2,..., xn}

xi {1,2,...,k}

color del vrtice i

Restricciones:

(i, j ) E

Algoritmos voraces Pg. 4

xi x j

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={x1, x2,..., xn}

xi {1,2,...,n}

vrtice visitado en la etapa i

Restricciones:

( x1 , x2 ,..., xn ) Permut (1,2,..., n)


1 i n ( xi , x(i 1)%2 ) E

Algoritmos voraces Pg. 5

Problemas de Decisin y
Optimizacin

Un problema de optimizacin se puede


expresar como:
Un conjunto de variables X=(x1,x2,...,xn)
Cada variable xi tiene un dominio Di =(v1,v2,...,vm)
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. 6

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={x1, x2,..., xn}

xi {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)= xn etiq(i)

Algoritmos voraces Pg. 7

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={x1, x2,..., xn}

xi {1,2,...,n}

vrtice visitado en la etapa i

Restricciones:

( x1 , x2 ,..., xn ) Permut (1,2,..., n)

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

Algoritmos voraces Pg. 8

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

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

Problema del cambio en


monedas

Se trata de devolver una cantidad de


dinero con el menor nmero posible de
monedas.
Se parte de:
un sistema monetario (v1,v2,...,vn), y suficientes
monedas de cada tipo
un importe a devolver C.

Formulacin:
Variables: X=(x1,x2,...,xn),

xi {0,1,..,C}

nmero de monedas de tipo i

Restricciones: xi vi = C
Funcin objetivo: xi

Criterio voraz:
Tomar el mximo de monedas (sin sobrepasar C)
en orden decreciente de valor

Algoritmos voraces Pg. 11

Cambio de monedas

tipomoneda=(M25,M10,M5,M1)
tipomoneda=(M25,M10,M5,M1)
funcincambia(importe:nat;
funcincambia(importe:nat;
valor:vector[moneda]denat)
valor:vector[moneda]denat)
devuelvevector[moneda]denat
devuelvevector[moneda]denat
variablemon:moneda;
variablemon:moneda;
cambio:vector[moneda]denat
cambio:vector[moneda]denat
principio
principio
paratodomonenmonedahacer
paratodomonenmonedahacer
cambio[mon]:=0
cambio[mon]:=0
fpara;
fpara;
paramon:=M25hastaM1hacer
paramon:=M25hastaM1hacer
mqvalor[mon]?importehacer
mqvalor[mon]?importehacer
cambio[mon]:=cambio[mon]+1;
cambio[mon]:=cambio[mon]+1;
importe:=importevalor[mon]
importe:=importevalor[mon]
fmq
fmq
fpara;
fpara;
devuelvecambio
devuelvecambio
fin
fin

Algoritmos voraces Pg. 12

Cambio de monedas

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?

Algoritmos voraces Pg. 13

El problema de la mochila

Sean:
n objetos fraccionables.
(p1,...,pn), pesos.
(b1,...,bn), 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=(x1,x2,...,xn),

0 xi 1 porcin que tomo del objeto i

Restricciones:

xi

Funcin objetivo:

F(X) = xi bi

pi C

Observaciones:
Podemos suponer p1++pn>C.
Podemos poner un = en la restriccin

Algoritmos voraces Pg. 14

El problema de la mochila

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

Tres soluciones factibles:

bixi
(x1,x2,x3) 1i3
(i) (1,1/6,0)
(ii) (0,3/4,1)
(iii) (0,1,5/8)

Algoritmos voraces Pg. 15

46
49
4975

El problema de la mochila
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.

Algoritmos voraces Pg. 16

El problema de la mochila
constanten=...
constanten=...{nmerodeobjetos}
{nmerodeobjetos}
tipovectReal=vector[1..n]dereal
tipovectReal=vector[1..n]dereal
{Pre:i1..n:peso[i]>0,
{Pre:i1..n:peso[i]>0,
i1..n1:
i1..n1:
benef[i]/peso[i]?benef[i+1]/peso[i+1]}
benef[i]/peso[i]?benef[i+1]/peso[i+1]}

funcinmochila(benef,peso:vectReal;
funcinmochila(benef,peso:vectReal;
cap:real)devuelvevectReal
cap:real)devuelvevectReal
variablesresto:real;i:entero;
variablesresto:real;i:entero;
sol:vectReal
sol:vectReal
principio
principio
paratodoien1..nhacer
paratodoien1..nhacer
sol[i]:=0.0
sol[i]:=0.0{inicializarsolucin}
{inicializarsolucin}
fpara;
fpara;
resto:=cap;
resto:=cap;{capacidadrestante}
{capacidadrestante}
i:=1;
i:=1;
mq(i?n)and(peso[i]?resto)hacer
mq(i?n)and(peso[i]?resto)hacer
sol[i]:=1;
sol[i]:=1;
resto:=restopeso[i];
resto:=restopeso[i];
i:=i+1
i:=i+1
fmq;
fmq;
sii?nentoncessol[i]:=resto/peso[i]fsi;
sii?nentoncessol[i]:=resto/peso[i]fsi;
devuelvesol
devuelvesol

Algoritmos voraces Pg. 17

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

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

Caminos mnimos
{Pre:gesungrafodirigidoetiquetadononeg.}
{Pre:gesungrafodirigidoetiquetadononeg.}

funcinDijkstra(g:grafo;v:vrt)
funcinDijkstra(g:grafo;v:vrt)
devuelvevector[vrt]deetiq
devuelvevector[vrt]deetiq
variablesS:cjtVrt;
variablesS:cjtVrt;
D:vector[vrt]deetiq
D:vector[vrt]deetiq
principio
principio
wvrt:D[w]:=etiqueta(g,v,w);
wvrt:D[w]:=etiqueta(g,v,w);
D[v]:=0;S:={v};
D[v]:=0;S:={v};
mqSnocontengatodoslosvrticeshacer
mqSnocontengatodoslosvrticeshacer

elegirwSt.q.D[w]esmnimo;
elegirwSt.q.D[w]esmnimo;
S:=S{w};
S:=S{w};
uS:actualizardist.mn.comprobando
uS:actualizardist.mn.comprobando
siporwhayunatajo
siporwhayunatajo
fmq;
fmq;
devuelveD
devuelveD
fin
fin

Algoritmos voraces Pg. 20

Caminos mnimos

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

funcinDijkstra(g:grafo;v:vrt)
funcinDijkstra(g:grafo;v:vrt)
devuelvevector[vrt]deetiq
devuelvevector[vrt]deetiq
variablesT:cjtVrt;
variablesT:cjtVrt;
D:vector[vrt]deetiq;
D:vector[vrt]deetiq;
u,w:vrt;val:etiq
u,w:vrt;val:etiq
principio
principio
T:=;
T:=;
paratodowenvrthacer
paratodowenvrthacer
D[w]:=etiqueta(g,v,w);T:=T{w}
D[w]:=etiqueta(g,v,w);T:=T{w}
fpara;
fpara;
D[v]:=0;T:=T{v};
D[v]:=0;T:=T{v};
repetirn2veces
repetirn2veces{quedann1caminospor
{quedann1caminospor

determinar}
determinar}

{seleccindelmn.w:w
{seleccindelmn.w:wT,
T,uuT:D[w]?D[u]}
T:D[w]?D[u]}

val:=?;
val:=?;
paratodouenThacer
paratodouenThacer
siD[u]?valentw:=u;val:=D[u]fsi
siD[u]?valentw:=u;val:=D[u]fsi
fpara;
fpara;
...
...

Algoritmos voraces Pg. 21

Caminos mnimos
...
...
T:=T{w};
T:=T{w};

{serecalculanlasnuevasdist.mnimas}
{serecalculanlasnuevasdist.mnimas}
paratodouenThacer
paratodouenThacer
siD[w]+etiqueta(g,w,u)<D[u]
siD[w]+etiqueta(g,w,u)<D[u]
entD[u]:=D[w]+etiqueta(g,w,u)
entD[u]:=D[w]+etiqueta(g,w,u)
fsi
fsi
fpara
fpara
frepetir;
frepetir;
devuelveD
devuelveD
fin
fin
{Post:D=caminosMnimos(g,v)
{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. 22

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: (n)
fase de seleccin:
las instrucciones del interior del bucle son
(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 (n2)
fase de marcaje:
n supresiones a lo largo del algoritmo: (n)
fase de reclculo de las distancias mnimas:
queda (n2) por igual razn que la seleccin
Coste total: (n2)

Algoritmos voraces Pg. 23

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

Algoritmos voraces Pg. 24

Caminos mnimos
TADcpa
TADcpa{colaPrior.DeAristas}
{colaPrior.DeAristas}
operaciones
operaciones
creaVaca:cpa
(1)
creaVaca:cpa
(1)
inserta:cpavrtetiqcpa
inserta:cpavrtetiqcpa (log
(log
n)
n)
primero:cpa(vrt,etiq)
(1)
primero:cpa(vrt,etiq)
(1)
borra:cpacpa
(log
borra:cpacpa
(log
n)
n)
sustit:cpavrtetiqcpa
sustit:cpavrtetiqcpa (log
(log
n)
n)
valor:cpavrtetiq
(1)
valor:cpavrtetiq
(1)
est?:cpavrtbool
(1)
est?:cpavrtbool
(1)

Implementacin:
heap
junto
con
un
vector
vaca?:cpabool
(1)
vaca?:cpabool
(1)
indexado por vrtices

1
2
3
4
5

<4,20>
<3,75>
<2,?>

Algoritmos voraces Pg. 25

<5,60>

el valor de la etiqueta
significa que el vrtice
no est en la cola

Caminos mnimos
funcinDijkstra(g:grafo;v:vrt)
funcinDijkstra(g:grafo;v:vrt)
devuelvevector[vrt]deetiq
devuelvevector[vrt]deetiq
variablesA:cpa;
variablesA:cpa;{coladearistasconprior.}
{coladearistasconprior.}
D:vector[vrt]deetiq;
D:vector[vrt]deetiq;
u,w:vrt;et,val:etiq
u,w:vrt;et,val:etiq
principio
principio
creaVaca(A);
creaVaca(A);
paratodowenvrthacer
paratodowenvrthacer
inserta(A,w,etiqueta(g,v,w))
inserta(A,w,etiqueta(g,v,w))
fpara;
fpara;
mqnoesVaca(A)hacer
mqnoesVaca(A)hacer
<w,val>:=primero(A);
<w,val>:=primero(A);
D[w]:=val;borra(A);
D[w]:=val;borra(A);
paratodo<u,et>ensuc(g,w)hacer
paratodo<u,et>ensuc(g,w)hacer
siest(A,u)entonces
siest(A,u)entonces
sival+et<valor(A,u)
sival+et<valor(A,u)
entsustituye(A,u,val+et)
entsustituye(A,u,val+et)
fsi
fsi
fsi
fsi
fpara
fpara
fmq;
fmq;
D[v]:=0;devuelveD
D[v]:=0;devuelveD
fin
fin

Algoritmos voraces Pg. 26

Caminos mnimos

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

Algoritmos voraces Pg. 27

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

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

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

MSTs
V. Jarnk: O jistm problmu minimlnm,
Prca Moravsk Prrodovedeck Spolecnosti,
6, pp. 57-63, 1930.

R.C. Prim:
Shortest connection networks and some generalization
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

Algoritmos voraces Pg. 31

MSTs
{Pre:gesungrafonodirigidoconexo
{Pre:gesungrafonodirigidoconexo
etiquetadononegativamente}
etiquetadononegativamente}

funcinPrim(g:grafo)devuelvegrafo
funcinPrim(g:grafo)devuelvegrafo
variablesU:cjtVrt;gsol:grafo;
variablesU:cjtVrt;gsol:grafo;
u,v:vrt;x:etiq
u,v:vrt;x:etiq
principio
principio
creaVaco(gsol);U:={cualquiervrtice};
creaVaco(gsol);U:={cualquiervrtice};
mqUnocontengatodoslosvrt.hacer
mqUnocontengatodoslosvrt.hacer
seleccionar<u,v,x>mnimat.q.u
seleccionar<u,v,x>mnimat.q.uU;v
U;vUU
aade(gsol,u,v,x);U:=U
aade(gsol,u,v,x);U:=U{v}
{v}
fmq;
fmq;
devuelvegsol
devuelvegsol
fin
fin
{Post:gsolarm(g)}
{Post:gsolarm(g)}

Coste: (na)
(es decir, (n3) si el grafo es denso)

Algoritmos voraces Pg. 32

MSTs

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

Algoritmos voraces Pg. 33

MSTs
{Pre:gesungrafonodirigidoconexo
{Pre:gesungrafonodirigidoconexo
etiquetadononegativamente}
etiquetadononegativamente}

funcinPrim(g:grafo)devuelvegrafo
funcinPrim(g:grafo)devuelvegrafo
variables
variables
arisMn:vector[vrt]de<vrt,etiq>;
arisMn:vector[vrt]de<vrt,etiq>;
gsol:grafo;prim,mn,v,w:vrt;x:etiq
gsol:grafo;prim,mn,v,w:vrt;x:etiq
principio
principio
prim:=unVrticeCualquiera;
prim:=unVrticeCualquiera;
arisMn[prim]:=<prim,?>;
arisMn[prim]:=<prim,?>;
paratodovenvrthacer
paratodovenvrthacer
arisMn[v]:=<prim,etiqueta(g,prim,v)>
arisMn[v]:=<prim,etiqueta(g,prim,v)>
fpara;
fpara;

creaVaco(gsol);
creaVaco(gsol);
hacern1veces
hacern1veces
mn:=prim;
mn:=prim;{centinela:arisMn[mn].et=?}
{centinela:arisMn[mn].et=?}
paratodovenvrthacer
paratodovenvrthacer
<w,x>:=arisMn[v];
<w,x>:=arisMn[v];
six<arisMn[mn].et
six<arisMn[mn].et
entmn:=v
entmn:=v
fsi;
fsi;
fpara;
fpara;
...
...

Algoritmos voraces Pg. 34

MSTs
...
...
aade(gsol,mn,arisMn[mn].v,
aade(gsol,mn,arisMn[mn].v,
arisMn[mn].et);
arisMn[mn].et);
arisMn[mn]:=<mn,?>;
arisMn[mn]:=<mn,?>;
paratodo<v,x>enadyacentes(g,mn)hacer
paratodo<v,x>enadyacentes(g,mn)hacer
si(arisMn[v].v?v)y(x<arisMn[v].et)
si(arisMn[v].v?v)y(x<arisMn[v].et)
entoncesarisMn[v]:=<mn,x>fsi
entoncesarisMn[v]:=<mn,x>fsi
fpara
fpara
frepetir;
frepetir;
devuelvegsol
devuelvegsol
fin
fin
{Post:gsolarm(g)}
{Post:gsolarm(g)}

Algoritmos voraces Pg. 35

MSTs

Eficiencia temporal:
inicializacin: lineal en caso de matriz de
adyacencia y cuadrtica en caso de listas
bucle principal:
el bucle de seleccin: (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 (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.

Algoritmos voraces Pg. 36

MSTs

J.B. Kruskal: On the shortest spanning subtree of a grap


and the traveling salesman problem, Proceedings of th
American Mathematical Society, 7, pp. 48-50, 1956.

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.

Algoritmos voraces Pg. 37

MSTs
{Pre:gesungrafonodirigidoconexo
{Pre:gesungrafonodirigidoconexo
etiquetadononegativamente}
etiquetadononegativamente}

funcinKruskal(g:grafo)devuelvegrafo
funcinKruskal(g:grafo)devuelvegrafo
variablesgsol:grafo;
variablesgsol:grafo;
u,v:vrt;x:etiq
u,v:vrt;x:etiq
principio
principio
creaVaco(gsol);
creaVaco(gsol);
mqgsolnoseaconexohacer
mqgsolnoseaconexohacer ()
seleccionar<u,v,x>mnimanoexaminada;
seleccionar<u,v,x>mnimanoexaminada;
sinoprovocaciclo
sinoprovocaciclo
entoncesaade(gsol,u,v,x)
entoncesaade(gsol,u,v,x)
fsi
fsi
fmq;
fmq;
devuelvegsol
devuelvegsol
fin
fin
{Post:gsolarm(g)}
{Post:gsolarm(g)}

Nota: componentes(gsol) devuelve el conjunto de


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

Algoritmos voraces Pg. 38

MSTs

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

Algoritmos voraces Pg. 39

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

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

MSTs

Se utiliza el TAD relacin de


equivalencia sobre los vrtices

gnerorev
gnerorev{relac.deequiv.sobrevrt.}
{relac.deequiv.sobrevrt.}
operaciones
operaciones
creaREV:
creaREV:
rev
rev{cadavrt.unaclase}
{cadavrt.unaclase}
clase:revvrt
clase:revvrt
nat
nat
fusiona:revnatnat
fusiona:revnatnat
rev
rev
numClases:rev

numClases:rev
nat
nat
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 (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)

Algoritmos voraces Pg. 40

MSTs
{Pre:gesungrafonodirigidoconexo
{Pre:gesungrafonodirigidoconexo
etiquetadononegativamente}
etiquetadononegativamente}

funcinKruskal(g:grafo)devuelvegrafo
funcinKruskal(g:grafo)devuelvegrafo
variablesT:cpa;gsol:grafo;
variablesT:cpa;gsol:grafo;
u,v:vrt;x:etiq;
u,v:vrt;x:etiq;
C:rev;ucomp,vcomp:nat
C:rev;ucomp,vcomp:nat
principio
principio
creaREV(C);
creaREV(C);{cadavrt.formaunaclase}
{cadavrt.formaunaclase}
creaVaco(gsol);creaVaca(T);
creaVaco(gsol);creaVaca(T);

{secolocantodaslasaristasenlacola}
{secolocantodaslasaristasenlacola}
paratodovenvrthacer
paratodovenvrthacer
paratodo<u,x>enadyacentes(g,v)hacer
paratodo<u,x>enadyacentes(g,v)hacer
inserta(T,v,u,x)
inserta(T,v,u,x)
fpara
fpara
fpara;
fpara;
...
...

Algoritmos voraces Pg. 41

MSTs
...
...
mqnumClases(C)>1hacer
mqnumClases(C)>1hacer

{obteneryeliminarlaaristamn.delacola}
{obteneryeliminarlaaristamn.delacola}
<u,v,x>:=primero(T);borra(T);
<u,v,x>:=primero(T);borra(T);

{silaaristanoprovocacicloseaadeala
{silaaristanoprovocacicloseaadeala

solucinysefusionanlasclasescorresp.}
solucinysefusionanlasclasescorresp.}
ucomp:=clase(C,u);vcomp:=clase(C,v);
ucomp:=clase(C,u);vcomp:=clase(C,v);
siucomp?vcompentonces
siucomp?vcompentonces
fusiona(C,ucomp,vcomp);
fusiona(C,ucomp,vcomp);
aade(gsol,u,v,x)
aade(gsol,u,v,x)
fsi
fsi
fmq;
fmq;
devuelvegsol
devuelvegsol
fin
fin
{Post:gsolarm(g)}
{Post:gsolarm(g)}

Algoritmos voraces Pg. 42

MSTs

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)

Algoritmos voraces Pg. 43

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.

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

Algoritmos voraces Pg. 44

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
b
cd.long.var.
0
1101
1100

c
d
e
f
101 100 111

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.

Algoritmos voraces Pg. 45

Cdigos de Huffman

Ejemplo: rboles de los dos cdigos


anteriores.

10
0

86

14

58
0

28
0

a:45 b:13

10
0

a:45

55
0

14
1

c:12 d:16

e:9

f:5

25
0

30
1

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

Algoritmos voraces Pg. 46

Cdigos de Huffman

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.

Algoritmos voraces Pg. 47

Cdigos de Huffman
{Pre:Ceselconjuntodecaracteresyfesel
{Pre:Ceselconjuntodecaracteresyfesel
vectordefrecuencias}
vectordefrecuencias}

funcinHuffman(C:conjunto;f:vectFrec)
funcinHuffman(C:conjunto;f:vectFrec)
devuelverbol
devuelverbol
variablesQ:colaPri;i,fx,fy,fz:entero;
variablesQ:colaPri;i,fx,fy,fz:entero;
z,x,y:rbol
z,x,y:rbol
principio
principio
creaVaca(Q);
creaVaca(Q);
paratodoxenChacer
paratodoxenChacer
inserta(Q,<x,f[x]>)
inserta(Q,<x,f[x]>)
fpara;
fpara;
parai:=1hasta|C|1hacer
parai:=1hasta|C|1hacer
<x,fx>:=primero(Q);borra(Q);
<x,fx>:=primero(Q);borra(Q);
<y,fy>:=primero(Q);borra(Q);
<y,fy>:=primero(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);borra(Q)
<z,fz>:=primero(Q);borra(Q)
devuelvez
devuelvez
fin
fin
{Post:zeselrboldeuncdigolibrede
{Post:zeselrboldeuncdigolibrede
prefijosptimopara(C,f)}
prefijosptimopara(C,f)}

Coste temporal: (|C|log |C|)


Algoritmos voraces Pg. 48

Cdigos de Huffman

Para el ejemplo anterior:

f:5

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

(1)

(2)

d:16 25 a:45
0
1
1

f:5

e:9

(3) 14

c:12 b:13 14 d:16 a:45


1
0

c:12 b:13

f:5

55
0

(5)

25
0

30
1

c:12 b:13

d:16

14

f:5

e:9

Algoritmos voraces Pg. 49

c:12 b:13

a:45

30

25

(4)

a:45

e:9

d:16

14
0

f:5

e:9

10
0

a:45

55
0

(6)

25
0

30
1

c:12 b:13

d:16

14

f:5

e:9

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:
ci instante de comienzo
fi instante de finalizacin fi
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.

Algoritmos voraces Pg. 50

Seleccin de Actividades

Formulacin:
Variables: X={x1, x2,..., xn}

xi {0,1}

Escojo o no la actividad i

Restricciones:

i, j

( xi x j 1) ci f j c j f i

Funcin Objetivo: F(X)= xn

Algoritmos voraces Pg. 51

seleccin de actividades
constanten=...
constanten=...{nmerodeactividades}
{nmerodeactividades}
tipovectReal=vector[1..n]dereal
tipovectReal=vector[1..n]dereal
{Pre:i1..n:c[i]?f[i],i1..n1:f[i]?f[i+1]}
{Pre:i1..n:c[i]?f[i],i1..n1:f[i]?f[i+1]}

funcinselec(c,f:vectReal)devuelveconjunto
funcinselec(c,f:vectReal)devuelveconjunto
variablesi,j:entero;A:conjunto
variablesi,j:entero;A:conjunto
principio
principio
A:={1};
A:={1};
j:=1;
j:=1;{jeslaltimaactividadseleccionada}
{jeslaltimaactividadseleccionada}
parai:=2hastanhacer
parai:=2hastanhacer
sic[i]?f[j]
sic[i]?f[j]
entoncesA:=A{i};j:=i
entoncesA:=A{i};j:=i
fsi
fsi
fpara;
fpara;
devuelveA
devuelveA
fin
fin
{Post:Aessolucinptimadelproblemade
{Post:Aessolucinptimadelproblemade
laseleccindeactividades.}
laseleccindeactividades.}

Coste

temporal: (n)

(nlog n) si se tiene en cuenta que hay que


ordenar primero los vectores.

Algoritmos voraces Pg. 52

El problema de la minimizacin del tiempo de espera

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 el tiempo de
espera global
Formulacin:
Variables: X={xi}

xi {1,..,n}

persona atendida en posicin i

Restricciones: X Permut(1,2,...,n)
Funcin Objetivo:
n

i 1

j 1

T[x ]

Algoritmos voraces Pg. 53

minimizacin del tiempo de


espera

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) +
(5+10+3)
=
5 + (5+3) + (5+3+10) = 31
10 +(10+5) +
(10+5+3)
=
10 +(10+3) +
(10+3+5)
=
ptimo
3 + (3+5) + (3+5+10) = 29
3 + (3+10) +
(3+10+5)
=

Algoritmos voraces Pg. 54

38

43
41

34

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.

3
1

5
4

Algoritmos voraces Pg. 55

Heursticas voraces:
Coloreado de grafos
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.

3
1

5
4

Algoritmos voraces Pg. 56

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

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.

Algoritmos voraces Pg. 57

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

Heursticas voraces: TSP

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.

(1,7)
b

(4,3)
(0,0)

d
e

a
b
5
c 7,07
5
d 16,55 11,70
14
e 15,52 11,05 14,32
f
18 14,32 18,38
distan. a
b
c

Algoritmos voraces Pg. 59

(15,7)
(15,4)
f

(18,0)

3
7,6
d

5
e

Heursticas voraces:TSP

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

Algoritmos voraces Pg. 60

d
f

Heursticas voraces:TSP

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.

Algoritmos voraces Pg. 61

Heursticas voraces:TSP

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.

Algoritmos voraces Pg. 62

Heursticas voraces: TSP

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

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

Algoritmos voraces Pg. 63