Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introduccin o
En este informe se presentan 3 algoritmos de fuerza bruta y su visualizacin meo diante el software gnuplot. Fuerza bruta es un mtodo de diseo de algoritmos e en el cual se resuelve un problema de una manera directa. Dos de los algoritmos son de ordenamiento, Bubblesort y Selectionsort,y la idea es visualizar su funcionamiento paralelamente. El tercer algoritmo es Convexhull que consiste en obtener de un conjunto de puntos en un plano encerrar el mayor pol gono convexo formado por los puntos.
2
2.1
1 2 3 4 5 6 7 8 9 10
for i 1 to n 1 do for j (i + 1) to n do if L[i] > L[j] then aux = L[i] ; L[i]= L[j] ; L[j]= aux ; end end end return L
Bsicamente el algoritmo lo que hace es posicionar el elemento menor al princia pio de la lista en cada iteracin mediante comparacin con los otros elementos o o de la lista. Se pueden realizar mejoras al algoritmo como el poner un ag de aviso que se realizaron cambios, sino es porque la lista est ordenada. a
2.2
Ordenamiento: Selectionsort
for i 1 to n 1 do m nimo= i ; for j (i + j) to n do if L[m nimo] > L[j] then m nimo = j ; end end aux = L[m nimo] ; L[m nimo] =L[i] ; L[i] = aux ; end return L
El algoritmo guarda en cada iteracin el o ndice del menor elemento y realiza el intercambio con el primera posicin de la lista despes de recorrerla entera. o u As sucesivamente hasta asignar el valor correcto para cada posicin. o
2.3
Convexhull
Input : Lista de parmetros x de conjunto de puntos P, Lista de a parmetros y de conjunto de puntos P, nmero de puntos n a u Output: Puntos de mayor pol gono convexo del conjunto de puntos P
1 2 3 4 5 6 7 8 9 10 11 12 13
for i 1 to n 1 do for j i + 1 to n do a= y[j] - y[i] ; b= x[i] - x[j] ; c= x[i]y[j]-y[i]x[j] ; for k 1 to n do if i = k y j = k then Evaluar ax[k]+by[k] con c end end end end return L
Si todos los puntos evaluados en ax[k]+by[k] son menores o mayores a c entonces los puntos i y j son pertenecientes al pol gono convexo mayor.
3
3.1
Implementacin o
Implementacin en Lenguaje C o
Printed by morenostar jun 11, 11 20:38 #include <stdlib.h> #include <math.h> #include <stdio.h> #include "gnuplot_i.h"
convex.c
Page 1/3
void bubblesort(double *x,double *y,int n) { int aux,aux2, i, j; for (i = 0; i < n 1 ; i++) for (j = i + 1; j < n ; j++) if (x[i] > x[j]) { aux = x[i]; x[i] = x[j]; x[j] = aux; aux2= y[i]; y[i]= y[j]; y[j]=aux2; } } int point(double *x,double *y,int i, int j,int n){ float a,b,c; int ii,flag=2; a= y[j] y[i]; b= x[i] x[j]; c= x[i]*y[j]y[i]*x[j]; for(ii=0; ii < n;ii++){ if((i!=ii)&&(j!=ii)){ if( a*x[ii]+b*y[ii]>c){ if(flag==1) return 0; flag=0; } else if( a*x[ii]+b*y[ii]<c){ if(flag==0) return 0; flag=1; } } } return 1; } void convexhull(double *x,double *y,int n,double miny,double maxy){ int i,flag=1,j,aux=0;; double *aristx; double *aristy; aristx=(double *)calloc(2,sizeof(double)); aristy=(double *)calloc(2,sizeof(double)); gnuplot_ctrl * h1; gnuplot_ctrl * h2; h1 = gnuplot_init() ; h2 = gnuplot_init() ; gnuplot_cmd(h1,"set xrange [%lf:%lf] ",x[0]5,x[n1]+5);
1/3
Figura 1. Convexhull, pgina 1. El programa genera un archivo con la a animacin del proceso al ejecutarlo: animacion.gif. o
Printed by morenostar jun 11, 11 20:38 convex.c gnuplot_cmd(h1,"set yrange [%lf:%lf] ",miny5,maxy+5); gnuplot_cmd(h2,"set xrange [%lf:%lf] ",x[0]5,x[n1]+5); gnuplot_cmd(h2,"set yrange [%lf:%lf] ",miny5,maxy+5); gnuplot_cmd(h2,"set terminal png"); gnuplot_cmd(h2,"set output %d.png",flag); gnuplot_plot_xy(h2, x, y, n, "puntos") ;
for(i=0 ; i < n1 ; i++) for(j=i+1 ; j < n ; j++){ aux=point(x,y,i,j,n); aristx[0]=x[i]; aristx[1]=x[j]; aristy[0]=y[i]; aristy[1]=y[j]; if (aux==1){ gnuplot_setstyle(h1, "points") ; gnuplot_resetplot(h1); gnuplot_plot_xy(h1, x, y, n, "puntos") ; gnuplot_setstyle(h1, "lines") ; gnuplot_plot_xy(h1, aristx, aristy, 2, "SI") ; usleep(1200000); //imagen png gnuplot_setstyle(h2, "points") ; gnuplot_resetplot(h2); gnuplot_cmd(h2,"set output %d.png",flag); gnuplot_plot_xy(h2, x, y, n, "puntos") ; gnuplot_setstyle(h2, "lines") ; gnuplot_cmd(h2,"set output %d.png",flag); gnuplot_plot_xy(h2, aristx, aristy, 2, "SI") ; flag++; } else { gnuplot_setstyle(h1, "points") ; gnuplot_resetplot(h1); gnuplot_plot_xy(h1, x, y, n, "puntos") ; gnuplot_setstyle(h1, "lines") ; gnuplot_plot_xy(h1, aristx, aristy, 2, "NO") ; usleep(400000); //imagen png gnuplot_setstyle(h2, "points") ; gnuplot_resetplot(h2); gnuplot_cmd(h2,"set output %d.png",flag); gnuplot_plot_xy(h2, x, y, n, "puntos") ; gnuplot_setstyle(h2, "lines") ; gnuplot_cmd(h2,"set output %d.png",flag); gnuplot_plot_xy(h2, aristx, aristy, 2, "NO") ; flag++; } } gnuplot_resetplot(h1); gnuplot_setstyle(h1, "points") ; gnuplot_plot_xy(h1, x, y, n, ""); usleep(1500000); gnuplot_resetplot(h2); gnuplot_setstyle(h2, "points") ; gnuplot_cmd(h2,"set output %d.png",flag); gnuplot_setstyle(h1, "points") ;
Page 2/3
2/3
convex.c
Page 3/3
for(i=0 ; i < n1 ; i++) for(j=i+1 ; j < n ; j++){ aux=point(x,y,i,j,n); if (aux==1){ aristx[0]=x[i]; aristx[1]=x[j]; aristy[0]=y[i]; aristy[1]=y[j]; gnuplot_setstyle(h1, "lines") ; gnuplot_plot_xy(h1, aristx, aristy, 2, "") ; //imagen png gnuplot_setstyle(h2, "lines") ; gnuplot_cmd(h2,"set output %d.png",flag); gnuplot_plot_xy(h2, aristx, aristy, 2, "") ; flag++; } } usleep(1500000); gnuplot_close(h1); gnuplot_close(h2); system("convert delay 100 *.png animacion.gif"); system("rm *.png"); free(aristx); free(aristy); } int main(){ int n,i; double *x,*y,miny,maxy; miny=0; maxy=0; scanf("%d",&n); x=(double *)calloc(n,sizeof(double)); y=(double *)calloc(n,sizeof(double)); for (i=0;i<n;i++){ scanf("%lf %lf",(double *)&x[i],(double *)&y[i]); if(miny > y[i]) miny=y[i]; if(maxy < y[i]) maxy=y[i]; } bubblesort(x,y,n); convexhull(x,y,n,miny,maxy); puts("SE HA GENERADO UN GIF ANIMADO DEL PROCESO"); free(x); free(y); return 0; }
3/3
Printed by morenostar jun 11, 11 21:30 #include <stdio.h> #include <stdlib.h> #include "gnuplot_i.h" void bubblesort(double *x,int n) { int aux,i, j; for (i = 0; i < n 1 ; i++) for (j = i + 1; j < n ; j++) if (x[i] > x[j]) { aux = x[i]; x[i] = x[j]; x[j] = aux; } }
void ordsel(double * x, int n) { int i,j,minimo; double aux; for(i=0 ; i<n1 ; i++) { minimo=i; for(j=i+1 ; j<n ; j++) if (x[minimo] > x[j]) minimo=j; aux=x[minimo]; x[minimo]=x[i]; x[i]=aux; } } void sort(double *x,double *x2, int n,double *pos,double maxy,double miny){ int i,j,minimo; double aux; gnuplot_ctrl *h1; gnuplot_ctrl *h2; h1=gnuplot_init() ; h2=gnuplot_init() ; gnuplot_cmd(h1,"set xrange [%lf:%lf] ",pos[0]5,pos[n1]+5); gnuplot_cmd(h1,"set yrange [%lf:%lf] ",miny5,maxy+10); gnuplot_cmd(h2,"set xrange [%lf:%lf] ",pos[0]5,pos[n1]+5); gnuplot_cmd(h2,"set yrange [%lf:%lf] ",miny5,maxy+5); gnuplot_plot_xy(h2, pos,x2 , n , "BUBBLESORT"); gnuplot_plot_xy(h1, pos,x , n , "SELECTIONSORT"); printf("MUEVA UNA DE LAS PANTALLAS A LA DERECHA\n"); sleep(4); for(i=0 ; i<n1 ; i++) { minimo=i; for(j=i+1 ; j<n ; j++) { //selection sort if (x[minimo] > x[j]) minimo=j; usleep(50000); //cambio bubblesort if (x2[i] > x2[j]) { aux = x2[i];
orden.c
Page 1/2
1/2
Figura 4: Ordenamiento, pgina 1. El programa ejecuta paralelamente los a algoritmos de ordenamiento, al mismo tiempo, en pantallas gnuplot diferente.
orden.c
x2[i] = x2[j]; x2[j] = aux; gnuplot_resetplot(h2); gnuplot_plot_xy(h2, pos,x2 , n , "BUBBLE SORT");
Page 2/2
gnuplot_resetplot(h1); gnuplot_plot_xy(h1, pos,x , n , "SELECTION SORT"); } sleep(3); gnuplot_close(h1) ; gnuplot_close(h2) ; } int main(){ int n,i; double *x,*x2,*pos,maxy,miny; scanf("%d",&n); x=(double *)calloc(n,sizeof(double)); x2=(double *)calloc(n,sizeof(double)); pos=(double *)calloc(n,sizeof(double)); maxy=0; miny=0; for (i=0;i<n;i++){ scanf("%lf ",(double *)&x[i]); x2[i]=x[i]; pos[i]=i+1; if(maxy < x[i]) maxy=x[i]; if(miny > x[i]) miny=x[i]; } sort(x,x2,n,pos,maxy,miny); free(x); free(x2); free(pos); }
2/2
3.2
Gnuplot:Visualizacin o
Para visualizar los procesos al utilizar los algoritmos se utilizaron la librer de N. a Devillard (http://ndevilla.free.fr/gnuplot) para llamar a el programa Gnuplot desde el lenguaje c. Gnuplot genera grcas a partir de datos o ecuaciones a (http://www.gnuplot.info).
3.3
Compilacin o
Para compilar la librer para usar gnuplot: a >> cc -I. -c gnuplot i.c Para compilar los archivos: >> cc orden.c -o orden gnuplot i.o Para ejecutar los programas: >> /. orden < prueba >> /. convex < prueba
3.4
Archivos de prueba
Convexhull: se crea un archivo de texto, al principio de ste se pone la cantidad e de puntos y a continuacin los puntos. o Ejemplo: 4 0 1 5 2 0 1 5 2
Ordenamiento:se crea un archivo de texto, al principio de ste se pone la cantie dad de valores y a continuacin cada uno de los valores. o Ejemplo: 4 3 25 -50 0
Resultados
Basta comprobar los programas con archivos de prueba. A continuacin unas o pantallas gnuplot con los archivos de prueba.
Conclusiones
Los algoritmos de fuerza bruta son la manera ms fcil de abordar los problemas a a pero dependiendo de su aplicacin pueden tener un costo mayor como en el caso de convexhull que tiene un orden de n3 .
Plataforma Computacional
Procesador: Intel(R) Core 2 Duo Processor T6600 2.20 GHz Memoria RAM: 3gb Sistema Operativo: Linux - Ubuntu 11.04
10