Vous êtes sur la page 1sur 15

TABLA DE CONTENIDO

INTRODUCCION

ALGORITMO VORAZ

FUNCIONAMIENTO

ELEMENTOS DEL ALGORITMO VORAZ

ESQUEMA GENRICO DEL ALGORITMO VORAZ

TIPOS DE ALGORITMOS VORACES

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

PROBLEMA DE PLANIFICACIN DE TAREAS


Problema de la mochila
Problema del cambio de moneda

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.

El algoritmo voraz funciona por pasos:


Partimos de una solucin vaca.
En cada paso se escoge el siguiente elemento para aadir ala solucin, entre los
candidatos.
2

Una vez tomada esta decisin no se podr deshacer.


El algoritmo acabar cuando el conjunto de elementos
seleccionados constituya una solucin.

ELEMENTOS DEL ALGORITMO VORAZ


1. El conjunto
de candidatos, entradas del problema.
de candidatos (tareas a procesar, vrtices del grafo, etc);

un

conjunto

lista

2. Un conjunto de decisiones ya tomadas (candidatos ya escogidos);


3. Funcin solucin. una funcin en la que se determina si un conjunto de candidatos es
una solucin al problema (aunque no tiene por qu ser la ptima); Comprueba, en cada
paso, si el subconjunto actual de candidatos elegidos forma una solucin (no importa si es
ptima o no lo es).
4. Funcin de seleccin. Esta 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.
5. Funcin de factibilidad. Informa si a partir de un conjunto se puede llegar a una
solucin. Suele aplicarse al conjunto de seleccionados unido con el elemento ms
prometedor.
6. Una funcin que determina si un conjunto es completable, es decir, si aadiendo a este
conjunto nuevos candidatos es posible alcanzar una solucin al problema, suponiendo
que esta exista
7. Una funcin de seleccin que escoge el candidato an no seleccionado que es
ms prometedor;
8. Funcin objetivo. Es aquella que queremos maximizar o minimizar, el ncleo del
problema. Es la que da el valor/coste de una solucin (tiempo total del proceso, la
longitud del camino, etc) y es a la que se pretende maximizar o minimizar.

ESQUEMA GENRICO DEL ALGORITMO VORAZ


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. 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

Funcin voraz (Conjunto): conjunto

{C es el conjunto de todos los candidatos}

S <= vaco

Mientras solucin(S) y C <> vaco hacer

x <= el elemento de C que maximiza seleccionar(x)

C <= C \ {x}

Si completable(S U {x}) entonces S <= S U {x}

Si solucin(S)

Entonces devolver S

Si no devolver no hay solucin

{S es el conjunto en el que se construye la solucin}

TIPOS DE ALGORITMOS VORACES

ALGORITMO DE DIJKSTRA

El algoritmo de Dijkstra, tambin llamado algoritmo de caminos mnimos, es un algoritmo


para la determinacin del camino ms corto dado un vrtice origen al resto de 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).
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.

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

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.

Pseudocdigo del algoritmo

Estructura de datos auxiliar: Cola = Estructura de datos Cola de prioridad


(se puede implementar con un heap)

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

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

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

Complejidad del algoritmo

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:

m es a lo sumo n2 y log n2 = 2logn es O(log n).

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

PROBLEMA DE PLANIFICACIN DE TAREAS


Problema de la mochila

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".

Solucin: La forma ms simple de saber qu objetos se deben tomar es


ordenar dichos objetos por la relacin beneficio / peso de mayor a menor. De
esta forma, tomaremos los objetos con mayor beneficio en este orden hasta
que la bolsa se llene, fraccionando si fuera preciso, el ltimo objeto a tomar.

Algoritmo:

- V almacena los beneficios de cada objeto,

10

- P almacena el peso de cada objeto,


- sol devuelve el tanto por 1 de objeto que se toma,
- benef devuelve el beneficio total,
- valor_obten almacena el beneficio parcial,
- peso_ac almacena el peso parcial.
fun mochila (V [1..n], P[1..n] de nat; m: nat) dev <sol[1..n] de nat, benef:
nat>
begin
para j := 1 hasta n hacer
sol [j] := 0;
fpara
valor_obten := 0; i:=0; peso_ac := 0;
mientras peso_ac < m hacer
si peso [i] + peso_ac < m entonces
valor_obten := valor_obten + valor [i];
sol [i] := 1;
peso_ac := peso_ac + peso [i];
si no
sol [i] := (m peso_ac) / peso [i];
peso_ac := m;
valor_obten := valor_obten + valor [i] * sol [i];
fsi
i := i + 1;
fmientras
benef := valor_obten;
ffun

Problema del cambio de moneda

Enunciado: "Se pide crear un algoritmo que permita a una mquina


expendedora devolver el cambio mediante el menor nmero de monedas
posible, considerando que el nmero de monedas es limitado, es decir, se
tiene un nmero concreto de monedas de cada tipo".

Solucin: La estrategia a seguir consiste en escoger sucesivamente las


monedas de valor mayor que no superen la cantidad de cambio a devolver. El
buen funcionamiento del algoritmo depende de los tipos de monedas
presentes en la entrada. As, por ejemplo, si no hay monedas de valor menor
que diez, no se podr devolver un cambio menor que diez. Adems, la
limitacin del nmero de monedas tambin influye en la optimalidad del
algoritmo, el cual devuelve buenas soluciones bajo determinados conjuntos
de datos, pero no siempre. Considrense los dos siguientes ejemplos como
demostracin de lo dicho:

Monedas

50

25

Monedas

Cantidad

Cantidad

11

Si hay que devolver la cantidad 110 Si queremos devolver la cantidad 8,


siguiendo el mtodo del algoritmo siguiendo el procedimiento anterior, el
voraz, se tomara primero una moneda
algoritmo tomara primero una
de 50, quedando una cantidad restante moneda de 6, quedando un resto de 2.
de 60. Como 50 es an menor que 60,
Tomara 2 monedas de valor 1,
se tomara otra moneda de 50. Ahora
habiendo devuelto por tanto 3
la cantidad restante es 10, por tanto ya monedas, cuando es fcil ver que con
tenemos que devolver una moneda de 2 monedas de valor 4 se obtiene el
5, ya que 50 y 25 son mayores que 10,
resultado pedido.
y por tanto se desechan. La cantidad a
devolver ahora es 5. Se tomara otra
moneda de 5, pero puesto que ya no
nos queda ninguna, debern
devolverse 5 de valor 1, terminando
as el problema de forma correcta.

Algoritmo:

fun cambio (monedas_valor[1..n] de nat, monedas[1..n] de nat, importe: nat)


dev cambio[1..n] de nat
m := 1;
mientras (importe > 0) and (m <= n) hacer
si (monedas_valor[m] <= importe) and (monedas[m] > 0) entonces
monedas[m] := monedas[m] 1;
cambio[m] := cambio[m] + 1;
importe := importe monedas_valor[m];
si no
m := m + 1;
fsi
fmientras
si importe > 0 entonces devolver Error; fsi
ffun

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

Para realizar este trabajo utilic las siguientes fuentes de Internet:

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

Vous aimerez peut-être aussi