Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2-Algoritmos Voraces
2-Algoritmos Voraces
v v v v v v v v v v v
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
Coloreado de grafos El problema del viajante de comercio
2 8 16 38 54 57 65 69 73 83 89
89 92
J. Campos - C.P.S.
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.
J. Campos - C.P.S.
Esquema genrico:
funcin voraz(C:conjunto) funcin voraz(C:conjunto) devuelve conjunto devuelve conjunto
{C es el conjunto de todos los candidatos} {C es el conjunto de todos los candidatos}
x:=elemento de C que x:=elemento de C que maximiza seleccionar(x); maximiza seleccionar(x); C:=C-{x}; C:=C-{x}; si completable(S {x}) si completable(S {x}) entonces S:=S {x} entonces S:=S {x} fsi fsi fmq; fmq; si solucin(S) si solucin(S) entonces devuelve S entonces devuelve S sino devuelve no hay solucin sino devuelve no hay solucin fsi fsi fin fin
J. Campos - C.P.S.
J. Campos - C.P.S.
Solucin:
{por ejemplo} {por ejemplo}
funcin cambia(importe:nat; funcin cambia(importe:nat; valor:vector[moneda] de nat) valor:vector[moneda] de nat) devuelve vector[moneda] de nat devuelve vector[moneda] de nat variable mon:moneda; variable mon:moneda; cambio:vector[moneda] de nat cambio:vector[moneda] de nat principio principio para todo mon en moneda hacer para todo mon en moneda hacer cambio[mon]:=0 cambio[mon]:=0 fpara; fpara; para mon:=M25 hasta M1 hacer para mon:=M25 hasta M1 hacer mq valor[mon]importe hacer mq valor[mon] importe hacer cambio[mon]:=cambio[mon]+1; cambio[mon]:=cambio[mon]+1; importe:=importe-valor[mon] importe:=importe-valor[mon] fmq fmq fpara; fpara; devuelve cambio devuelve cambio fin fin
J. Campos - C.P.S.
J. Campos - C.P.S.
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.
El problema de la mochila
v
Formalmente:
maximizar sujeto a
1in
b ixi
1in
pixi C
v v v
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)).
Esquemas algortmicos - Algoritmos voraces Pg. 9
J. Campos - C.P.S.
El problema de la mochila
v
Ejemplo: n=3 C=17 (b1,b2,b3)=(40,36,22) (p1,p2,p3)=(15,12,8) Tres soluciones factibles: (x1,x2,x3) (i) (1,1/6,0) (ii) (0,3/4,1) (iii) (0,1,5/8)
bixi 1i3
46 49 4975
J. Campos - C.P.S.
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.
El problema de la mochila
Cul es el mejor candidato (es decir, la mejor funcin de seleccin)? Volvamos al ejemplo: u Primera estrategia: elegir el objeto con mayor beneficio total (el primero). Sin embargo, la mochila se llena muy rpidamente con poco beneficio total. u Segunda estrategia: elegir el objeto que llene menos la mochila, para acumular beneficios de un nmero mayor de objetos. Sin embargo, es posible que se elija un objeto con poco beneficio simplemente porque pesa poco. u La tercera estrategia, que es la ptima, es tomar siempre el objeto que proporcione mayor beneficio por unidad de peso. Los algoritmos resultantes de aplicar cualquiera de las dos primeras estrategias tambin son voraces, pero no calculan la solucin ptima.
J. Campos - C.P.S.
El problema de la mochila
constante n=... {nmero de objetos} constante n=... {nmero de objetos} tipo vectReal=vector[1..n] de real tipo vectReal=vector[1..n] de real
{Pre: i1..n:peso[i]>0 {Pre: 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 mochila(benef,peso:vectReal; funcin mochila(benef,peso:vectReal; cap:real) devuelve vectReal cap:real) devuelve vectReal variables resto:real; i:entero; variables resto:real; i:entero; sol:vectReal sol:vectReal principio principio para todo i en 1..n hacer para todo i en 1..n hacer sol[i]:=0.0 {inicializar solucin} sol[i]:=0.0 {inicializar solucin} fpara; fpara; resto:=cap; {capacidad restante} resto:=cap; {capacidad restante} i:=1; i:=1; mq (in) and (peso[i]resto) hacer mq (i n) and (peso[i] resto) hacer sol[i]:=1; sol[i]:=1; resto:=resto-peso[i]; resto:=resto-peso[i]; i:=i+1 i:=i+1 fmq; fmq; si in entonces sol[i]:=resto/peso[i] fsi; si i n entonces sol[i]:=resto/peso[i] fsi; devuelve sol devuelve sol fin fin
{Post: sol es solucin ptima del problema de {Post: sol es solucin ptima del problema de la mochila} la mochila}
J. Campos - C.P.S.
El problema de la mochila
v
Demostracin de la correccin:
Sea X=(x1,,xn) la solucin generada por el algoritmo voraz. Si todos los xi son iguales a 1, la solucin es claramente ptima. Luego, sea j el menor ndice tal que xj1. Por tanto xi=1 para 1i<j, xi=0 para j<in, y 0xj<1. Si X no es ptima entonces existe otra solucin factible Y=(y1,,yn) tal que biyi > bix i. Sin perdida de generalidad, asumimos que
piyi =C.
Sea k el menor ndice tal que ykxk (claramente, existe ese k). Se verifica: yk<xk . En efecto: u Si k<j entonces xk=1. Pero yk xk luego yk<xk .
u
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.
Esquemas algortmicos - Algoritmos voraces Pg. 14
J. Campos - C.P.S.
El problema de la mochila
Ahora, supongamos que aumentamos yk hasta xk y disminumos tantos (yk+1,,yn) como sea necesario para que la capacidad utilizada siga siendo C. Se obtiene as una nueva solucin Z=(z1,,zn) con zi=xi, para 1ik y k<in p i(yi -zi)=pk(zk-yk). Entonces:
1in
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.
2
21
5 4
4
12
2
21
5 4
4
J. Campos - C.P.S.
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
J. Campos - C.P.S.
Listas de adyacencia
Esta representacin sirve para mejorar la eficiencia de los algoritmos sobre grafos que necesitan acceder a los vrtices sucesores a uno dado. Consiste en almacenar n listas enlazadas mediante punteros de forma que la lista i-sima contiene los vrtices sucesores del vrtice i. constante n = ... {cardinal de V} constante n = ... {cardinal de V} tipos ptNodo = nodo; tipos ptNodo = nodo; nodo = registro nodo = registro vrtice:1..n; vrtice:1..n; sig:ptNodo sig:ptNodo freg freg grafo = vector[1..n] de ptNodo grafo = vector[1..n] de ptNodo
1 2 nil 2 1 2 3 nil 1 3 nil
Vector de listas de adyacencia Grafo dirigido J. Campos - C.P.S. Esquemas algortmicos - Algoritmos voraces Pg. 19
J. Campos - C.P.S.
Grafo dirigido
J. Campos - C.P.S.
Grafo dirigido
Listas de adyacencia
J. Campos - C.P.S.
J. Campos - C.P.S.
Grafo no dirigido
1 2
Listas de adyacencia
1 2 3 4 1 nil 4 2 nil 4 3 4 1 3 2 3
nil nil
J. Campos - C.P.S.
J. Campos - C.P.S.
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.
J. Campos - C.P.S.
funcin Dijkstra(g:grafo; v:vrt) funcin Dijkstra(g:grafo; v:vrt) devuelve vector[vrt] de etiq devuelve vector[vrt] de etiq variables S:cjtVrt; variables S:cjtVrt; D:vector[vrt] de etiq D:vector[vrt] de etiq 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}; mq S no contenga todos los vrtices hacer mq S no contenga todos los vrtices hacer
{D contiene caminos mnimos formados ntegra{D contiene caminos mnimos formados ntegramente por nodos de S (excepto el ltimo), y mente por nodos de S (excepto el ltimo), y los nodos de S corresponden a los caminos mlos nodos de S corresponden a los caminos mnimos ms cortos calculados hasta el momento} nimos ms cortos calculados hasta el momento}
elegir wS t.q. D[w] es mnimo; elegir wS t.q. D[w] es mnimo; S:=S{w}; S:=S{w}; uS:actualizar dist.mn. comprobando uS:actualizar dist.mn. comprobando si por w hay un atajo si por w hay un atajo fmq; fmq; devuelve D devuelve D fin fin
{Post: D=caminosMnimos(g,v)} {Post: D=caminosMnimos(g,v)}
J. Campos - C.P.S.
Correccin:
Apuntes de la asignatura de Matemtica Discreta o buscar en bibliografa.
J. Campos - C.P.S.
funcin Dijkstra(g:grafo; v:vrt) funcin Dijkstra(g:grafo; v:vrt) devuelve vector[vrt] de etiq devuelve vector[vrt] de etiq variables T:cjtVrt; variables T:cjtVrt; D:vector[vrt] de etiq; D:vector[vrt] de etiq; u,w:vrt; val:etiq u,w:vrt; val:etiq principio principio T:=; T:=; para todo w en vrt hacer para todo w en vrt hacer 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}; repetir n-2 veces {quedan n-1 caminos por repetir n-2 veces {quedan n-1 caminos por
determinar} determinar} {seleccin del mn.w: w T uT:D[w]D[u]} {seleccin del mn.w: w T uT:D[w]D[u]}
val:=; val:=; para todo u en T hacer para todo u en T hacer si D[u]val ent w:=u; val:=D[u] fsi si D[u] val ent w:=u; val:=D[u] fsi fpara; fpara; ... ...
{siempre hay un nodo que cumple la condic} {siempre hay un nodo que cumple la condic}
J. Campos - C.P.S.
T:=T-{w}; T:=T-{w};
{se recalculan las nuevas dist. mnimas} {se recalculan las nuevas dist. mnimas}
para todo u en T hacer para todo u en T hacer si D[w]+etiqueta(g,w,u)<D[u] si D[w]+etiqueta(g,w,u)<D[u] ent D[u]:=D[w]+etiqueta(g,w,u) ent D[u]:=D[w]+etiqueta(g,w,u) fsi fsi fpara fpara frepetir; frepetir; devuelve D devuelve D 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)
J. Campos - C.P.S.
Tiempo de ejecucin:
se supone que las operaciones sobre cjtos. estn implementadas en tiempo constante, excepto la creacin (p.ej., mediante un vector de booleanos) fase de inicializacin: u creacin del cjto. y ejecucin n veces de diversas operaciones constantes: (n) fase de seleccin: u las instrucciones del interior del bucle son (1) u n de ejecuciones del bucle: 1 vuelta: se consultan n-1 vrtices, 2 vuelta: n-2, etc. (el cardinal de T decrece en 1 en cada paso) n de ejecuciones: n(n-1)/2-1 (n2) fase de marcaje: u n supresiones a lo largo del algoritmo: (n) fase de reclculo de las distancias mnimas: u queda (n2) por igual razn que la seleccin Coste total: (n2)
J. Campos - C.P.S.
J. Campos - C.P.S.
(1) (1) (log n) (log n) (1) (1) (log n) (log n) (log n) (log n) (1) (1) (1) (1) (1) (1)
J. Campos - C.P.S.
funcin Dijkstra(g:grafo; v:vrt) funcin Dijkstra(g:grafo; v:vrt) devuelve vector[vrt] de etiq devuelve vector[vrt] de etiq variables A:cpa; {cola de aristas con prior.} variables A:cpa; {cola de aristas con prior.} D:vector[vrt] de etiq; D:vector[vrt] de etiq; u,w:vrt; et,val:etiq u,w:vrt; et,val:etiq principio principio
{crear la cola con todas las aristas <v,w>} {crear la cola con todas las aristas <v,w>}
creaVaca(A); creaVaca(A); para todo w en vrt hacer para todo w en vrt hacer inserta(A,w,etiqueta(g,v,w)) inserta(A,w,etiqueta(g,v,w)) fpara; fpara; mq not esVaca(A) hacer mq not esVaca(A) hacer <w,val>:=primero(A);{selecc. arista mn.} <w,val>:=primero(A);{selecc. arista mn.} D[w]:=val; borra(A);{marca ww como tratado} D[w]:=val; borra(A);{marca como tratado}
{se recalculan las nuevas dist. mnimas} {se recalculan las nuevas dist. mnimas}
para todo <u,et> en suc(g,w) hacer para todo <u,et> en suc(g,w) hacer si est(A,u) entonces si est(A,u) entonces si val+et<valor(A,u) si val+et<valor(A,u) ent sustituye(A,u,val+et) ent sustituye(A,u,val+et) fsi fsi fsi fsi fpara fpara fmq; fmq; D[v]:=0; devuelve D D[v]:=0; devuelve D fin fin
{Post: D=caminosMnimos(g,v)} {Post: D=caminosMnimos(g,v)}
J. Campos - C.P.S. Esquemas algortmicos - Algoritmos voraces Pg. 35
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.
J. Campos - C.P.S.
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
J. Campos - C.P.S.
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.
J. Campos - C.P.S.
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.
J. Campos - C.P.S.
funcin Prim(g:grafo) devuelve grafo funcin Prim(g:grafo) devuelve grafo variables U:cjtVrt; gsol:grafo; variables U:cjtVrt; gsol:grafo; u,v:vrt; x:etiq u,v:vrt; x:etiq principio principio creaVaco(gsol); U:={cualquier vrtice}; creaVaco(gsol); U:={cualquier vrtice}; mq U no contenga todos los vrt. hacer mq U no contenga todos los vrt. hacer seleccionar <u,v,x> mnima t.q. u U;vU seleccionar <u,v,x> mnima t.q. u U;vU aade(gsol,u,v,x); U:=U {v} aade(gsol,u,v,x); U:=U {v} fmq; fmq; devuelve gsol devuelve gsol fin fin
{Post: gsolarm(g)} {Post: gsolarm(g)}
J. Campos - C.P.S.
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.
funcin Prim(g:grafo) devuelve grafo funcin Prim(g:grafo) devuelve grafo 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
{inicializacin del resultado} {inicializacin del resultado}
prim:=unVrticeCualquiera; prim:=unVrticeCualquiera; arisMn[prim]:=<prim,>; arisMn[prim]:=<prim,>; para todo v en vrt hacer para todo v en vrt hacer arisMn[v]:=<prim,etiqueta(g,prim,v)> arisMn[v]:=<prim,etiqueta(g,prim,v)> fpara; fpara;
{a continuacin se aplica el mtodo} {a continuacin se aplica el mtodo}
creaVaco(gsol); creaVaco(gsol); hacer n-1 veces hacer n-1 veces mn:=prim; {centinela: arisMn[mn].et=} mn:=prim; {centinela: arisMn[mn].et=} para todo v en vrt hacer para todo v en vrt hacer <w,x>:=arisMn[v]; <w,x>:=arisMn[v]; si x<arisMn[mn].et si x<arisMn[mn].et ent mn:=v {como mnimo habr uno} ent mn:=v {como mnimo habr uno} fsi; fsi; fpara; fpara; ... ...
J. Campos - C.P.S.
para todo <v,x> en para todo <v,x> en adyacentes(g,mn) hacer adyacentes(g,mn) hacer si (arisMn[v].vv)and(x<arisMn[v].et) si (arisMn[v].v v)and(x<arisMn[v].et) entonces arisMn[v]:=<mn,x> fsi entonces arisMn[v]:=<mn,x> fsi fpara fpara frepetir; frepetir; devuelve gsol devuelve gsol fin fin
{Post: gsolarm(g)} {Post: gsolarm(g)}
J. Campos - C.P.S.
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.
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.
funcin Kruskal(g:grafo) devuelve grafo funcin Kruskal(g:grafo) devuelve grafo variables gsol:grafo; variables gsol:grafo; u,v:vrt; x:etiq u,v:vrt; x:etiq principio principio creaVaco(gsol); creaVaco(gsol); mq gsol no sea conexo hacer mq gsol no sea conexo hacer() seleccionar <u,v,x> mnima no examinada; seleccionar <u,v,x> mnima no examinada; si no provoca ciclo si no provoca ciclo entonces aade(gsol,u,v,x) entonces aade(gsol,u,v,x) fsi fsi fmq; fmq; devuelve gsol devuelve gsol fin fin
{Post: gsolarm(g)} {Post: gsolarm(g)}
Nota: componentes(gsol) devuelve el conjunto de componentes conexos de gsol. () Utilizar una cola con prioridades.
J. Campos - C.P.S.
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
B
60
3 4
C
10 20 50
C D
1 2
J. Campos - C.P.S.
gnero rev {relac. de equiv. sobre vrt.} gnero rev {relac. de equiv. sobre vrt.} operaciones operaciones creaREV: rev {cada vrt. una clase} creaREV: rev {cada vrt. una clase} clase: rev vrt nat clase: rev vrt nat fusiona: rev nat nat rev fusiona: rev nat nat rev numClases: rev nat numClases: rev 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
funcin Kruskal(g:grafo) devuelve grafo funcin Kruskal(g:grafo) devuelve grafo variables T:cpa; gsol:grafo; variables T: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); {cada vrt. forma una clase} creaREV(C); {cada vrt. forma una clase} creaVaco(gsol); creaVaca(T); creaVaco(gsol); creaVaca(T);
{se colocan todas las aristas en la cola} {se colocan todas las aristas en la cola}
para todo v en vrt hacer para todo v en vrt hacer para todo <u,x> en adyacentes(g,v) hacer para todo <u,x> en adyacentes(g,v) hacer inserta(T,v,u,x) inserta(T,v,u,x) fpara fpara fpara; fpara; ... ...
J. Campos - C.P.S.
ucomp:=clase(C,u); vcomp:=clase(C,v); ucomp:=clase(C,u); vcomp:=clase(C,v); si ucompvcomp entonces si ucomp vcomp entonces fusiona(C,ucomp,vcomp); fusiona(C,ucomp,vcomp); aade(gsol,u,v,x) aade(gsol,u,v,x) fsi fsi fmq; fmq; devuelve gsol devuelve gsol fin fin
{Post: gsolarm(g)} {Post: gsolarm(g)}
J. Campos - C.P.S.
J. Campos - C.P.S.
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.
J. Campos - C.P.S.
Subestructura ptima:
Un problema posee una subestructura ptima si una solucin ptima de ese problema incluye soluciones ptimas de subproblemas.
J. Campos - C.P.S.
Cdigos de Huffman
D.A. Huffman: A method for the construction of minimum-redundancy codes, Proceedings of the IRE, 40(9), pp. 1098-1101, 1952.
v v
Los cdigos de Huffman son una tcnica muy til para comprimir ficheros. El algoritmo voraz de Huffman utiliza una tabla de frecuencias de aparicin de cada carcter para construir una forma ptima de representar los caracteres con cdigos binarios. Ejemplo:
Se tiene un fichero con 100.000 caracteres que se desea compactar. Las frecuencias de aparicin de caracteres en el fichero son las siguientes: a b c d e f frec. en miles 45 13 12 16 9 5 Puede usarse un cdigo de longitud fija (de 3 bits). El fichero requerira 300.000 bits. a b c d e f cd.long.fija 000 001 010 011 100 101
J. Campos - C.P.S.
Cdigos de Huffman
Puede hacerse mejor con un cdigo de longitud variable, dando codificaciones cortas a los caracteres ms frecuentes y ms largas a los menos frecuentes. a cd.long.var. 0 b 101 c 100 d 111 e f 1101 1100
Este cdigo ahorra algo ms del 25% (requiere 224.000 bits en lugar de 300.000). v
J. Campos - C.P.S.
Cdigos de Huffman
v
58 0 a:45
d:16
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.
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.
Cdigos de Huffman
{Pre: C es un conjunto de caracteres y f es el {Pre: C es un conjunto de caracteres y f es el vector de frecuencias de esos caracteres} vector de frecuencias de esos caracteres}
funcin Huffman(C:conjunto;f:vectFrec) funcin Huffman(C:conjunto;f:vectFrec) devuelve rbol devuelve rbol variables Q:colaPri; i,fx,fy,fz:entero; variables Q:colaPri; i,fx,fy,fz:entero; z,x,y:rbol z,x,y:rbol principio principio creaVaca(Q); creaVaca(Q); para todo x en C hacer para todo x en C hacer inserta(Q,<x,f[x]>) inserta(Q,<x,f[x]>) fpara; fpara; para i:=1 hasta |C|-1 hacer para i:=1 hasta |C|-1 hacer <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) devuelve z devuelve z fin fin
{Post: z es el rbol de un cdigo libre de {Post: z es el rbol de un cdigo libre 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
f:5
(1)
(2)
(3)
14 0 f:5 1 e:9
d:16
25 1 b:13
a:45 0 c:12
25 1 b:13 0 f:5
30 0 14 1 e:9
a:45 1
c:12
d:16
(4)
a:45
(5)
0 c:12
0 1 b:13
100
25
d:16
(6)
0 c:12
25
d:16
J. Campos - C.P.S.
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.
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
La correccin del algoritmo se sigue de los dos resultados anteriores, aplicando induccin.
J. Campos - C.P.S.
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.
Esquemas algortmicos - Algoritmos voraces Pg. 65
J. Campos - C.P.S.
funcin selec(c,f:vectReal)devuelve conjunto funcin selec(c,f:vectReal)devuelve conjunto variables i,j:entero; A:conjunto variables i,j:entero; A:conjunto principio principio A:={1}; A:={1}; j:=1; {j es la ltima actividad seleccionada} j:=1; {j es la ltima actividad seleccionada} para i:=2 hasta n hacer para i:=2 hasta n hacer si c[i]f[j] si c[i] f[j] entonces A:=A {i}; j:=i entonces A:=A {i}; j:=i fsi fsi fpara; fpara; devuelve A devuelve A fin fin
{Post: A es solucin ptima del problema de {Post: A es solucin ptima del problema de la seleccin de actividades.} la seleccin de actividades.}
J. Campos - C.P.S.
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.
J. Campos - C.P.S.
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:
T=
J. Campos - C.P.S.
= 38 = 31 = 43 = 41 = 29 = 34
ptimo
J. Campos - C.P.S.
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-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.
ka,b
(n-k+1)t k=1
ik
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
J. Campos - C.P.S.
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.
Ejemplos de matroides:
Dada una matriz de nmeros reales, sea S el conjunto de sus vectores fila, y considerese que un subconjunto de S es independiente si los vectores que lo componen son linealmente independientes (en el sentido habitual). Se llama matroide matricial y es el primero que se estudi (H. Whitney, 1935). Sea un grafo no dirigido G=(V,A). Sea MG=(SG,IG), donde: u SG=A (el conjunto de aristas). u Si BA, entonces BIG si y slo si B es acclico. Se llama matroide grfico y est muy relacionado con el clculo de rboles de recubrimiento de coste mnimo.
J. Campos - C.P.S.
Si A es un subconjunto independiente de un matroide M, se dice que A es maximal si no tiene extensiones. Teorema. Todos los subconjuntos independientes maximales de un matroide tienen el mismo cardinal. (Dem.: muy fcil [CLR90].)
Ejemplo: Dado un grafo no dirigido y conexo G, todo subconjunto independiente maximal de MG es un rbol libre con |V|-1 aristas que conecta todos los vrtices de G. Ese rbol se llama rbol de recubrimiento de G.
J. Campos - C.P.S.
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.
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
J. Campos - C.P.S.
{Pre: S y la funcin indep definen un matroide; {Pre: S y la funcin indep definen un matroide; w es una funcin de peso positiva sobre S} w es una funcin de peso positiva sobre S}
funcin voraz(S:conjunto) devuelve conjunto funcin voraz(S:conjunto) devuelve conjunto variable A:conjunto variable A:conjunto principio principio A:=; A:=; ordenar S por valores no crecientes de w; ordenar S por valores no crecientes de w; para todo x en S tomado en orden para todo x en S tomado en orden no creciente de w(x) hacer no creciente de w(x) hacer si indep(A{x}) entonces A:=A{x} fsi si indep(A{x}) entonces A:=A{x} fsi fpara; fpara; devuelve A devuelve A fin fin
{Post: A es subconjunto ptimo de (S,indep,w)} {Post: A es subconjunto ptimo de (S,indep,w)}
J. Campos - C.P.S.
Eficiencia temporal:
Denotando |S| como n, u fase de ordenacin: (nlog n) u bucle: (n f(n)), suponiendo que el coste de la funcin indep es (f(n)) Total: (nlog n + n f(n))
Correccin:
Teorema 17.10 en [CLR90, pp. 348-350] (un par de pginas; sin gran dificultad).
J. Campos - C.P.S.
Utilidad fundamental: Dados un problema y una solucin voraz, para demostrar la correccin de esa solucin basta con identificar una estructura de matroide subyacente al problema
J. Campos - C.P.S.
Resumen:
La teora de matroides no cubre todos los problemas en los que el esquema voraz calcula la solucin ptima. Sin embargo cubre muchos casos interesantes (por ej., rboles de recubrimiento de coste mnimo). Ms an, se ha demostrado que una estructura es un matroide si y slo si el esquema voraz calcula para ella una solucin ptima sea cual sea la funcin de peso escogida (la demostracin puede verse en [Koz92, pp. 13-18]). La investigacin contina
J. Campos - C.P.S.
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.
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.
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.
J. Campos - C.P.S.
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.
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.
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.
J. Campos - C.P.S.
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.
J. Campos - C.P.S.
J. Campos - C.P.S.
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.
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) d e f (15,7) (15,4) (18,0)
14 14,32 18,38 c
3 7,6 d
5 e
J. Campos - C.P.S.
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 e d f
J. Campos - C.P.S.
Heurstica voraz:
Ir seleccionando parejas de puntos que sern visitados de forma consecutiva: se seleccionar primero aquella pareja de puntos entre los que la distancia sea mnima; a continuacin, se selecciona la siguiente pareja separada con una distancia mnima siempre que esta nueva eleccin no haga que: u se visite un punto dos veces o ms (es decir, que el punto aparezca tres o ms veces en las parejas de puntos seleccionadas), o u se cierre un recorrido antes de haber visitado todos los puntos. De esta forma, si hay que visitar n puntos (incluido el origen), se selecciona un conjunto de n parejas de puntos (que sern visitados de forma consecutiva) y la solucin consiste en reordenar todas esas parejas de forma que constituyan un recorrido.
J. Campos - C.P.S.
En el ejemplo anterior:
Las parejas ordenadas por distancia entre sus puntos son: (d,e), (a,b), (b,c), (e,f), (a,c), (d,f), (b,e), (b,d), (c,d), (b,f), (c,e), (a,e), (a,d), (a,f) y (c,f). Se selecciona primero la pareja (d,e) pues la distancia entre ambos puntos es mnima (3 unidades). (d,e) Despus se seleccionan las parejas (a,b), (b,c) y (e,f). La distancia es para todas ellas igual (5 unidades). (d,e), (a,b), (b,c), (e,f) La siguiente pareja de distancia mnima es (a,c), con longitud 7,07. Sin embargo, esta pareja cierra un recorrido junto con otras dos ya seleccionadas, (b,c) y (a,b), por lo que se descarta. La siguiente pareja es (d,f) y se descarta tambin por motivos similares.
J. Campos - C.P.S.
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.