Professional Documents
Culture Documents
INTRODUCCION
El mtodo Greedy es generalmente utilizado para resolver problemas de optimizacin,
es decir, problemas en los cuales se tiene un conjunto de candidatos, de los cuales se
debe elegir un subconjunto que satisfaga una cierta condicin de optimalizad y
eventualmente condiciones de factibilidad.
El mtodo Greedy consiste en analizar el conjunto de candidatos y tomar, en cada
etapa una decisin optima (elegir el mejor candidato). Esta decisin 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 mtodo Greedy trabaja en etapas y
en cada etapa se toma una decisin localmente optima, de manera de generar la
solucin ptima al problema.
Claramente el hecho de generar la solucin optima a partir de una sucesin de
decisiones localmente optimas en varias etapas, no es vlido para cualquier problema
ni aun para instancias del mismo problema.
CARACTERSTICAS GENERALES.
ESQUEMA GENERAL.
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 solucin al problema, esta no es ptima dado que la
solucin 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 solucin ptima.
Como conclusin puede decirse que este problema no es resoluble por el mtodo Greedy,
dado que hallar la solucin optima tomando la moneda de mayor valor (decisin localmente
optima) en cada etapa conduce a la solucin optima dependiendo del valor delas monedas.
Cada artculo 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 formulacin y
resolucin de un modelo de optimizacin matemtica para dicho propsito. 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 carguero
puede transportar algunos de los siguientes contenedores:
Programacin Entera:
Variables de Decisin:
La solucin 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 solucin ptima consiste en transportar los contenedores
C1, C3, C4, C5, C6, C7, C8 y C9 lo que reporta un similar valor en la funcin objetivo.
#include<iostream>
#define max 30
int C[max];
using namespace std;
//saca el tamao del vector-------------------------------int tama(int tabla[max])
{
int tam=0;
while (tabla[tam]!=' ')
tam++;
return tam;
}
//ordena vector -------------------------------void burbuja (int n )
{
int B;
do{
n=n+C[m];
if(n>mon)//verifica
{ n=n-C[m];
if(m==-1) {cout<<"no es posible cambiar"; break;}
}
else {sol[t]=C[m];t++;}//fin de verifica
d--;
}while(d!=0);
m--;l--;
}
//fin del desarrollo---------------------------------------------------if(mon==n){//solucion
cout<<"El reparto de algoritmo greedy es: "<<endl;
for(i=0; i<t;i++)
cout<<sol[i]<<endl;}
else{cout<<"no es posible cambiar ";}//no solucion
return 0;}
ACTIVIDADES:
#include<iostream>
#define MAX 50
using namespace std;
int S[MAX] ; // solucion
int c[MAX] ; // comienzo de cada actividad
int f[MAX] ; // final de cada actividad
/* Ingreso de datos
------------------------------------------------------------------------*/
void ingresar_actividades(int n)
{
for(int i=0; i<n; i++)
{
do
{
cout << " Actividad " << i+1 << endl<< endl ;
cout << "\tinicio : " ; cin >> c[i] ;
cout << "\tfinal : " ; cin >> f[i] ;
cout << endl ;
}while( c[i] > f[i] ) ; // el inicio no puede ser mayor que el final
}
}
/* Mostrando solucion
------------------------------------------------------------------------*/
void mostrar_datos(int n)
{
cout<<" Actividades ingresadas. "<<endl<<endl ;
cout<<"\t\t Ai : " ;
for(int i=0; i<n; i++)
cout<< i+1 <<' ';
cout<<endl<<"\t\t-------------------------"<<endl ;
cout<<"\t inicio : " ;
for(int i=0; i<n; i++)
cout<< c[i] <<' ';
cout<<endl ;
cout<<"\t fin : " ;
for(int i=0; i<n; i++)
cout<< f[i] <<' ';
}
/* Ordenando actividades
------------------------------------------------------------------------*/
void Ordenar ( int n)
{
int aux1, aux2, aux3, band = 1 ;
for(int i=n-1; i>0 && band==1; i--)
{
band = 0;
for(int j=0; j<i; j++)
{
if( f[j] > f[j+1])
{
aux1 = f[j] ;
f[j] = f[j+1] ;
f[j+1] = aux1 ;
aux2 = c[j] ;
c[j] = c[j+1] ;
c[j+1] = aux2 ;
band = 1 ;
}
}
}
mostrar_datos(n) ;
}
/* Devolviendo solucion
------------------------------------------------------------------------*/
void devolver_solucion()
{
cout<<endl<<" Solucion voraz: \n\n\t" ;
int i = 0 ;
while( 1 )
{
cout<<"A" << S[i] + 1 << " " ;
i ++ ;
if(S[i]==0)
break ;
}
}
/* Algoritmo de solucion
------------------------------------------------------------------------*/
void algoritmo_seleccion( int n )
{
Ordenar ( n ) ;
int z , k = 1 ;
S[0] = 0 ;
z=0;
for( int i=1; i<n; i++ )
{
if( c[i] >= f[z] )
{
S[k] = i ; // actividad seleccionada
z=i;
k++ ;
}
}
devolver_solucion() ;
}
/* Funcion Principal
------------------------------------------------------------------------*/
int main()
{
int N ; // numero de actividades
cout<<" Ingrese numero de actividades: ";
cin>> N ;
cout<<endl ;
ingresar_actividades( N );
system("cls");
algoritmo_seleccion( N ) ;
cout<<endl<<endl ;
system("pause");
return 0 ;
}
Linkografa:
http://elvex.ugr.es/decsai/algorithms/slides/4%20Greedy.pdf
http://www.fceia.unr.edu.ar/lcc/t312/archivos/09.ED.Practica.Greedy.pdf
http://www.fceia.unr.edu.ar/lcc/t312/archivos/09.ED.Greedy.handout.pdf