Вы находитесь на странице: 1из 35

Algoritmos voraces

Resuelven problemas de optimizacin. o picamente, los siguientes elementos: En un algoritmo voraz intervienen, t Un conjunto de candidatos Cand. La solucin se construir con un o a subconjunto de Cand. Un conjunto de seleccionados S que se irn tomando del conjunto de a candidatos. Una funcin seleccin voraz(Cand) que escoge el candidato de Cand o o que optimiza una funcin segn el criterio convenido (este es el o u elemento ms caracter a stico de esta tcnica de diseo de algoritmos). e n Una funcin solucin(S) que determina si el conjunto de o o seleccionados ya forma una solucin. o Una funcin completable(X ) que determina si el conjunto X puede o ser completado para llegar a ser una solucin; bsicamente o a consistir en comprobar que X satisface las restricciones del a enunciado del problema.
ww w.
om

at em

at

ic

a1

.c

Esquema general de un algoritmo voraz

func Voraz(Cand) return conjunto S while solucin(S) loop o x seleccin voraz(Cand) o Cand Cand {x} if completable(S {x}) then S S {x} end while return S
ww w.

at em

at

ic

a1

.c

om

Seleccin de actividades o
Tenemos un conjunto de actividades que requieren el uso de un recurso, de manera exclusiva, durante un intervalo de tiempo. Cada actividad est numerada. La actividad nmero i necesita el recurso a u durante el intervalo de tiempo [ci , fi ). (Naturalmente ci < fi ) Dos actividades i y j son compatibles si sus intervalos no se solapan (es decir, ci fj o cj fi ). El problema de seleccin de actividades consiste en seleccionar un o subconjunto de las actividades propuestas de manera que sean compatibles entre s y que sea un subconjunto de cardinal mximo de entre los que a forman subconjuntos compatibles.
ww w.

at em

at

ic

a1

.c

om

Criterio de seleccin voraz o

La parte fundamental de un algoritmo voraz es su criterio de seleccin o voraz: Seleccionar la actividad que comience ms temprano. a Seleccionar la actividad que termine ms pronto. a Seleccionar la actividad que menos solapamientos tenga con el resto de actividades candidatas. Para que puedan formar una solucin, debemos adjuntarles el criterio de o completabilidad: que no se solape con las actividades ya seleccionadas.
ww w.

at em

at

ic

a1

.c

Seleccionar la actividad de menos duracin. o


om

Demostracin de correccin del criterio (1/3) o o


Demostracin de que Seleccionar la actividad que termine ms pronto o a (que no se solape con las actividades ya seleccionadas) nos lleva a una solucin ptima. o o Demostracin por induccin sobre el nmero de actividades seleccionadas. o o u Consideremos las actividades numeradas de 1 a n.
M

