⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 analyse.c

📁 c编写的glpk数学工具使用
💻 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 + -