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

📄 estadisticas.c

📁 用于逻辑电路设计的PSO算法代码,代码简单明了
💻 C
字号:
/********************************************************/
/*					CINVESTAV - IPN						*/
/*			Departamento de Ingener韆 El閏trica			*/
/*					Secci髇 Computaci髇					*/
/*														*/	
/*				   Computacion Evolutiva				*/
/*														*/
/*					Erika Hernandez Luna				*/
/*			 eluna@computacion.cs.cinvestav.mx			*/
/*					  2 / agosto / 2003					*/
/*														*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/* Archivo: estadisticas.c								*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/* Descripci髇: Biblioteca para generar las estadisticas*/
/* por generacion y por	corrida del particle swarm		*/
/* optimization. Las estadisticas incluyen a la mejor   */
/* y a la peor particula, la media de la aptitud, la 	*/
/* mejor y la peor aptitud, asi como la desviacion		*/
/* estandar, la	varianza y la cadena cromosomica de la	*/
/* mejor particula encontrada por generacion.			*/
/********************************************************/

#include "estadisticas.h"
#include "psomatrixcircuit.h"
#include "circuitos.h"
#include "matrixpso.h"
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

/*Inicializa la informacion de la estad韘tica de la corrida o de la generacion*/
void iniEstadistica(estadistica *est)
{
	est->cuadradosAptitud = 0;
	est->mediaAptitud  = 0;
}

/*Genera el encabezado de la estadistica global de todas las corridas*/
void estEncGlobal(char *nfile)
{
	FILE *pf = fopen(nfile,"w");

	fprintf(pf,"Centro de Investigaci髇 y de Estudios Avanzados del IPN\n");
	fprintf(pf,"Dise駉 de Circuitos L骻icos Combinatorios usando Optimizaci髇 mediante C鷐ulos de Part韈ulas\n");
	fprintf(pf,"Departamento de Ingenier韆 El閏trica - Secci髇 Computaci髇 \n");
	fprintf(pf,"Erika Hern醤dez Luna  eluna@computacion.cs.cinvestav.mx\n\n");
	fprintf(pf,"Estadisticas de los resultados obtenidos en todas las corridas del programa\n\n");

	fprintf(pf,"     Archivo Procesado:,   %s\n",nfEntrada);
	fprintf(pf,"   Tama駉 de Poblacion:,   %u\n",tPob);
	fprintf(pf,"Numero de Generaciones:,   %u\n",nGen);
	fprintf(pf,"                 Phi 1:, %.3f\n",phi1);
	fprintf(pf,"                 Phi 2:, %.3f\n",phi2);
	fprintf(pf,"                  Vmax:, %.3f\n",vMax);
	fprintf(pf,"Porcentaje de mutaci髇:, %.3f\n",pMut*100);
	fprintf(pf,"  N鷐ero de Compuertas:,   %u\n",numGates);
	fprintf(pf,"          Cardinalidad:,   %u\n",cardinalidad);
	fprintf(pf,"Renglones en la matriz:,   %u\n",numReng);
	fprintf(pf," Columnas en la matriz:,   %u\n",numCols);	
	fprintf(pf,"            Vecindario:,   %u\n",tVec);
	switch(representacion){
		case BINARIA:
			fprintf(pf,"        Representacion:, Binaria\n");
			break;
		case ENTERAA:
			fprintf(pf,"        Representacion:, Entera A\n");
			break;
		case ENTERAB:
			fprintf(pf,"        Representacion:, Entera B\n");
	}

	fprintf(pf,"\n");
	fprintf(pf,"Corrida,Media Aptitud,Generacion,");
	fprintf(pf,"Mejor Cromosoma,Aptitud,");
	fprintf(pf,"Peor Cromosoma,Aptitud,");
	fprintf(pf,"Desviacion Estandar,Varianza, Expresion\n");
	fclose(pf);
}

/*Genera la estadistica de cada corrida en el archivo global de corridas*/
void estCorr(char *nfile, unsigned corr)
{
	unsigned i;
	double varianza;
	char mejor[sizeCrom], peor[sizeCrom], expBooleana[sizeExpBooleana];
	FILE *pf = fopen(nfile,"a+");

	varianza = Corr.cuadradosAptitud - Corr.mediaAptitud*Corr.mediaAptitud;
	cadenaCrom(Corr.mejor, mejor);
	cadenaCrom(Corr.peor, peor);

	fprintf(pf,"%u,%.8f,%u,%s,%.8f,%s,%.8f,%.8f,%.12f",
		corr,
		Corr.mediaAptitud,
		Corr.generacion,
		mejor,
		Corr.mejor.aptitud,
		peor,
		Corr.peor.aptitud,
		sqrt(varianza),
		varianza);

	for(i=0; i<numSalidas; i++){
		expresion(Corr.mejor.cromX, expBooleana, i);
		fprintf(pf,",%s",expBooleana);
	}
	fprintf(pf,"\n");
	fclose(pf);

}

/*Genera el encabezado de la estadistica de la corrida*/
void estEncCorr(char *nfile,unsigned semilla)
{
	FILE *pf = fopen(nfile,"w");

	fprintf(pf,"Centro de Investigaci髇 y de Estudios Avanzados del IPN\n");
	fprintf(pf,"Dise駉 de Circuitos L骻icos Combinatorios usando Optimizaci髇 mediante C鷐ulos de Part韈ulas\n");
	fprintf(pf,"Departamento de Ingenier韆 El閏trica - Secci髇 Computaci髇 \n");
	fprintf(pf,"Erika Hern醤dez Luna  eluna@computacion.cs.cinvestav.mx\n\n");
	fprintf(pf,"Resultados obtenidos en una corrida del programa\n\n");
	
	fprintf(pf,"     Archivo Procesado:,   %s\n",nfEntrada);
	fprintf(pf,"   Tama駉 de Poblacion:,   %u\n",tPob);
	fprintf(pf,"Numero de Generaciones:,   %u\n",nGen);
	fprintf(pf,"                 Phi 1:, %.3f\n",phi1);
	fprintf(pf,"                 Phi 2:, %.3f\n",phi2);
	fprintf(pf,"                  Vmax:, %.3f\n",vMax);
	fprintf(pf,"Porcentaje de mutaci髇:, %.3f\n",pMut*100);
	fprintf(pf,"  N鷐ero de Compuertas:,   %u\n",numGates);
	fprintf(pf,"          Cardinalidad:,   %u\n",cardinalidad);
	fprintf(pf,"Renglones en la matriz:,   %u\n",numReng);
	fprintf(pf," Columnas en la matriz:,   %u\n",numCols);	
	fprintf(pf,"            Vecindario:,   %u\n",tVec);
	fprintf(pf,"               Semilla:,   %u\n",semilla);
	switch(representacion){
		case BINARIA:
			fprintf(pf,"        Representacion:, Binaria\n");
			break;
		case ENTERAA:
			fprintf(pf,"        Representacion:, Entera A\n");
			break;
		case ENTERAB:
			fprintf(pf,"        Representacion:, Entera B\n");
	}

	fprintf(pf,"\n");
	fprintf(pf,"Generacion,Media Aptitud,Mejor Aptitud,Peor Aptitud,");
	fprintf(pf,"Mejor Cromosoma");
	fprintf(pf,"\n");
	fclose(pf);
}

/*Genera la estadistica de una generaciones de la corrida*/
void estGen(char *nfile, unsigned gen)
{
	char mejor[sizeCrom];
	FILE *pf = fopen(nfile,"a+");

	cadenaCrom(Gen.mejor,mejor);
	fprintf(pf,"%u,%.8f,%.8f,%.8f,%s,",
		gen,
		Gen.mediaAptitud,
		Gen.mejor.aptitud,
		Gen.peor.aptitud,
		mejor);
	fprintf(pf,"\n");
	fclose(pf);
}

/*Genera los resultados finales de la estadistica de la corrida*/
void estPieCorr(char *nfile)
{
	unsigned i;
	char mejor[sizeCrom];
	cadBooleana expBooleana;
	FILE *pf = fopen(nfile,"a+");

	cadenaCrom(Corr.mejor, mejor);

	fprintf(pf,"\n");
	fprintf(pf,"Media Aptitud:, %.6f",Corr.mediaAptitud);
	fprintf(pf,"\n\n");
	
	fprintf(pf,"   Mejor Individuo\n\n");
	fprintf(pf,"              Aptitud:, %.8f\n",Corr.mejor.aptitud);
	fprintf(pf,"          Violaciones:,   %d\n",numTSalidas - Corr.mejor.numIgual);
	fprintf(pf,"           Compuertas:,   %d\n",Corr.mejor.numGates);
	fprintf(pf,"             Cromosma:,   %s\n",mejor);
	fprintf(pf,"   Expresion Booleana:\n");
	for(i=0; i<numSalidas; i++){
		expresion(Corr.mejor.cromX, expBooleana, i);
		fprintf(pf,"%s\n",expBooleana);
	}
	fclose(pf);
}



/*Convierte el cromosoma de n鷐eros reales o binario a una cadena de caracteres*/
void cadenaCrom(particula par, char *cadena)
{
	unsigned i;
	char numDouble[sizeNumDouble];

    strcpy(cadena,"'");
	for(i=0; i<nAlelo; i++){
		dtoa(par.cromX[i], 0 , numDouble);
		strcat(cadena,numDouble);
		if(representacion != BINARIA) strcat(cadena," ");
	}
}

/*Convierte un n鷐ero real en una cadena de caracteres*/
void dtoa(double num, unsigned prec, char *cadena)
{
	int dec,sign, i=0;
	double num1 = num;
	char *aux = fcvt(num,prec,&dec,&sign);

	sign = sign != 0 ? 1 : 0;
	if(sign == 1) strcpy(cadena,"-"); else strcpy(cadena,"");

	while(dec <= 0){
		cadena[i++] = '0';
		dec++;
	}
	for(; i<dec; i++)
		cadena[i] = *(aux++);
	if(prec > 0){
		cadena[i++] = '.';
		cadena[i] = EndString;
		strcat(cadena,aux);
		return;
	}
	
	cadena[i] = EndString;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -