Академический Документы
Профессиональный Документы
Культура Документы
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
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
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
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
at em
at
ic
a1
.c
om
at em
at
ic
a1
.c
om
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.
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
at em
at
ic
a1
.c
om
(q1 x1 )v1 = (
i=2
xi pi )v1 /p1
i=2
xi vi
y con esto queda demostrado que la seleccin voraz es correcta en este o caso.
at em
at
ic
a1
.c
om
= 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
i=2 n
=
i=2
(yi vi )
ww
w.
at em
ic
a1
.c
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.
at em
at
ic
a1
.c
om
ww
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
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
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.
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
at em
at
ic
a1
.c
om
at em
at
ic
a1
.c
om
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
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
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
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
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
at em
at
ic
a1
.c
om
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
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