?? analyse.c
字號:
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <wait.h>#define sqr(x) ((x) * (x))//#define DEBUG 1typedef struct st_point{ int iDim; int iCl; int * coord;} point;int AnalyseEntree( const char * filename, int nbPointsTest ){ FILE * fd; int c; int i, j, k; point ** tabPoint; int nbPoints; point * ptrPoint; char buff[255]; double ** tabDist; double dist; tabPoint = NULL; ptrPoint = NULL; tabDist = NULL; // phase de lecture du fichier fd = fopen( filename, "r" ); i = 0; nbPoints = 0; while ( (c = fgetc( fd )) != EOF ) { if ( i == 0 ) { nbPoints++; tabPoint = (point **) realloc( tabPoint, sizeof(point *) * nbPoints ); ptrPoint = (point *) malloc( sizeof(point) ); tabPoint[nbPoints-1] = ptrPoint; ptrPoint->iDim = 0; ptrPoint->coord = NULL; while ( (c = getc( fd )) != ',' ); } else if ( i > 0 ) { if ( i == 1 ) { if ( c == 'N' || c == 'M' ) ptrPoint->iCl = -1; else ptrPoint->iCl = 1; c = getc( fd ); } else { ptrPoint->iDim += 1; ptrPoint->coord = (int *) realloc( ptrPoint->coord, sizeof(int) * ptrPoint->iDim ); j = 0; while ( (c = getc( fd )) != ',' && c != '\n') { buff[j] = c; j++; } buff[j] = '\0'; ptrPoint->coord[ptrPoint->iDim-1] = atoi( buff ); } } if ( c == ',' ) i++; if ( c == '\n' ) i = 0; } fclose( fd ); // fin de lecture du fichier // on alloue le tableau de distance dist tabDist = (double **) malloc( sizeof(double *) * nbPoints ); for (i = 0; i < nbPoints; i++) tabDist[i] = (double *) malloc( sizeof(double) * nbPoints ); // on met la diagonale à 0 for (i = 0; i < nbPoints; i++) tabDist[i][i] = 0; // on boucle sur tous les points for (i = 0; i < nbPoints; i++) { // on boucle sur tous les points après le point i for (j = i+1; j < nbPoints; j++) { dist = 0; // on boucle sur toutes les coordonnées for ( k = 0; k < tabPoint[i]->iDim; k++ ) dist += sqr( tabPoint[i]->coord[k] - tabPoint[j]->coord[k] ); //dist = 1 / dist; dist = exp( -0.5f * dist / 1000000000) ; tabDist[i][j] = dist ; tabDist[j][i] = tabDist[i][j]; } } // phase d'écriture du .dat fd = fopen ( "./donnees.dat", "w" ); // on écrit le nombre de points fprintf( fd, "param N := %d;\nparam N1 := %d;\n\n", nbPoints, nbPointsTest ); // ensuite on écrit les classes fprintf( fd, "param Cl :=" ); for (i = 0; i < nbPoints; i++) { // on écrit son numéro fprintf( fd, "\n\t%d\t", i+1 ); // on écrit sa classe fprintf( fd, "%d", tabPoint[i]->iCl ); } fprintf( fd, ";\n\n" ); // on écrit enfin la matrice des distances fprintf( fd, "param k :" ); for (i = 0; i < nbPoints; i++) // on écrit son numéro fprintf( fd, "\t%d", i+1 ); fprintf( fd, "\t:=" ); for (i = 0; i < nbPoints; i++) { // on écrit son numéro fprintf( fd, "\n\t%d", i+1 ); // ensuite on écrit les distances for( j = 0; j < nbPoints; j++ ) fprintf( fd, "\t%f", tabDist[i][j] ); } fprintf( fd, ";\nend;\n" ); fclose ( fd ); // fin d'écriture du .dat return 0;}int AnalyseSortie( ){ FILE * fd; int etat = 0; char c; int nb = 0; int nbPositifs = 0; int bVal; fd = fopen( "./sortie.txt", "r" ); while( (c = fgetc( fd )) != EOF ) { switch ( c ) { case 'c': if ( etat == 0 ) etat = 1; else etat = 0; break; case '[': if ( etat == 1 ) { nb++; while ( (c = fgetc( fd )) != ']' ); // on récupère la valeur bVal = 0; while( bVal == 0 ) { c = fgetc( fd ); if( c >= '1' && c <= '9' ) { nbPositifs++; bVal = 1; } else if ( c == '-' ) { bVal = 1; } } } // une fois qu'on a récupéré la valeur ou si ce n'est pas un "c[" on retourne à l'état 0 etat = 0; break; } } nb--; printf( "\nNombre de > 0 : %d\n", nbPositifs ); printf( "Nombre total : %d\n", nb ); printf( "Pourcentage de bien classé : %f\n\n", ((float) nbPositifs / (float) nb) * 100 ); return 0;}int main( int argc, char ** argv ){ int val_fork; int nbPointsTest;#ifndef DEBUG if( argc != 3 ) { printf( "Utiliser de cette fa?on : ./analyse fichierdata nbPointsBase\n\n" ); return 1; }#endif nbPointsTest = atoi( argv[2] ); printf( "Analyse du fichier %s\n", argv[1] );#ifndef DEBUG AnalyseEntree( argv[1], nbPointsTest );#else AnalyseEntree( "../wdbc.data", 30 );#endif printf( "Analyse terminée.\n" ); if( (val_fork = fork()) == 0 ) { printf( "Exécution de GLPK\n" ); // on exécute glpk avec le .dat execlp( "glpsol", "glpsol", "--math","-m","modele.mod","-d","donnees.dat","-o","sortie.txt","--nopresol", (char *) NULL ); } else { wait( 0 ); // on attends la fin du fils printf( "Début d'analyse du fichier sortie.txt...\n" ); AnalyseSortie( ); // on analyse la sortie du fils (le fichier sortie.txt) } return 0;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -