2_algoritmos avidos
DESCRIPTION
Algoritmos avidos, 2_Algoritmos de empate de cadenas, 2_AlgoritmosProbabilistas, 2_Divide y venceras, 2_Programación dinámica, AlgoritmosProgramaciónDinámica, Huffman voraz, Práctica6, Practica7, Practica8TRANSCRIPT
-
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
-
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 la funcin que queremos
maximizar o minimizar.
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.
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.
Denominacin de
Monedas 50 25 5 1
-
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
-
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
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.
Denominacin de
Monedas 50 25 5 1
Monedas disponibles 3 4 1 6
-
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 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