Está en la página 1de 11

Departamento de Matemtica y Ciencia de la Computacin a o

Pep 2: Visualizacin de algoritmos de fuerza o bruta


Primer Semestre 2011

Complejidad de algoritmos Licenciatura en Ciencia de la Computacin o

Felipe Llancaleo Palomera felipe.llancaleo@usach.cl

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

Algoritmos de fuerza bruta


Ordenamiento: Bubblesort
Input : Lista de valores L, n (largo lista) Output: Lista L ordenada

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

Input : Lista de valores L, n (largo lista) Output: Lista L ordenada


1 2 3 4 5 6 7 8 9 10 11 12

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);

sbado junio 11, 2011

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

sbado junio 11, 2011

Figura 2. Convexhull, pgina 2. a

Printed by morenostar jun 11, 11 20:38 gnuplot_plot_xy(h1, x, y, n, "") ; gnuplot_plot_xy(h2, x, y, n, "") ;

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; }

sbado junio 11, 2011

3/3

Figura 3. Convexhull, pgina 3. a

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

sbado junio 11, 2011

1/2

Figura 4: Ordenamiento, pgina 1. El programa ejecuta paralelamente los a algoritmos de ordenamiento, al mismo tiempo, en pantallas gnuplot diferente.

Printed by morenostar jun 11, 11 21:30

orden.c
x2[i] = x2[j]; x2[j] = aux; gnuplot_resetplot(h2); gnuplot_plot_xy(h2, pos,x2 , n , "BUBBLE SORT");

Page 2/2

} // cambio selection sort aux=x[minimo]; x[minimo]=x[i]; x[i]=aux;

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

sbado junio 11, 2011

Figura 5. Ordenamiento, pgina 2. a

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.

Figura 6. Inicio del proceso convexhull.

Figura 7. Trmino del proceso convexhull. e

Figura 8. Proceso del ordenamiento.

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

El programa fue ejecutado en un computador con las siguientes caracter sticas:

10

También podría gustarte