Académique Documents
Professionnel Documents
Culture Documents
INTRODUCCION
ALGORITMO VORAZ
FUNCIONAMIENTO
ALGORITMO DE DIJKSTRA
Pseudocdigo
5
5
ALGORITMO DE PRIM
Descripcin conceptual
Pseudocdigo del algoritmo
6
6
6
Algoritmo de Kruskal
Pseudocdigo
Complejidad del algoritmo
7
7
8
ARBOLES DE RECUBRIMIENTO
TIPOS DE ARBOLES
8
9
PROBLEMAS RESUELTOS
10
10
10
11
CONCLUSION
13
BIBLIOGRAFIA
14
INTRODUCCION
Como profesionales del rea de la Informtica, siempre debemos buscar o encontrar el mejor
mecanismo que nos ayude a solucionar de manera ptima y eficiente los problemas que se
presentan y a los que les debemos hacer frente. Por tal motivo, a continuacin presentar una
herramienta poderosa, llamada Algoritmo Voraz.
Los algoritmos voraces suelen ser bastante simples. Se emplean sobre todo para resolver
problemas de optimizacin, como por ejemplo, encontrar la secuencia ptima para procesar un
conjunto de tareas por un computador, hallar el camino mnimo de un grafo, etc.
ALGORITMO VORAZ
Un algoritmo voraz (tambin conocido como vido, devorador o goloso) es aquel que, para
resolver un determinado problema, sigue una heurstica consistente en elegir la opcin ptima en
cada paso local con la esperanza de llegar a una solucin general ptima. Este esquema
algortmico es el que menos dificultades plantea a la hora de disear y comprobar su
funcionamiento. Normalmente se aplica a los problemas de optimizacin.
1
Una aproximacin voraz consiste en que cada elemento a considerar se evala una nica vez,
siendo descartado o seleccionado, de tal forma que si es seleccionado forma parte de la solucin,
y si es descartado, no forma parte de la solucin ni volver a ser considerado para la misma. Una
forma de ver los algoritmos voraces es considerar la estrategia de Vuelta atrs, en la cual se
vuelve recursivamente a decisiones anteriormente tomadas para variar la eleccin entonces
tomada, pero eliminando esa recursin y eligiendo la mejor opcin.
El trmino voraz se deriva de la forma en que los datos de entrada se van tratando, realizando la
eleccin de desechar o seleccionar un determinado elemento una sola vez.
Al contrario que con otros mtodos algortmicos, no siempre es posible dar una solucin a un
problema empleando un algoritmo voraz. No todos los problemas son resolubles con algoritmos
voraces.
Los algoritmos voraces tienden a ser bastante eficientes y pueden implementarse de forma
relativamente sencilla. Su eficiencia se deriva de la forma en que trata los datos, llegando a
alcanzar muchas veces una complejidad de orden lineal. Sin embargo, la mayora de los intentos
de crear un algoritmo voraz correcto fallan a menos que exista previamente una prueba precisa
que demuestre la correctitud del algoritmo. Cuando una estrategia voraz falla al producir
resultados ptimos en todas las entradas, en lugar de algoritmo suele denominarse heurstica. Las
heursticas resultan tiles cuando la velocidad es ms importante que los resultados exactos (por
ejemplo, cuando resultados "bastante buenos" son suficientes).
FUNCIONAMIENTO
El algoritmo escoge en cada paso al mejor elemento posible, conocido como el elemento ms
prometedor. Se elimina ese elemento del conjunto de candidatos ( ) y, acto seguido, comprueba
si la inclusin de este elemento en el conjunto de elementos seleccionados ( ) produce una
solucin factible.
En caso de que as sea, se incluye ese elemento. Si la inclusin no fuera factible, se descarta el
elemento. Iteramos el bucle, comprobando si el conjunto de seleccionados es una solucin y, si
no es as, pasando al siguiente elemento del conjunto de candidatos.
un
conjunto
lista
S <= vaco
C <= C \ {x}
Si solucin(S)
Entonces devolver S
ALGORITMO DE DIJKSTRA
Pseudocdigo
Estructura de datos auxiliar: Q = Estructura de datos Cola de prioridad (se puede implementar
con un montculo)
DIJKSTRA (Grafo G, nodo_fuente s)
para u V[G] hacer
distancia[u] = INFINITO
padre[u] = NULL
distancia[s] = 0
adicionar (cola, (s, distancia[s]))
mientras que cola no es vaca hacer
u = extraer_mnimo(cola)
para todos v adyacencia[u] hacer
si distancia[v] > distancia[u] + peso (u, v) hacer
distancia[v] = distancia[u] + peso (u, v)
padre[v] = u
adicionar(cola,(v, distancia[v]))
ALGORITMO DE PRIM
El algoritmo de Prim es un algoritmo perteneciente a la teora de los grafos para encontrar un
rbol recubridor mnimo en un grafo conexo, no dirigido y cuyas aristas estn etiquetadas.
En otras palabras, el algoritmo encuentra un subconjunto de aristas que forman un rbol con
todos los vrtices, donde el peso total de todas las aristas en el rbol es el mnimo posible. Si el
grafo no es conexo, entonces el algoritmo encontrar el rbol recubridor mnimo para uno de los
componentes conexos que forman dicho grafo no conexo.
El algoritmo fue diseado en 1930 por el matemtico Vojtech Jarnik y luego de manera
independiente por el cientfico computacional Robert C. Prim en 1957 y redescubierto por
Dijkstra en 1959. Por esta razn, el algoritmo es tambin conocido como algoritmo DJP o
algoritmo de Jarnik.
Descripcin conceptual
Prim (Grafo G)
/* Inicializamos todos los nodos del grafo.
La distancia la ponemos a infinito y el padre de cada nodo a NULL
Encolamos, en una cola de prioridad
donde la prioridad es la distancia,
todas las parejas <nodo,distancia> del grafo*/
por cada u en V[G] hacer
distancia[u] = INFINITO
padre[u] = NULL
Aadir(cola,<u,distancia[u]>)
distancia[u]=0
mientras !esta_vacia(cola) hacer
// OJO: Se entiende por mayor prioridad aquel nodo cuya
distancia[u] es menor.
u = extraer_minimo(cola) //devuelve el minimo y lo elimina de la
cola.
por cada v adyacente a 'u' hacer
si ((v cola) && (distancia[v] > peso(u, v)) entonces
padre[v] = u
distancia[v] = peso(u, v)
Actualizar(cola,<v,distancia[v]>)
Algoritmo de Kruskal
El algoritmo de Kruskal es un algoritmo de la teora de grafos para encontrar un rbol
recubridor mnimo en un grafo conexo y ponderado. Es decir, busca un subconjunto de aristas
que, formando un rbol, incluyen todos los vrtices y donde el valor total de todas las aristas del
rbol es el mnimo. Si el grafo no es conexo, entonces busca un bosque expandido mnimo (un
rbol expandido mnimo para cada componente conexa). El algoritmo de Kruskal es un ejemplo
de algoritmo voraz.
Funciona de la siguiente manera:
se crea un bosque B (un conjunto de rboles), donde cada vrtice del grafo es un rbol
separado
mientras C es no vaco
o eliminar una arista de peso mnimo de C
o si esa arista conecta dos rboles diferentes se aade al bosque, combinando los
dos rboles en un solo rbol
o en caso contrario, se desecha la arista
Al acabar el algoritmo, el bosque tiene un solo componente, el cual forma un rbol de expansin
mnimo del grafo.
Este algoritmo fue publicado por primera vez en Proceedings of the American Mathematical
Society, pp. 4850 en 1956, y fue escrito por Joseph Kruskal.
Pseudocdigo
function Kruskal(G)
Para cada v en V[G] hacer
Nuevo conjunto C(v) {v}.
Nuevo heap Q que contiene todas las aristas de G, ordenando por su peso.
Defino un rbol T
// n es el nmero total de vrtices
Mientras T tenga menos de n-1 vertices hacer
(u,v) Q.sacarMin()
// previene ciclos en T. agrega (u,v) si u y v estn diferentes
componentes en el conjunto.
// Ntese que C(u) devuelve la componente a la que pertenece u.
if C(v) C(u) then
Agregar arista (v,u) a T.
Merge C(v) y C(u) en el conjunto
Return arbol T
m el nmero de aristas del grafo y n el nmero de vrtices, el algoritmo de Kruskal muestra una
complejidad O(m log m) o, equivalentemente, O(m log n), cuando se ejecuta sobre estructuras de
datos simples. Los tiempos de ejecucin son equivalentes porque:
ignorando los vrtices aislados, los cuales forman su propia componente del
rbol de expansin mnimo, n 2m, as que log n es O(log m).
Se puede conseguir esta complejidad de la siguiente manera: primero se ordenan las aristas por
su peso usando una ordenacin por comparacin (comparison sort) con una complejidad del
orden de O(m log m); esto permite que el paso "eliminar una arista de peso mnimo de C" se
ejecute en tiempo constante. Lo siguiente es usar una estructura de datos sobre conjuntos
disjuntos (disjoint-set data structure) para controlar qu vrtices estn en qu componentes. Es
necesario hacer orden de O(m) operaciones ya que por cada arista hay dos operaciones de
bsqueda y posiblemente una unin de conjuntos. Incluso una estructura de datos sobre
conjuntos disjuntos simple con uniones por rangos puede ejecutar las operaciones mencionadas
en O(m log n). Por tanto, la complejidad total es del orden de O(m log m) = O(m log n).
Con la condicin de que las aristas estn ordenadas o puedan ser ordenadas en un tiempo lineal
(por ejemplo, mediante el ordenamiento por cuentas o con el ordenamiento Radix), el algoritmo
puede usar estructuras de datos de conjuntos disjuntos ms complejas para ejecutarse en tiempos
del orden de O(m (n)), donde es la inversa (tiene un crecimiento extremadamente lento) de la
funcin de Ackermann.
ARBOLES DE RECUBRIMIENTO
El Objetivo de los rboles de recubrimiento consiste que dado un grafo x, se debe 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 costo posible en el grafo original.
La aplicacin de los problemas tiene que ver con un conjunto de elementos, a los que se quiere
conectar para intercambiar datos, compartir recursos, etc.; que minimicen los costos.
TIPOS DE ARBOLES
rbol libre: es un grafo no dirigido conexo a cclico. Un todo rbol libre con n vrtices
tiene n-1 aristas. u si se aade una arista se introduce un ciclo. u si se borra una arista
quedan vrtices no conectados u cualquier par de vrtices est unido por un nico camino
simple u 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 subgrupo 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
PROBLEMAS RESUELTOS
Enunciado: "Se tiene una mochila que es capaz de soportar un peso mximo
P, as como un conjunto de objetos, cada uno de ellos con un peso y un
beneficio. La solucin pasa por conseguir introducir el mximo beneficio en la
mochila, eligiendo los objetos adecuados. Cada objeto puede tomarse
completo o fraccionado".
Algoritmo:
10
Monedas
50
25
Monedas
Cantidad
Cantidad
11
Algoritmo:
12
CONCLUSION
Existe un buen nmero de mtodos que los matemticos y cientficos emplean cuando deben
resolver problemas complejos. Uno de los ms verstiles y simples de entender es el denominado
algoritmo voraz. A pesar de que no siempre es capaz de encontrar una respuesta ptima, se lo
utiliza con frecuencia dado que es muy rpido. Te contamos en qu consiste, qu ventajas tiene y
cmo utilizarlo.
Para resolver un problema se deben seguir una serie de pasos. Estos pasos deben estar claramente
definidos, sin importar que vayan a ser ejecutados por un ordenador o por un humano. La
correcta definicin de esos pasos garantiza que si se aplica el sistema dos veces a un determinado
problema, la solucin ser la misma. Esta verdadera receta se llama algoritmo, y no es otra
cosa que una secuencia de pasos ordenados y finitos con los que podemos resolver un problema
determinado en un tiempo mnimo.
13
El denominado algoritmo voraz sigue una estrategia sencilla pero eficaz. Simplemente, se trata
de elegir la opcin ptima en cada paso local, con la esperanza de llegar a una solucin general
ptima.
BIBLIOGRAFIA
http://es.wikipedia.org/wiki/Algoritmo_voraz
http://es.wikipedia.org/wiki/Algoritmo_de_Dijkstra
http://es.wikipedia.org/wiki/Algoritmo_de_Prim
http://es.wikipedia.org/wiki/Algoritmo_de_Kruskal
http://thales.cica.es/rd/Recursos/rd99/ed99-0033-04/voraz_introd.html
http://www.neoteo.com/el-algoritmo-voraz/
14