Sie sind auf Seite 1von 5

Algoritmo Voraz

Un algoritmo voraz determina el mnimo nmero de monedas que debe devolverse


en el cambio. En la figura se muestran los pasos que un ser humano debera
seguir para emular a un algoritmo voraz para acumular 36 cntimos usando slo
monedas de valores nominales de 1, 5, 10 y 20. La moneda del mayor valor menor
que el resto debido es el ptimo local en cada paso. Ntese que en general el
problema de devolucin del cambio requiere programacin dinmica o
programacin para encontrar una solucin ptima. Sin embargo, en muchos
sistemas monetarios, incluyendo el euro y el dlar estadounidense, son casos
especiales donde en la estrategia del algoritmo voraz da con la solucin ptima.
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.

Esquema
Dado un conjunto finito de entradas, un algoritmo voraz devuelve un conjunto
(seleccionados) tal que y que adems cumple con las restricciones del problema
inicial. A cada conjunto que satisfaga las restricciones se le suele denominar
prometedor, y si este adems logra que la funcin objetivo se minimice o maximice
(segn corresponda) diremos que es una solucin ptima.

Elementos de los que consta la tcnica

El conjunto de candidatos, entradas del problema.

Funcin solucin. Comprueba, en cada paso, si el subconjunto actual de


candidatos elegidos forma una solucin (no importa si es ptima o no lo es).
Funcin de seleccin. Informa de cul es el elemento ms prometedor
para completar la solucin. ste no puede haber sido escogido con
anterioridad. Cada elemento es considerado una sola vez. Luego, puede ser
rechazado o aceptado y pertenecer a .

Funcin de factibilidad. Informa si a partir de un conjunto se puede llegar a


una solucin. Lo aplicaremos al conjunto de seleccionados unido con el
elemento ms prometedor.

Funcin objetivo. Es aquella que queremos maximizar o minimizar, el


ncleo del problema.
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 en. 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.

Ejemplos de algoritmos voraces

Algoritmo de Kruskal

Algoritmo de Prim

Algoritmo de Dijkstra

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.
Un ejemplo de rbol expandido mnimo. Cada punto representa un vrtice, el cual
puede ser un rbol por s mismo. Se usa el Algoritmo para buscar las distancias
ms cortas (rbol expandido) que conectan todos los puntos o vrtices.
Funciona de la siguiente manera:

se crea un bosque B (un conjunto de rboles), donde cada vrtice del grafo
es un rbol separado

se crea un conjunto C que contenga a todas las aristas del grafo

mientras C es no vaco

eliminar una arista de peso mnimo de C

si esa arista conecta dos rboles diferentes se aade al bosque,


combinando los dos rboles en un solo rbol

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.

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
El algoritmo incrementa continuamente el tamao de un rbol, comenzando por un
vrtice inicial al que se le van agregando sucesivamente vrtices cuya distancia a
los anteriores es mnima. Esto significa que, en cada paso, las aristas a considerar
son aquellas que inciden en vrtices que ya pertenecen al rbol.
El rbol recubridor mnimo est completamente construido cuando no quedan ms
vrtices por agregar.

Algoritmo de Dijkstra
El algoritmo de Dijkstra, tambin llamado algoritmo de caminos mnimos, es
un algoritmo para la determinacin del camino ms cortodado un vrtice origen al
resto de los vrtices en un grafo con pesos en cada arista. Su nombre se refiere
a Edsger Dijkstra, quien lo describi por primera vez en 1959.
La idea subyacente en este algoritmo consiste en ir explorando todos los caminos
ms cortos que parten del vrtice origen y que llevan a todos los dems vrtices;
cuando se obtiene el camino ms corto desde el vrtice origen, al resto de vrtices
que componen el grafo, el algoritmo se detiene. El algoritmo es una
especializacin de la bsqueda de costo uniforme, y como tal, no funciona en
grafos con aristas de coste negativo (al elegir siempre el nodo con distancia
menor, pueden quedar excluidos de la bsqueda nodos que en prximas
iteraciones bajaran el costo general del camino al pasar por una arista con costo
negativo).
Algoritmo. -

Teniendo un grafo dirigido ponderado de N nodos no aislados, sea x el nodo


inicial, un vector D de tamao N guardar al final del algoritmo las distancias
desde x al resto de los nodos.
1. Inicializar todas las distancias en D con un valor infinito relativo ya que son
desconocidas al principio, exceptuando la de x que se debe colocar en 0
debido a que la distancia de x a x sera 0.

2. Sea a = x (tomamos a como nodo actual).

3. Recorremos todos los nodos adyacentes de a, excepto los nodos


marcados, llamaremos a estos nodos no marcados vi.

4. Para el nodo actual, calculamos la distancia tentativa desde dicho nodo a


sus vecinos con la siguiente frmula: dt(vi) = Da + d(a,vi). Es decir, la
distancia tentativa del nodo vi es la distancia que actualmente tiene el
nodo en el vector D ms la distancia desde dicho el nodo a (el actual) al
nodo vi. Si la distancia tentativa es menor que la distancia almacenada en
el vector, actualizamos el vector con esta distancia tentativa. Es decir: Si
dt(vi) < Dvi Dvi = dt(vi)

5. Marcamos como completo el nodo a.

6. Tomamos como prximo nodo actual el de menor valor en D (puede


hacerse almacenando los valores en una cola de prioridad) y volvemos al
paso 3 mientras existan nodos no marcados.
Una vez terminado al algoritmo, D estar completamente lleno.

Complejidad
Orden de complejidad del algoritmo: O(|V|2+|A|) = O(|V|2) sin utilizar cola de
prioridad, O((|A|+|V|) log |V|) = O(|A| log |V|) utilizando cola de prioridad (por
ejemplo un montculo). Por otro lado, si se utiliza un Montculo de Fibonacci,
sera O(|V| log |V|+|A|).
Podemos estimar la complejidad computacional del algoritmo de Dijkstra (en
trminos de sumas y comparaciones). El algoritmo realiza a lo ms n-1
iteraciones, ya que en cada iteracin se aade un vrtice al conjunto distinguido.
Para estimar el nmero total de operaciones basta estimar las que se llevan a
cabo en cada iteracin. Podemos identificar el vrtice con la menor etiqueta entre
los que no estn en Sk realizando n-1 comparaciones o menos. Despus hacemos
una suma y una comparacin para actualizar la etiqueta de cada uno de los
vrtices que no estn en Sk. Por tanto, en cada iteracin se realizan a lo sumo 2(n-
1) operaciones, ya que no puede haber ms de n-1 etiquetas por actualizar en
cada iteracin. Como no se realizan ms de n-1 iteraciones, cada una de las
cuales supone a lo ms 2(n-1) operaciones, llegamos al siguiente teorema.
TEOREMA: El Algoritmo de Dijkstra realiza O(n2) operaciones (sumas y
comparaciones) para determinar la longitud del camino ms corto entre dos
vrtices de un grafo ponderado simple, conexo y no dirigido con n vrtices.