Você está na página 1de 29

ANLISIS DE

ALGORITMOS
Escuela Superior de Cmputo

Contenido
Introduccin
Algoritmos vidos
Forma general de un algoritmo vido

Planteamiento de un algoritmo vido


Ejemplo
Mnimo nmero de monedas

Ejercicios: Ejercicios sobre Dijkstra, Prim

y Kruskal
Tarea: Implementacin de 2 algoritmos
vidos

Introduccin
Los

algoritmos vidos o voraces (Greedy


Algorithms)
son
algoritmos
que
toman
decisiones de corto alcance, basadas en
informacin inmediatamente disponible, sin
importar consecuencias futuras.

Suelen ser bastante simples y 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.

Los algoritmos voraces tambin se caracterizan

por la rapidez en que encuentran una solucin


(cuando la encuentran), la cual casi siempre no
es la mejor.
Normalmente

son utilizados para resolver


problemas en los que la velocidad de respuesta
debe ser muy alta o en la que el rbol de
decisiones de bsqueda es muy grande, no
siendo posible analizar la totalidad de
posibilidades.

La estrategia general de este tipo de algoritmos se basa en la

construccin de una solucin, la cual comienza sin elementos


y cada vez que debe tomar algn tipo de decisin, lo hace
con la informacin que tiene a primera mano, la cual de
alguna manera le permita adicionar elementos y as avanzar
hacia la solucin total.
Cada elemento o paso de la solucin se adiciona al conjunto

solucin y as hasta llegar a la solucin final o a un punto en


el cual no puede seguir avanzando, lo cual indica que no
encontr una solucin al problema.

Habitualmente, los elementos que intervienen

son:
Un conjunto o lista de candidatos (tareas a

procesar, vrtices del grafo, etc.)


Un
conjunto de decisiones ya tomadas
(candidatos ya escogidos).
Una funcin que determina si un conjunto de
candidatos es una solucin al problema (aunque
no tiene por qu ser la ptima).
Para resolver el problema de optimizacin hay

que encontrar un conjunto de candidatos que


optimiza la funcin objetivo. Los algoritmos
voraces proceden por pasos.

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

Dado un conjunto finito de entradas C, un algoritmo

voraz devuelve un conjunto S (seleccionados) tal


que S C
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.

Elementos de los que consta la tcnica


El conjunto de candidatos, entradas del problema.
Funcin solucin, esta 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.

Forma general de un algoritmo vido


Funcin vido(C:conjunto):conjunto //C conjunto de candidatos
S <= vacio //S conjunto en el que se construye la solucin
mientras solucin(S) y C <> vaco hacer
x <= el elemento de C que maximiza seleccionar(x)
C <= C \ {x}
si prometedor(S U {x}) entonces S <= S U {x}
si solucin(S)
entonces devolver S
si no devolver no hay solucin
Fin vido

Forma general de un algoritmo vido


Para identificar si un problema es susceptible de

ser resuelto por un algoritmo vido se definen


una serie de elementos que han de estar
presentes en el problema:
Un conjunto de candidatos, que corresponden a las n

entradas del problema.


Una funcin de seleccin que en cada momento

determine el candidato idneo para formar la solucin


de entre los que an no han sido seleccionados ni
rechazados.

Una funcin que compruebe si un cierto subconjunto

de candidatos es prometedor. Entendemos por


prometedor que sea posible seguir aadiendo
candidatos y encontrar una solucin.
Una funcin objetivo que determine el valor de la

solucin hallada. Es
maximizar o minimizar.

la

funcin

que

queremos

Una funcin que compruebe si un subconjunto de

estas entradas es solucin al problema, sea ptima o


no.

Planteamiento de un algoritmo vido


Para resolver el problema, un algoritmo vido tratar

de encontrar un subconjunto de candidatos tales que,


cumpliendo las restricciones del problema, constituya
la solucin ptima.
Para ello trabajar por etapas, tomando en cada una

de ellas la decisin que le parece la mejor, sin


considerar las consecuencias futuras, y por tanto
escoger de entre todos los candidatos el que produce
un ptimo local para esa etapa, suponiendo que ser a
su vez ptimo global para el problema.

Planteamiento de un algoritmo vido


Antes de aadir un candidato a la solucin que est

construyendo comprobar si es prometedora al


aadirlo. En caso afirmativo lo incluir en ella y en
caso contrario descartar este candidato para siempre
y no volver a considerarlo.
Cada vez que se incluye un candidato comprobar si el

conjunto obtenido es solucin.

Ejemplo: Mnimo nmero de monedas


Se pide crear un algoritmo que permita a una mquina

expendedora devolver el cambio mediante el menor


nmero de monedas posible.
1. Considerando que el nmero de monedas es
ilimitado.
2. Considerando que el nmero de monedas es

limitado, es decir, se tiene un nmero concreto de


monedas de cada tipo.

Candidato:

conjunto finito de monedas de, por


ejemplo, 1, 5, 10 y 25 unidades, con un nmero de
monedas ilimitado o limitado.

Solucin: conjunto de monedas cuya suma es la

