Upload
benjamin-cruz
View
223
Download
1
Embed Size (px)
DESCRIPTION
Codigo y descripcion de el problema clasico de programacion. C
Citation preview
Algoritmos y Estructuras de Datos IIIFacultad de Informatica, Grupo 2B
Universidad Politecnica de Valencia
Tema 4:Algoritmos Voraces
Enrique Vidal [email protected]
Diciembre, 2000
E. Vidal – UPV
AD3-A.Voraces-4 Diciembre, 2000
Algoritmos Voraces: Indice
1. Estartegia Voraz
2. El Problema de la Mochila
3. Solucion voraz al problema de la Mochilacon Fraccionamiento
E. Vidal – UPV Pagina 4.1
AD3-A.Voraces-4 Diciembre, 2000
Mochila con Fraccionamiento (“mochiTime.c”)
/* Programa de prueba de algoritmos para Mochila con Fraccionamiento */
#include <stdlib.h>#include <stdio.h>#include <time.h>#include <math.h>/* ------------------------- Tipos, Variables globales y Macros generales */
#define maxTalla 1024000
int v[maxTalla+1]; /* indices a tama~nos t[] y valores g[] de objetos */short t[maxTalla+1]; /* tama~nos de los objetos */short g[maxTalla+1]; /* valores de objetos */
#define comp(i,j) ((float )g[i]/(float )t[i])-((float )g[j]/(float )t[j])/* compara objetos i y j segun su valor relativo */
#define ERROR(mens) {fprintf(stderr,mens); exit(1);} /* Fin por error */#define HERROR(mens) {printHelp(mens); exit(1);} /* Help/fin */#define RELOJ ( (float )clock()/CLOCKS_PER_SEC ) /* tiempo en segundos */
E. Vidal – UPV Pagina 4.2
AD3-A.Voraces-4 Diciembre, 2000
/* ----------------------------------------------------------------------QuickSort
*/int separa(int p, int r) { /* Particion de un vector desordenados. */
int i,j,x,z; /* Obtiene un ındice q, p<=q<r y separa los *//* elementos de v tal que v[p..q] <= v[q+1..r] */
i=p-1; j=r+1; x=v[p]; /* x es el pivote */while (1) {
do j--; while (comp(v[j],x)<0);do i++; while (comp(v[i],x)>0);if (i<j) { z=v[i]; v[i]=v[j]; v[j]=z; } /* intercambio */else return(j);
}}
void qks(int p, int r) { /* [ 0<p<=r<maxVec ] Algoritmo quickSort */int q;if (p<r) { /* si p>=r, solo hay 0 o 1 elementos y ya estan ordenados */q=separa(p,r); qks(p,q); qks(q+1,r);
}}
E. Vidal – UPV Pagina 4.3
AD3-A.Voraces-4 Diciembre, 2000
/* ----------------------------------------------------------------------Heap
*/typedef int element; int tllH=0;void heapify(int i) { /* restaura heap subarbol de raiz i */int l,r,mayor; element aux;
mayor=i; l=2*i; r=2*i+1;if ((l<=tllH) && (comp(v[l],v[i]) > 0)) mayor=l; /* mayor=argMax( */if ((r<=tllH) && (comp(v[r],v[mayor]) > 0)) mayor=r; /* v[i],v[l],v[r]) */if (mayor != i) {
aux=v[mayor]; v[mayor]=v[i]; v[i]=aux; /* intercambio v[mayor],v[i] */heapify(mayor);
}}void buildHeap(int n) { /* convierte v[1..n] en Heap mediante heapify */int i;
tllH=n; for (i=(int )(n/2); i>0; i--) heapify(i);}element extrMax() { /* Extrae el maximo del Heap (y lo elimina) */element x;
if (tllH==0) ERROR("**Error: extraeMax en un Heap vacio\n");x=v[1]; v[1]=v[tllH]; v[tllH]=x; /* guarda el elemento extraido */tllH--; heapify(1); return(x); /* para futuro uso */
}E. Vidal – UPV Pagina 4.4
AD3-A.Voraces-4 Diciembre, 2000
/* ======================================================================Lectura de opciones, generacion de instancias e invocacion algoritmo
*/void main(int argc, char *argv[]) {
#define maxAlgor 2#define maxShort 32767#define maxM 2147483647 /* maxint */#define maxMr 1000 /* por cien sobre talla*rangot */#define maxRang 1024#define maxInst 1024000#define maxTiempo 36000 /* 36000 segundos = 10 horas */
int i, j, k, p, verRes=0, algor=1, semilla=1, M=0, Mr=50,rangot=256, rangog=256, talla=1024, ninst=1024, tiempo=maxTiempo;
float t0, tt, x, T, TM, G;
E. Vidal – UPV Pagina 4.5
AD3-A.Voraces-4 Diciembre, 2000
/* --------------------------------------------------------------------Breve ayuda ‘On-Line’ */
void printHelp(char *mens) {printf("Mochila con Fraccionamiento mediante: Sort (-a 1), Heap (-a 2)\nUso: %s [Opciones]", argv[0]);printf("Opciones:\n\
-h Muestra esta ayuda-v <num> Ver resultados (ultima) instancia procesada {0..2}[%d]-a <num> Algoritmo a utilizar {0..%d}[%d]-s <num> Semilla para la generacion datos aleatorios {0..%d}[%d]-M <num> Capacidad de la Mochila (M=0: usar -Mr) {1..%d}[%d]-Mr <num> Capacidad relativa en %% de t*(rt/2) {1..%d}[%d]-rt <num> Rango de tama~nos de objetos a generar {1..%d}[%d]-rg <num> Rango de valores de objetos a generar {1..%d}[%d]-t <num> Talla: Numero de objetos a generar {1..%d}[%d]-n <num> (Maximo) numero de instancias a procesar {1..%d}[%d]-T <num> Tiempo permitido en segundos {1..%d}[%d]
%s\n",verRes, maxAlgor,algor, maxShort,semilla, maxM,M, maxMr,Mr,maxRang,rangot, maxRang,rangog, maxTalla,talla, maxInst,ninst,maxTiempo,tiempo, mens);
}E. Vidal – UPV Pagina 4.6
AD3-A.Voraces-4 Diciembre, 2000
/* --------------------------------------------------------------------Analisis de opciones y argumentos
*/#define argVal(jj,arg) (strcmp(argv[jj],arg)==0) && (jj+1<argc)#define acota(var,mini,maxi) ((var<mini) || (var>maxi))
if (argc>18) HERROR("\n**Error: Demasiados argumentos");for (i=1; i<argc; i++) {
if (strcmp(argv[i],"-h")==0) {printHelp(""); exit(1);}else if (argVal(i,"-v")) verRes = atoi(argv[++i]);else if (argVal(i,"-a")) algor = atoi(argv[++i]);else if (argVal(i,"-s")) semilla = atoi(argv[++i]);else if (argVal(i,"-M")) M = atoi(argv[++i]);else if (argVal(i,"-Mr")) Mr = atoi(argv[++i]);else if (argVal(i,"-rt")) rangot = atoi(argv[++i]);else if (argVal(i,"-rg")) rangog = atoi(argv[++i]);else if (argVal(i,"-t")) talla = atoi(argv[++i]);else if (argVal(i,"-n")) ninst = atoi(argv[++i]);else if (argVal(i,"-T")) tiempo = atoi(argv[++i]);else HERROR("\n**Error: opcion desconocida\n");
}
E. Vidal – UPV Pagina 4.7
AD3-A.Voraces-4 Diciembre, 2000
if (M<=0) M=(int )(float )Mr*(float )talla*(float )rangot/200.0;else Mr=(int )(200.0*(float )M/((float )talla*(float )rangot));TM=(float )M;
if ( acota(algor,0,maxAlgor) ||acota(semilla,0,maxShort) || acota(M,1,maxM) ||acota(Mr,1,maxMr) || acota(rangot,1,maxRang) ||acota(rangog,1,maxRang) || acota(talla,1,maxTalla) ||acota(ninst,1,maxInst) || acota(tiempo,1,maxTiempo) )
HERROR("\n**Error: algun parametro fuera de rango\n");
E. Vidal – UPV Pagina 4.8
AD3-A.Voraces-4 Diciembre, 2000
/* --------------------------------------------------------------------Generacion de instancias, invocacion algoritmo y computo de tiempos.
*/srand(semilla); tt=0.0; i=0;do { i++; /* generamos datos en t[] y g[], */
for (j=1; j<=talla; j++) { /* indexadas por v[] */v[j] = j; t[j] = 1 + rand()%rangot; g[j] = 1 + rand()%rangog;
}t0 = RELOJ; k=0; T=G=0.0; x=1.0;switch(algor) {
case 1: qks(1,talla);while ((T<TM) && (k<talla)) {
k++; p=v[k]; T+=t[p]; G+=g[p];} break;
case 2: buildHeap(talla);while ((T<TM) && (k<talla)) {
k++; p=extrMax(); T+=t[p]; G+=g[p];} break;
default: break;} if (T>TM) {x=1-(T-TM)/t[p]; G-=(1-x)*g[p];}tt += RELOJ - t0; if (tt >= (float )tiempo) break;
} while(i<ninst);
E. Vidal – UPV Pagina 4.9
AD3-A.Voraces-4 Diciembre, 2000
/* --------------------------------------------------------------------Impresion de Resultados
*/printf("a: %d t: %-7d Mr: %-3d : Procesadas %6d instancias "
"en %6.2f segundos\n", algor, talla, Mr, i, tt);
if (verRes>0) printf("\nUltima instancia: M=%d, k=%d, ""x=%3.2f, T=%3.2f, G=%3.2f\n\n", M, k,x,T,G);
if (verRes>1) {for (j=1; j<=talla && j<=10; j++) printf(" %6d", j); printf("\n");for (j=1; j<=talla && j<=10; j++) printf(" ------"); printf("\n");
for (j=1; j<=talla; j++) {printf(" %6d", g[v[j]]); if (j%10==0) printf("\n");
} if (j%10!=1) printf("\n"); printf("\n");for (j=1;j<=talla;j++) {
printf(" %6d", t[v[j]]); if (j%10==0) printf("\n");} if (j%10!=1) printf("\n"); printf("\n");for (j=1; j<=talla; j++) {
printf(" %6.2f", (float )g[v[j]]/t[v[j]]); if (j%10==0) printf("\n");} if (j%10!=1) printf("\n");printf("\n");
}}E. Vidal – UPV Pagina 4.10
AD3-A.Voraces-4 Diciembre, 2000
Resultados de “moch” usando Heap de aristasfor Mr in 1 4 16 64 128 200 ; do echo ; for t in 1000 10000 100000 1000000 ; do
moch -t $t -Mr $Mr -n 5 -a 2done ; done
a: 2 t: 1000 Mr: 1 : Procesadas 5 instancias en 0.01 segundosa: 2 t: 10000 Mr: 1 : Procesadas 5 instancias en 0.11 segundosa: 2 t: 100000 Mr: 1 : Procesadas 5 instancias en 1.56 segundosa: 2 t: 1000000 Mr: 1 : Procesadas 5 instancias en 20.43 segundos
a: 2 t: 1000 Mr: 4 : Procesadas 5 instancias en 0.02 segundosa: 2 t: 10000 Mr: 4 : Procesadas 5 instancias en 0.18 segundosa: 2 t: 100000 Mr: 4 : Procesadas 5 instancias en 2.49 segundosa: 2 t: 1000000 Mr: 4 : Procesadas 5 instancias en 33.86 segundos
a: 2 t: 1000 Mr: 16 : Procesadas 5 instancias en 0.03 segundosa: 2 t: 10000 Mr: 16 : Procesadas 5 instancias en 0.31 segundosa: 2 t: 100000 Mr: 16 : Procesadas 5 instancias en 4.25 segundosa: 2 t: 1000000 Mr: 16 : Procesadas 5 instancias en 61.18 segundos
a: 2 t: 1000 Mr: 64 : Procesadas 5 instancias en 0.03 segundosa: 2 t: 10000 Mr: 64 : Procesadas 5 instancias en 0.58 segundosa: 2 t: 100000 Mr: 64 : Procesadas 5 instancias en 8.16 segundosa: 2 t: 1000000 Mr: 64 : Procesadas 5 instancias en 121.15 segundos
a: 2 t: 1000 Mr: 128 : Procesadas 5 instancias en 0.05 segundosa: 2 t: 10000 Mr: 128 : Procesadas 5 instancias en 0.73 segundosa: 2 t: 100000 Mr: 128 : Procesadas 5 instancias en 10.43 segundosa: 2 t: 1000000 Mr: 128 : Procesadas 5 instancias en 157.67 segundos
a: 2 t: 1000 Mr: 200 : Procesadas 5 instancias en 0.05 segundosa: 2 t: 10000 Mr: 200 : Procesadas 5 instancias en 0.75 segundosa: 2 t: 100000 Mr: 200 : Procesadas 5 instancias en 10.41 segundosa: 2 t: 1000000 Mr: 200 : Procesadas 5 instancias en 157.21 segundos
E. Vidal – UPV Pagina 4.11
AD3-A.Voraces-4 Diciembre, 2000
Resultados de “moch” con Sort de aristasfor Mr in 1 4 16 64 128 200 ; do echo ; for t in 1000 10000 100000 1000000 ; do
moch -t $t -Mr $Mr -n 5 -a 1done ; done
a: 1 t: 1000 Mr: 1 : Procesadas 5 instancias en 0.03 segundosa: 1 t: 10000 Mr: 1 : Procesadas 5 instancias en 0.49 segundosa: 1 t: 100000 Mr: 1 : Procesadas 5 instancias en 6.40 segundosa: 1 t: 1000000 Mr: 1 : Procesadas 5 instancias en 86.32 segundos
a: 1 t: 1000 Mr: 4 : Procesadas 5 instancias en 0.04 segundosa: 1 t: 10000 Mr: 4 : Procesadas 5 instancias en 0.47 segundosa: 1 t: 100000 Mr: 4 : Procesadas 5 instancias en 6.44 segundosa: 1 t: 1000000 Mr: 4 : Procesadas 5 instancias en 86.81 segundos
a: 1 t: 1000 Mr: 16 : Procesadas 5 instancias en 0.04 segundosa: 1 t: 10000 Mr: 16 : Procesadas 5 instancias en 0.47 segundosa: 1 t: 100000 Mr: 16 : Procesadas 5 instancias en 6.37 segundosa: 1 t: 1000000 Mr: 16 : Procesadas 5 instancias en 87.32 segundos
a: 1 t: 1000 Mr: 64 : Procesadas 5 instancias en 0.03 segundosa: 1 t: 10000 Mr: 64 : Procesadas 5 instancias en 0.50 segundosa: 1 t: 100000 Mr: 64 : Procesadas 5 instancias en 6.45 segundosa: 1 t: 1000000 Mr: 64 : Procesadas 5 instancias en 88.67 segundos
a: 1 t: 1000 Mr: 128 : Procesadas 5 instancias en 0.04 segundosa: 1 t: 10000 Mr: 128 : Procesadas 5 instancias en 0.50 segundosa: 1 t: 100000 Mr: 128 : Procesadas 5 instancias en 6.48 segundosa: 1 t: 1000000 Mr: 128 : Procesadas 5 instancias en 89.57 segundos
a: 1 t: 1000 Mr: 200 : Procesadas 5 instancias en 0.04 segundosa: 1 t: 10000 Mr: 200 : Procesadas 5 instancias en 0.49 segundosa: 1 t: 100000 Mr: 200 : Procesadas 5 instancias en 6.45 segundosa: 1 t: 1000000 Mr: 200 : Procesadas 5 instancias en 89.08 segundos
E. Vidal – UPV Pagina 4.12
AD3-A.Voraces-4 Diciembre, 2000
Resultados comparativos “moch” con Heap/Sort de aristas
0.01
0.1
1
10
100
1 10 100
Tie
mpo
(se
g)
Capacidad Relativa (%)
Mochila con Fraccionamiento: uso de Sort y Heap
SORT
SORT
SORT
SORT
HEAP
HEAP
HEAP
HEAP
Talla=1k
Talla=10k
Talla=100k
Talla=1000k
E. Vidal – UPV Pagina 4.13