Algoritmo de Greedy
-
Upload
grecia-geronimo-sanes -
Category
Documents
-
view
231 -
download
0
Transcript of Algoritmo de Greedy
-
8/17/2019 Algoritmo de Greedy
1/12
ALGORITMO DE GREEDY
Cruzado Berrú Luis
Paredes Quispe Angelic
-
8/17/2019 Algoritmo de Greedy
2/12
INTRODUCCION
El método Greedy es generalmente utilizado para resolver problemas de optimización,
es decir, problemas en los cuales se tiene un conjunto de candidatos, de los cuales sedebe elegir un subconjunto que satisfaga una cierta condición de optimalizad y
eventualmente condiciones de factibilidad.
El método Greedy consiste en analizar el conjunto de candidatos y tomar, en cada
etapa una decisión optima (elegir el mejor candidato). Esta decisión es tomada
localmente, ósea sin tener en cuenta las decisiones de etapas pasadas o de etapas
futuras.
De acuerdo a lo anterior se puede resumir que el método Greedy trabaja en etapas y
en cada etapa se toma una decisión localmente optima, de manera de generar la
solución óptima al problema.
Claramente el hecho de generar la solución optima a partir de una sucesión de
decisiones localmente optimas en varias etapas, no es válido para cualquier problema
ni aun para instancias del mismo problema.
CARACTERÍSTICAS GENERALES.
Se utilizan generalmente para resolver problemas de optimización
(obtener el máximo o el mínimo).
Toman decisiones en función de la información que está disponible
en cada momento.
Suelen ser rápidos y fáciles de implementar.
No siempre garantizan alcanzar la solución óptima.
Para poder resolver un problema usando el enfoque Greedy, tendremos
que considerar 6 elementos:
IMPORTANTE
EL ENFOQUE “GREEDY” NO NOS GARANTIZA OBTENER SOLUCIONES ÓPTIMAS.
-
8/17/2019 Algoritmo de Greedy
3/12
1) Conjunto de candidatos (elementos seleccionables)
2) Solución parcial (candidatos seleccionados).
3) Función de selección (determina el mejor candidato del conjunto de
candidatos seleccionables).
4)
Función de factibilidad (determina si es posible completar lasolución parcial para alcanzar una solución del problema).
5) Criterio que define lo que es una solución (indica si la solución
parcial obtenida resuelve el problema).
6) Función objetivo (valor de la solución alcanzada).
ESQUEMA GENERAL.
Ejemplo 1 (problema de las monedas)
Dada una cantidad de dinero y un conjunto de monedas de distintos valores, cambiar a
monedas el dinero utilizando la mínima cantidad de monedas.
Se plantea el siguiente algoritmo para resolver el problema:
Mientras dinero > 0 hacer
Sea i la moneda de mayor valor que cumple
valor (i)
-
8/17/2019 Algoritmo de Greedy
4/12
K: = dinero div valor (i)
dinero = dinero - k * valor (i)
Se puede observar que es un algoritmo basado en el método Greedy, trabaja por etapas y
toma en cada una de ellas la decisión localmente óptima: tomar tantas veces como sea posible
la moneda de mayor valor.
A continuación se verá que sucede para distintas instancias del problema:
a) Dinero = 10
Monedas con valores 3 y 2
No se puede resolver con el algoritmo planteado, aunque existe una solución al
problema.
b)
Dinero = 15
Monedas con valores 11, 5 y 1
El resultado que se obtenido usando el algoritmo planteado:
1 moneda de 11
4 monedas de 1
Por lo tanto aunque el algoritmo halla una solución al problema, esta no es óptima dado que la
solución óptima está dada por 3 monedas de 5.
c) Dinero = 15
Monedas con valores 10, 5 y 1
El resultado que se obtiene usando el algoritmo planteado:1 moneda de 10
1 moneda de 5
Lo cual constituye la solución óptima.
Como conclusión puede decirse que este problema no es resoluble por el método Greedy,
dado que hallar la solución optima tomando la moneda de mayor valor (decisión localmente
optima) en cada etapa conduce a la solución optima dependiendo del valor delas monedas.
Problema de la Mochila en Programación Entera resuelto
El Problema de la Mochila (conocido también como Knapsack Problem o simplemente KP) es
un problema clásico de la Investigación de Operaciones y en particular de la Programación
Entera. Consiste en un excursionista que debe preparar su mochila, la cual tiene una capacidad
limitada y por tanto no le permite llevar todos los artículos que quisiera tener en la excursión.
-
8/17/2019 Algoritmo de Greedy
5/12
Cada artículo que el excursionista puede incluir en la mochila le reporta una determinada
utilidad. Luego el problema consiste en seleccionar un subconjunto de objetos de forma tal
que se maximice la utilidad que el excursionista obtiene, pero sin sobrepasar la capacidad de
acarrear objetos.
En este contexto existen varias aplicaciones que guardan una similitud conceptual con el
Problema de la Mochila y en consecuencia nos podemos beneficiar de la formulación y
resolución de un modelo de optimización matemática para dicho propósito. Consideremos el
siguiente ejemplo:
Problema de la Mochila
Un armador tiene un carguero con capacidad de hasta 700 toneladas. El carguero transporta
contenedores de diferentes pesos para una determinada ruta. En la ruta actual el cargueropuede transportar algunos de los siguientes contenedores:
El analista de la empresa del armador desea determinar el envío (conjunto de contenedores)
que maximiza la carga transportada. Para ello se propone el siguiente modelo de
Programación Entera:
Variables de Decisión:
Función Objetivo: Consiste en maximizar la carga que transportará el carguero.
-
8/17/2019 Algoritmo de Greedy
6/12
Restricciones: El peso de la carga transportada no puede exceder la capacidad
máxima del carguero.
Al implementar computacionalmente el problema anterior haciendo uso de
OpenSolver se alcanzan los siguientes resultados:
La solución óptima consiste en transportar los contenedores C1, C2, C3, C4, C8, C9 y
C10, con un valor óptimo de 700 (toneladas), es decir, se utiliza la capacidad completa
del carguero. Notar que otra solución óptima consiste en transportar los contenedores
C1, C3, C4, C5, C6, C7, C8 y C9 lo que reporta un similar valor en la función objetivo.
Problema de la mochila simple
Observar que en un problema de la mochila 0-1, si para cada tipo de ítem el beneficio y
los pesos son idénticos (vi=wi), entonces el problema quedaría formulado de la
siguiente forma
Por tanto si existe un vector xi tal que , entonces esa será una
solución al problema. Si existe una solución xi de este tipo, resolver el problema de la
mochila realmente es resolver el problema de la suma de subconjuntos. Además si el
conjunto de los pesos de los elementos es una secuencia súper-creciente, es decir, se
verifica que:
-
8/17/2019 Algoritmo de Greedy
7/12
Entonces se dice que se trata de un problema de la mochila simple o también
problema de la mochila tramposa. Este tipo de problemas tiene importantes
aplicaciones en el mundo de la criptografía.
PROBLEMA DE LA MOCHILA DE MÚLTIPLE ELECCIÓN
Si en un problema de la mochila 0-1 los ítems están subdivididos en k clases,denotadas por Ni, y exactamente un ítem tienen que ser tomado de cada clase,
entonces hablamos del problema de la mochila de múltiple elección.
PROBLEMA DE LA MOCHILA MÚLTIPLE
Si en un problema de la mochila 0-1 tenemos "n" ítems y m mochilas con capacidades
Wi entonces tenemos el problema de la mochila múltiple.
Un caso especial del problema de la mochila múltiple es cuando los beneficios son
iguales a los pesos y todas las mochilas tienen la misma capacidad. Entonces se le
llama problema de la múltiple suma de subconjuntos.
Código de algoritmo de GREEDY
MONEDAS:
#include
#define max 30
int C[max];
using namespace std;
//saca el tamaño del vector--------------------------------
int tama(int tabla[max])
{
int tam=0;
while (tabla[tam]!=' ')
tam++;
return tam;
}
//ordena vector --------------------------------
void burbuja (int n )
{
int B;
-
8/17/2019 Algoritmo de Greedy
8/12
for (int i=n-1;i>=1;i--)
for(int j=0;jC[j+1])
{
B=C[j];C[j]=C[j+1];
C[j+1]=B;
}
}
//principal
int main(){
int i=0,m,mon,t,n,cant[max],l,sol[max];
char continuar;
cout
-
8/17/2019 Algoritmo de Greedy
9/12
do{
n=n+C[m];
if(n>mon)//verifica
{ n=n-C[m];
if(m==-1) {cout
-
8/17/2019 Algoritmo de Greedy
10/12
}
}
/* Mostrando solucion
------------------------------------------------------------------------*/
void mostrar_datos(int n)
{cout
-
8/17/2019 Algoritmo de Greedy
11/12
------------------------------------------------------------------------*/
void devolver_solucion()
{
cout
-
8/17/2019 Algoritmo de Greedy
12/12
ingresar_actividades( N );
system("cls");
algoritmo_seleccion( N ) ;
cout