You are on page 1of 23

Paradigmas computacionales

1. Algoritmos greedy
2. Paradigma greedy
Este mtodo generalmente da origen a algoritmos ms simples y
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


ptimas, 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