cantidad a pagar.
Prometedor: la suma de las monedas escogidas en un

momento dado no supera la cantidad a pagar.


Funcin de seleccin: la moneda de mayor valor en el

conjunto de candidatos an no considerados.


Funcin objetivo: nmero de monedas utilizadas en la

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.

Denominacin de
Monedas

50 25 5 1

Si hay que devolver la cantidad 110, se tomara primero una moneda

de 50, quedando una cantidad restante de 60. Como 50 es an menor


que 60, se tomara otra moneda de 50. Ahora la cantidad restante es
10, por tanto ya tenemos que devolver una moneda de 5, ya que 50 y
25 son mayores que 10, y por tanto se desechan. La cantidad a
devolver ahora es 5. Se tomara otra moneda de 5, terminando as el
problema de forma correcta.
Solucin: Devolver dos monedas de 50 y dos de 5.

Algoritmo vido: Monedas ilimitadas


fun cambio (monedas_valor[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) 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

Si consideramos adems un numero de monedas de

cada denominacin no ilimitado deberemos ahora de


considerar que sea posible tomar monedas de cada
denominacin para formar la solucin
Denominacin de
Monedas
Monedas disponibles

50 25 5 1
3

1 6

Si hay que devolver la cantidad 110 siguiendo el mtodo del algoritmo

voraz, se tomara primero una moneda de 50, quedando una cantidad


restante de 60. Como 50 es an menor que 60, se tomara otra
moneda de 50. Ahora la cantidad restante es 10, por tanto ya tenemos
que devolver una moneda de 5, ya que 50 y 25 son mayores que 10, 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.
Solucin: Devolver dos monedas de 50, una de 5 y cinco de 1.

Algoritmo vido: Monedas limitadas


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

Ejemplo: Algoritmos Greedy sobre grafos


rboles generadores minimales
Problema
Dado un grafo conexo G = (V, A) no dirigido y ponderado con pesos

positivos, calcular un subgrafo conexo T G que conecte todos los


vrtices del grafo G y que la suma de los pesos de las aristas
seleccionadas sea mnima.
Solucin
Este subgrafo es necesariamente un rbol: rbol generador minimal o

rbol de recubrimiento mnimo (minimum spanning tree [MST]).

Aplicaciones
Diseo de redes: redes telefnicas, elctricas,

hidrulicas, de computadoras, de carreteras


Construccin de redes de mnimo costo.
Refuerzo de lneas crticas.
Identificacin de cuellos de botella.
Enrutamiento (evitar ciclos).
Soluciones aproximadas para problemas NP.
Algoritmos de agrupamiento (anlisis de clster).

Algoritmos Greedy para resolver el


problema
Algoritmo de Kruskal:
Comenzando con T=, considerar las aristas en orden creciente de

costo y aadir las aristas a T salvo que hacerlo suponga la creacin de


un ciclo.
Algoritmo de Prim:
Comenzando con un nodo raz arbitrario s, hacer crecer el rbol T

desde s hacia afuera. En cada paso, se aade al rbol T el nodo que


tenga una arista de menor costo que lo conecte a otros nodos de T.
Algoritmo de borrado inverso:
Comenzando con T=A, considerar las aristas en orden decreciente de

costo eliminar las aristas de T salvo que eso desconectase T.

Ejemplo: Caminos mnimos


Caminos mnimos
Problema
Dado un grafo G ponderado con pesos positivos, calcular el camino de

menor peso existente entre un vrtice s y otro vrtice t.

Algoritmo de Dijkstra (1959)


El algoritmo de Djikstra es un algoritmo muy
nico. Inicialmente, se utiliza un enfoque voraz para
conseguir distancias iniciales a los nodos vecinos.
Luego, en el siguiente paso, se comprueba si el valor
calculado es el ptimo global a ese nodo o no. Si no,
se comprueban todos los otros caminos y calcula la
distancia ptima a ese nodo.
Luego, basndose en los valores ya calculados de los
nodos anteriores, se calcula el camino ms corto para
el nodo final. Por lo tanto, esto es una especie de un
enfoque de programacin dinmica.

Algoritmo de Dijkstra (1959)


As, Djikstra utiliza ambos enfoques y, por tanto, no
puede ser completamente clasificada como "Greedy" o
"DP". Es una mezcla de ambos y por lo tanto, es
nico. Siempre ha sido un tema debatido. Tal es la
belleza del algoritmo.
Dado un grafo G=(V,A) y un vrtice s, encontrar el
camino de costo mnimo para llegar desde s al resto de
los vrtices en el grafo.
IDEA: Mantener el conjunto de nodos ya explorados
para los cuales ya hemos determinado el camino
ms corto desde s

Ejercicios: Ejercicios sobre Dijkstra, Prim y Kruskal


Para los siguientes 5 grafos detallar la solucin de la

ruta ms corta del nodo (1) a todos los nodos (Dijkstra) y


el rbol recubridor mnimo mediante Prim y Kruskal.
Describir de manera detallada los algoritmos y sus pasos.
Ejercicio 01

Ejercicio 02

Ejercicio 03

Ejercicio 04

Ejercicio 05

Você também pode gostar