You are on page 1of 23

Paradigmas computacionales

1.

Algoritmos greedy

2. Paradigma greedy

Este mtodo generalmente da origen a algoritmos mas simples y mas rpidos, pero no es tan poderoso o muy aplicable para la solucin de problemas, como lo es la PD. A pesar de que los algoritmos greedy no producen soluciones optimas, ellos proporcionan heursticas rpidas (soluciones estratgicas no optimas) y son usados para hallar buenas aproximaciones. Este tipo de algoritmos empieza con la solucin de un subproblema pequeo, luego construye la solucin de todo el problema

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

Ventaja:

Cuando este tipo de algoritmos trabajan, lo hacen bien rpido.

Desventaja:

No siempre trabajan.

Estudiaremos:
1 Problema del cambio de moneda 2 Problema de la Mochila 3 Problema de hallar el rbol Expandido Mnimo 4 Problema de la ruta corta.

Funcin Voraz (esquema):


funcin Voraz (C:conjunto): conjunto S := conjunto vaco; {la solucin se construye en S} mientras C <> conjunto vaco y no solucin(S) hacer x := seleccionar(C); C := C - {x}; si factible (SU{x}) entonces S := SU{x} finmientras si solucin (S) entonces devolver S sino devolver "no hay soluciones finsi fin funcin

Problema del cambio de moneda

1) EL PROBLEMA DEL CAMBIO DE MONEDAS Dado un conjunto C de N tipos de monedas con un nmero inagotable de ejemplares de cada tipo, hay que conseguir, si se puede, formar la cantidad M empleando el MNIMO nmero de ellas.

Sistema monetario M: monedas de valor 1, 2, 5, 10, 20, 50, 100, 200 Problema: pagar exactamente n unidades de valor con un mnimo de monedas.
funcin Devolver cambio (n) : conjunto de monedas const M = {1, 2, 5, 10, 20, 50, 100, 200}; {denominaciones de las monedas} S := conjunto vaco; {la solucin se construye en S} ss := 0; {suma de las monedas de S} mientras ss =< n hacer x := seleccionar mayor elemento factible de M Si ss + x <= n; S := S U {una moneda de valor x}; ss := ss + x; finsi finmientras Si solucin (S) entonces devolver S Sino devolver "no hay soluciones"; Fin_si devolver S fin funcin

TAMBIEN :

Por qu funciona? M adecuado y nmero suficiente de monedas. No funciona con cualquier M: Ejemplo: M={1, 4, 6}, n=8, S={6, 1, 1} en vez de {4, 4} (ptimo) Este problema se resolver con Programacin Dinmica La funcin Devolver cambio es voraz (algoritmos vidos, greedy) Por qu voraz? Selecciona el mejor candidato que puede en cada iteracin, sin valorar consecuencias. Una vez seleccionado un candidato, decide definitivamente: - aceptarlo, o - rechazarlo sin evaluacin en profundidad de alternativas, sin retroceso... Algoritmos sencillos: tanto en diseo como en implementacin. Cuando la tcnica funciona, se obtienen algoritmos eficientes.

Resuelven problemas de optimizacin: En cada fase, toman una decisin (seleccin), satisfaciendo un ptimo local segn la informacin disponible, esperando as, en conjunto, satisfacer un ptimo global.
Manejan un conjunto de candidatos C: En cada fase, retiran el candidato seleccionado de C, y si es aceptado se incluye en S: Conjunto donde se construye la solucin candidatos aceptados.

Utilizan 4 funciones (explcitamente o no): 1. S es Solucin? 2. S es Factible? Puede completarse para obtener una solucin? 3. Seleccin: determina el mejor candidato 4. Objetivo: valora S (relacionada con Seleccin)

Encontrar S: Solucin y optimiza Objetivo (max/min)

2) Problema del cambio de monedas

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 siguientes ejemplos como demostracin de lo dicho:

a) Monedas 50 25 5 1 Cantidad 3 4 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.

b)
Monedas 6 4 1 Cantidad 3 4 1 Si queremos devolver la cantidad 8, siguiendo el procedimiento anterior, el algoritmo tomara primero una moneda de 6, quedando un resto de 2. Tomara 2 monedas de valor 1, Pero slo habiendo una moneda de 1 sol, no se puede hallar solucin. Cuando es fcil ver que con 2 monedas de valor 4 se obtiene el resultado pedido.

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

Problema de la mochila

You might also like