a Asumimos, adems, que f1 . . . fn Base de la induccin: Sea cardinal(S)=1. Entonces S = {1}. o Si OPT es una solucin optimal cualquiera y k es la primera actividad o de OPT (o sea fk = m j : j OPT }), pueden ocurrir dos casos: k = 1 n{f o k = 1.
ww w.

at em

at

ic

a1

.c

om

Demostracin de correccin del criterio (2/3) o o


Si k = 1, terminamos puesto que eso signicar que S OPT que es lo a que queremos demostrar. Si k = 1, obsrvese que (OPT {k}) {1} es tambin una solucin e e o optimal ya que tiene el mismo nmero de actividades que OPT , y adems u a son actividades compatibles puesto que f1 fk . o o Hiptesis de induccin: Sea cardinal(S) = m 1 y sea S parte de una solucin optimal OPT y construido segn el criterio de seleccin indicado o u o arriba. Imaginemos OPT ordenado por tiempo de terminacin de sus actividades. o OPT = {a1 , . . . , am1 } {bm , . . . , bn } Por el criterio de seleccin es obvio que las actividades de S han de ser las o primeras, es decir S = {a1 , . . . , am1 }.
ww w.

at em

at

ic

a1

.c

om

Demostracin de correccin del criterio (3/3) o o


Sea bm la primera de OPT S (o sea, fbm = m j : j OPT S}). n{f Sea i la actividad elegida por el criterio de seleccin tras haber o seleccionado el conjunto S, formalmente fi = m j : j es compatible con n{f S}. fi fbm , puesto que todas las actividades de OPT S = {bm , . . . , bn } son compatibles con S. Entonces, (OPT {bm }) {i} es solucin optimal pues tiene el mismo o cardinal que OPT y la actividad i es compatible adems con a (OPT S) {bm }. La seleccin voraz m-sima nos lleva a un conjunto de seleccionados o e incluido en una solucin optimal. o
ww w.

at em

at

ic

a1

.c

om

Algoritmo Selector Actividades


Los tiempos de comienzo y nalizacin respectivos de cada actividad o i = 1, . . . , n estn en c(1..n) y f (1..n) a func Selector Actividades (c(1..n), f (1..n)) return conjunto de actividades {c(1..n) y f (1..n) ordenados segn el criterio (i < j f (i) f (j))} u S {1} z 1 {z representa a la ultima actividad seleccionada} for i in 2 . . . n loop if c(i) f (z) then S S {i} z i end for return S Anlisis: (n) a
ww w.

at em

at

ic

a1

.c

om

Problema de la mochila
Disponemos de n art culos de valores vi (i : 1 . . . n) y pesos pi (i : 1 . . . n), respectivamente. Queremos cargar una mochila con fragmentos de esos art culos que maximice la suma de los valores transportados. La capacidad mxima de la mochila es M 0. a Ms formalmente, calcular un vector (x1 , . . . , xn ) de valores 0 xi 1 tal a que
at em at
n
om

ww

se maximice
w.

ic

a1

.c

xi vi
i=1 n

restringido a que
i=1

x i pi M

Hemos visto una solucin a este problema (con la tcnica de Programacin o e o Dinmica), para el caso en el que i : xi = 0 o 1 a

Criterios de seleccin o
Criterios incorrectos (no garantizan el ptimo): o Seleccionar, del art culo de mayor valor, el mayor fragmento que quepa en la mochila Seleccionar, del art culo de menor peso, el mayor fragmento que quepa en la mochila
ic
ww w.

Criterio de seleccin correcto: o


M at em

Seleccionar el mayor fragmento que quepa en la mochila del art culo que tenga el mayor cociente valor/peso Obsrvese que, entonces, una solucin optimal es de la forma siguiente e o (1, . . . , 1, xk , 0, . . . , 0) con xk = 1, asumiendo que hemos ordenado los art culos de manera que v1 /p1 . . . vn /pn No obstante, puede haber soluciones igualmente ptimas que no estn o e construidas as .

at

a1

.c

om

Demostracin de correccin de la seleccin voraz: (1/4) o o o


Suponemos que v1 /p1 . . . vn /pn . (1) Caso en el que el art culo nmero 1 no cabe completo en la mochila: u q1 p1 = M con q1 = 1. Supongamos una solucin OPT = (x1 , . . . , xn ) con x1 < q1 . Entonces o podemos construir otra solucin OPTV = (q1 , 0, . . . , 0), que transporta o tanto valor como OPT , del siguiente modo: El peso que aadimos con el aumento del fragmento del art n culo 1 lo compensamos retirando los fragmentos de los otros art culos, o sea que (q1 x1 )p1 = n xi pi . i=2 Entonces el valor aadido a OPTV es mayor o igual que el retirado de n OPT :
n
ww w.

at em

at

ic

a1

.c

om

(q1 x1 )v1 = (
i=2

xi pi )v1 /p1
i=2

(xi pi )vi /pi =


i=2

xi vi

y con esto queda demostrado que la seleccin voraz es correcta en este o caso.

Demostracin de correccin de la seleccin voraz: (2/4) o o o


(2) Caso en el que el art culo nmero 1 cabe completo en la mochila. u Supongamos una solucin optimal OPT = (x1 , . . . , xn ) con x1 = 1. o Entonces podemos construir otra solucin optimal OPTV aumentando el o fragmento del art culo 1 hasta ponerlo completo y retirando un peso equivalente de fragmentos de los otros art culos. Construimos OPTV = (1, x2 , . . . , xn ) de manera que xi = xi yi con yi xi donde yi representa la porcin que retiramos del art o culo nmero i, u y por tanto n yi pi = (1 x1 )p1 para garantizar que el peso(OPT ) = i=2 peso(OPTV ) = M. Pero entonces se satisface lo siguiente:
ww w.

at em

at

ic

a1

.c

om

Demostracin de correccin de la seleccin voraz: (3/4) o o o


valor(OPTV ) = v1 + (x2 y2 )v2 + + (xn yn )vn
n n

= v1 +
i=2

xi vi
i=2

yi vi
n n

= x1 v1 + (1 x1 )v1 +
om

xi vi
i=2 i=2

yi vi

(1 x1 )v1 = (
i=2 n

yi pi )v1 /p1 por la compensacin de pesos o (yi pi vi /pi )

i=2 n

=
i=2

(yi vi )

ww

w.

at em

valor(OPT ) esto se satisface por lo siguiente:


at

ic

a1

.c

Demostracin de correccin de la seleccin voraz: (4/4) o o o


Al construir la solucin optimal OPTV = (1, x2 , . . . , xn ) hemos reducido el o problema original a otro anlogo pero con una instancia ms pequea: a a n Ahora debemos encontrar un vector (x2 , . . . , xn ) de valores 0 xi 1 tal que
at em

se maximice
ww w.

at
i=2 n i=2

ic M

a1

.c

om

xi vi x i pi M p1

restringido a que

y aplicando el mismo estudio que acabamos de realizar, terminamos demostrando que una solucin optimal es de la forma o (1, . . . , 1, xk , 0, . . . , 0) con xk = 1.

Algoritmo Mochila Frag


Por lo tanto, una solucin consiste en ordenar los art o culos segn el criterio u comentado y poner, sucesivamente, todo lo que quepa de cada art culo, tomados precisamente en ese orden. func Mochila Frag (v (1..n), p(1..n), M) return vector peso 0 i 1 {representa el nmero del art u culo a tratar} while i n peso + p(i) M loop x(i) 1 peso peso + p(i) i i +1 end loop { i < n peso + p(i) > M y k : 1..i 1.x(k) = 1 } if i n then x(i) (Mpeso)/p(i) for k in i + 1..n loop x(k) 0 return x(1..n)
ww w.

at em

at

ic

a1

.c

om

Arbol de recubrimiento m nimo

Puede haber varios rboles que sean solucin. a o

ww

Obsvese que el subconjunto solucin tiene que ser un rbol. e o a


w.

at em

at

ic

Dado un grafo conexo G = (N, A), no dirigido, con pesos no negativos asociados a las aristas, determinar un subconjunto de aristas de A, con el menor cardinal posible, que conecte a todos los nodos de N y cuya suma de pesos sea m nima.
a1
.c om

Algoritmo de Prim

Algoritmo abstracto func Prim (G = (N, A)) return conjunto de aristas ARM { } {Arbol de Recubrimiento M nimo} C r {cualquier r N, nodos Cubiertos} while C = N loop seleccionar (a, b) A con a C y b N C y de peso m nimo ARM ARM {(a, b)} C C {b} end loop return ARM
ww w.

at em

at

ic

a1

.c

om

Demostracin de correccin del criterio de seleccin de o o o Prim:


Por induccin sobre el cardinal de ARM. o Caso base: |ARM| = 0, es decir ARM = { }. Trivialmente, cualquier solucin optimal incluye a ARM. o o o o Hiptesis de induccin: ARM = m 1 y existe solucin optimal OPT tal que ARM OPT . Sea (a, b) la arista seleccionada en m-simo lugar, con a C y b N C : e Si (a, b) OPT , entonces ARM {(a, b)} OPT y hemos terminado Si (a, b) OPT , entonces OPT {(a, b)} tiene un ciclo y hay dos / aristas que salen de C : una es (a, b), y sea (x, y ) la otra, con x C e y N C. Por el criterio de seleccin: peso((a, b)) peso((x, y )). o Entonces OPT {(a, b)} {(x, y )} es una solucin optimal y o ARM {(a, b)} OPT .
ww w.
om

at em

at

ic

a1

.c

Estructuras de datos

Calcularemos dos tablas, indexadas por los nodos del grafo: padre en C(i), al nal, representar al padre del nodo i en el rbol de a a recubrimiento m nimo. peso(i) representar el peso de la arista (i, padre en C(i)) a Sucesivamente, la arista seleccionada ser la correspondiente a a peso(i) m nimo. Una vez aadida al rbol de recubrimiento, i pasa a n a estar en C y puede pasar a ser padre de algn nodo fuera de C . u peso(i) = 1 representa que i C .
ww w.

at em

at

ic

a1

Inicialmente, el unico nodo que est en C es el nodo 1. a


.c

om

Algoritmo Prim

Sea P(1..n, 1..n) la matriz de adyacencia, con los pesos asociados. func Prim (P(1..n, 1..n)) return conjunto de aristas ARM { } for i in 2..n loop padre en C(i) 1 peso(i) P(1, i) end loop for j in 1 . . . n 1 loop {una iteracin por cada seleccin} o o min for k in 2 . . . n loop if 0 peso(k) < min then min peso(k) sk end loop ARM ARM {(s, padre en C(s))} peso(s) 1 for k in 2 . . . n loop if P(s, k) < peso(k) then peso(k) P(s, k) padre en C(k) s end loop end loop return ARM Anlisis: (n2 ). Con esta implementacin, no depende del nmero de aristas. a o u
ww w.

at em

at

ic

a1

.c

om

Algoritmo de Kruskal
Algoritmo abstracto func Kruskal (G = (N, A)) return conjunto de aristas Cand A ARM { } while |ARM| = |N| 1 loop x la arista de menor peso de Cand Cand Cand - {x} if x no forma ciclo con las aristas de ARM then ARM ARM {x} end loop return ARM La demostracin de correccin del criterio de seleccin de Kruskal es o o o anloga a la de Prim. a
ww w.

at em

at

ic

a1

.c

om

Estructura de Particin o
Mantiene una coleccin de conjuntos no vac disjuntos dos a dos, cuya o os, unin forma el conjunto {1, . . . , n}. o Cada conjunto tiene un representante, que t picamente es un elemento del conjunto.
at
ww w.

Las operaciones son:


M

Crea Conjunto(i): crea el conjunto {i}. Puesto que los conjuntos han de ser disjuntos, se requiere que i no est en ningn otro e u conjunto. Unir(a, b): Dados dos representantes de conjuntos distintos, crea el conjunto unin de ambos y retira los dos conjuntos inicialmente o representados por a y b. Buscar(i): devuelve el representante del conjunto al que pertenece i.

at em

ic

a1

.c

om

Implementacin de la estructura de Particin (1/4) o o


La estructura de particin admite diversas representaciones. o Aqu presentamos una en la que los conjuntos son rboles, en los que la a ra es su elemento representante. z La particin est representada en un array padre(1..n). o a Cada elemento hace referencia a su padre en el rbol. a padre(x)= x signica que x es ra de un rbol. z a proc Crea Conjunto(i) padre(i) i
ww w.

padre(x)= y (con y =x) signica que y es padre de x en un rbol. a

at em

at

ic

a1

.c

om

Implementacin de la estructura de Particin (2/4) o o


func Buscar (i) return representante r i while padre(r ) = r loop r padre(r ) end loop return r func Unir (a, b) if a < b then padre(b) a else padre(a) b
ww w.

o a Con esta versin, un rbol de k nodos puede llegar a tener altura k 1

at em

at

ic

a1

.c

om

Implementacin de la estructura de Particin (3/4) o o


Para acotar la altura de los rboles, modicaremos Unir para que a cuelgue el rbol pequeo del rbol grande. a n a Un modo de codicar la altura h de un rbol de ra a es aprovechar el a z mismo array padre, de manera que padre(a) = h
at ic

Entonces la implementacin de las operaciones puede ser la siguiente: o proc Crea Conjunto(i) padre(i) 0
M at em
ww w.

func Buscar (i) return representante r i while padre(r ) > 0 loop r padre(r ) end loop return r

a1

.c

om

Implementacin de la estructura de Particin (4/4) o o

func Unir (a, b) if padre(a) < padre(b) then { b tiene menos altura que a } padre(b) a else { a tiene igual o menos altura que b } padre(a) b if padre(a) = padre(b) then padre(b) padre(b) 1 o a Con esta versin, un rbol de k nodos tiene altura menor o igual que lg k
ww w.

at em

at

ic

a1

.c

om

Anlisis de la segunda implementacin a o

Esta segunda implementacin tiene un mejor coste global que la primera. o Pero todav puede hacerse mejor. Vase bibliograf a e a.
ww w.

at em

at

ic

Crea Conjunto() y Unir() son O(1). Buscar() es O(h) siendo h la altura del rbol de i. a El coste de m operaciones Unir() y Buscar() es O(m log m).
a1
.c om

Implementacin de Kruskal con la estructura de o Particin o

func Kruskal (G = (N, A)) return conjunto de aristas for cada i N loop Crea Conjunto(i) end loop ARM { } Ordena(A) por peso creciente for cada (a, b) A en orden creciente loop Ra Buscar(a) Rb Buscar(b) if Ra = Rb then ARM ARM {(a, b)} Unir(a, b) if |ARM| = |N| 1 then return ARM
ww w.

at em

at

ic

a1

.c

om

Anlisis de Kruskal a

Ordenar A es de O(a log a) = O(a log n) (por n 1 a n2 ). 2a operaciones Buscar() ms (n 1) operaciones Unir() resulta a O((a + n) log(a + n)) = O(a log n). Con esta implementacin, Kruskal(G = (N, A)) es O(a log n) o
ww w.

at em

at

ic

a1

.c

n operaciones Crea Conjunto() resulta (n).


om

Caminos m nimos desde un origen

La distancia de un camino es la suma de los pesos de las aristas que forman el camino.
ww w.

at em

at

ic

Dado un grafo G = (N, A) dirigido y con pesos no negativos asociados a las aristas, determinar distancias m nimas de los caminos desde un nodo origen a cada uno de los nodos restantes.
a1
.c om

Algoritmo de Dijkstra

Se gestiona un conjunto de nodos seleccionados S, de manera que: para cualquier nodo i S: D(i) es la distancia m nima de un camino desde el nodo origen a i. para cualquier nodo j S: D(j) es la distancia m / nima de un camino especial desde el nodo origen a j. Un camino especial es un camino que parte del origen y slo pasa por o nodos de S hasta llegar a un nodo fuera de S. Criterio de seleccin voraz: seleccionar el nodo x S con D(x) o / m nimo. Despus de cada seleccin voraz hay que actualizar la tabla D. e o
ww w.

at em

at

ic

a1

.c

om

Algoritmo abstracto Dijkstra


func Dijkstra (P(1..n, 1..n)) return tabla distancias Cand {2, . . . , n} {impl citamente S = N Cand} for i in 2 . . . n loop D(i) P(1, i) end loop for j in 1 . . . n 2 loop x nodo de Cand con D(x) m nimo Cand Cand {x} for cada y Cand loop D(y ) min(D(y ), D(x) + P(x, y )) end loop end loop return D
ww w.

at em

at

ic

a1

.c

om

Demostracin de correccin del criterio de seleccin de o o o Dijkstra (1/2)

Por induccin sobre el nmero de nodos seleccionados: o u Caso base: Cuando S slo contiene el nodo origen o, podemos asumir o que D(o) = 0 y que i S D(i) es el peso de la arista (o, i) (si existe), / que es un camino especial; y si no existe tal arista, D(i) = P(o, i) = que sirve bien al caso.
at
ww w.

o o Hiptesis de induccin:
M

i S D(i) es la distancia m nima de un camino desde el nodo origen a i; j S: D(j) es la distancia m / nima de un camino especial desde el nodo origen a j; y |S| = m 1. Sea x el nodo seleccionado, es decir j S D(x) D(j). / Sea una solucin ptima OPTD tal que OPTD(x) D(x) (si fuese igual, o o la solucin D(x) ser correcta). o a

at em

ic

a1

.c

om

Demostracin de correccin del criterio de seleccin de o o o Dijkstra (2/2)


Entonces esa distancia OPTD(x) debe conseguirse pasando por algn u nodo z S antes de llegar x (si OPTD(x) se consigue slo pasando por / o nodos de S entonces, por denicin de x, D(x) OPTD(x)). o Es decir, OPTD(x) se consigue sumando un camino especial a z S y la / distancia que pueda haber desde z a x, que denominamos d(z, x). OPTD(x) = D(z) + d(z, x) D(x) + d(z, x) D(x) Entonces, cambiando en OPTD esa distancia a x por D(x) tenemos otra solucin optimal OPTD tal que OPTD (x) = D(x) y o OPTD (i) = OPTD(i) i = x.
ww w.

at em

at

ic

a1

.c

om

Algoritmo Dijkstra

Consideramos el nodo origen numerado con 1. func Dijkstra (P(1..n, 1..n)) return tabla for i in 2 . . . n loop Cand(i) = true end loop for i in 2 . . . n loop D(i) P(1, i) end loop for j in 1 . . . n 2 loop min for i in 2 . . . n loop if Cand(i) D(i) < min then min D(i) xi end loop Cand(x) false for i in 2 . . . n loop if Cand(i) D(x) + P(x, i) < D(i) then D(i) D(x) + P(x, i) end loop end loop return D(1..n)

a Anlisis: (n2 ). Puede hacerse otra implementacin, usando un mont o culo para gestionar el conjunto Cand con sus valores D(i) asociados. Si el grafo no tiene muchas aristas, puede ser ms eciente. a

ww

w.

at em

at

ic

a1

.c

om

Вам также может понравиться