?? psomatrixcircuit.c
字號:
/********************************************************/
/* CINVESTAV - IPN */
/* Departamento de Ingener韆 El閏trica */
/* Secci髇 Computaci髇 */
/* */
/* Computacion Evolutiva */
/* */
/* Erika Hernandez Luna */
/* eluna@computacion.cs.cinvestav.mx */
/* 2 / agosto / 2003 */
/* */
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/* Archivo: psomatrixcircuit.c */
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/* Descripci髇: */
/********************************************************/
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "psomatrixcircuit.h"
#include "matrixpso.h"
#include "circuitos.h"
#include "estadisticas.h"
#include "random.h"
/*Se carga los parametros de entrada y se realizan las corridas*/
int main(int argc, char *argv[])
{
unsigned corr;
/*unsigned testFile, numTestFile = 3, iniFile, finFile, testRep;
char nameTestFile[12][sizeNameFile],nameFileAux[sizeNameFile];*/
/*strcpy(nameTestFile[0],"D:\\PSOMatrixCircuit2003A\\circuitosDTA\\circuit1Bin1S.dta");
strcpy(nameTestFile[1],"D:\\PSOMatrixCircuit2003A\\circuitosDTA\\circuit4VEGA1S.dta");
strcpy(nameTestFile[2],"D:\\PSOMatrixCircuit2003A\\circuitosDTA\\circuit8VEGA1S.dta");
strcpy(nameTestFile[3],"D:\\PSOMatrixCircuit2003A\\circuitosDTA\\circuitSasaoBin1S.dta");
strcpy(nameTestFile[4],"D:\\PSOMatrixCircuit2003A\\circuitosDTA\\circuitCatherineVEGA1S.dta");
strcpy(nameTestFile[5],"D:\\PSOMatrixCircuit2003A\\circuitosDTA\\circuitAdderBin3S.dta");
strcpy(nameTestFile[6],"D:\\PSOMatrixCircuit2003A\\circuitosDTA\\circuitFddiVEGA5S.dta");
strcpy(nameTestFile[7],"D:\\PSOMatrixCircuit2003A\\circuitosDTA\\circuitMultiplierBin4S.dta");*/
/*strcpy(nameTestFile[ 0],"ieee_adder_2ip");
strcpy(nameTestFile[ 1],"miller_2ip");
strcpy(nameTestFile[ 2],"rnd4-0");
strcpy(nameTestFile[ 3],"rnd4-1");
strcpy(nameTestFile[ 4],"rnd4-2");
strcpy(nameTestFile[ 5],"rnd4-3");
strcpy(nameTestFile[ 6],"rnd4-4");
strcpy(nameTestFile[ 7],"rnd4-5");
strcpy(nameTestFile[ 8],"rnd4-6");
strcpy(nameTestFile[ 9],"rnd4-7");
strcpy(nameTestFile[10],"rnd4-8");
strcpy(nameTestFile[11],"rnd4-9");
switch(atoi(argv[1])){
//Admin2003
case 1:
iniFile = 0;
finFile = 3;
break;
//PCSandra
case 2:
iniFile = 3;
finFile = 6;
break;
//PCGelus
case 3:
iniFile = 6;
finFile = 8;
break;
//PCIsra
case 4:
iniFile = 8;
finFile = 10;
break;
//PCJoan
case 5:
iniFile = 10;
finFile = 12;
}*/
/*strcpy(nameTestFile[ 0],"planar_11");
strcpy(nameTestFile[ 1],"rd53_2ip");
strcpy(nameTestFile[ 2],"roth_2ip");
iniFile = atoi(argv[1]);
finFile = iniFile + 1;*/
//for(testFile = iniFile; testFile < finFile/*numTestFile*/; testFile++){
/* for(testRep=0; testRep<3; testRep++){
strcpy(nameFileAux, nameTestFile[testFile]);
if(testRep==0) strcat(nameFileAux,"_B.dta");
else if(testRep==1) strcat(nameFileAux,"_EA.dta");
else strcat(nameFileAux,"_EB.dta");*/
//if(cargaParametros(nameFileAux)){
if(cargaParametros(argv[1])){
iniVariables(); /*Se inicializan las variables necesarias para el programa*/
reservaMemoria(); /*Se reserva la memoria necesaria para el programa*/
estEncGlobal(nfCorr); /*Se genera el encabezado de la estadistica global*/
for(corr=0; corr<nCorr; corr++){
printf("\n\nCorrida %02d Iniciada\n",corr);
iniEstadistica(&Corr); /*Inicializa las variables de la estad韘tica global*/
pSwarm(corr); /*Algoritmo de PSO para dise駉 de circuitos*/
estCorr(nfCorr,corr); /*Genera las estad韘ticas de la corrida*/
printf("\n\nCorrida %02d Terminada\n",corr);
}
liberaMemoria(); /*Se libera toda la memoria reservada*/
return 1;
}
//}
//}
return 0;
}
/*Almacenan en la memoria los datos obtenidos del archivo de entrada*/
unsigned cargaParametros(char *finput)
{
FILE *input = fopen(finput,"r");
if(!input){
printf("\nHa ocurrido un error al tratar de cargar el archivo de datos '%s'\n", finput);
return 0;
}
strcpy(nfEntrada,finput); /*Nombre del archivo de entrada*/
cargaTT(input); /*Coloca los datos de la tabla de verdad en variables*/
tPob = (unsigned)leeNumero(input); /*Tama駉 de la poblacion*/
nGen = (unsigned)leeNumero(input); /*Numero maximo de generaciones*/
nCorr = (unsigned)leeNumero(input); /*Numero maximo de corridas*/
tVec = (unsigned)leeNumero(input); /*Tama駉 del vecinario*/
phi1 = leeNumero(input); /*Constante de aceleracion 1, phi1*/
phi2 = leeNumero(input); /*Constante de aceleracion 2, phi2*/
vMax = leeNumero(input); /*Constante del sistema Vmax*/
pMut = leeNumero(input)/100; /*Porcentaje de mutaci髇*/
representacion = (unsigned)leeNumero(input); /*Representaci髇 Binaria=2, Entera A = 1, Entera B = 0*/
//representacion = 2;
numGates = (unsigned)leeNumero(input); /*Numero de compuertas disponibles en el programa*/
cardinalidad = (unsigned)leeNumero(input); /*Cardinalidad para los n鷐eros aleatorios de cada variables*/
numReng = (unsigned)leeNumero(input); /*Numero de renglones en la matriz del circuito*/
numCols = (unsigned)leeNumero(input); /*Numero de columnas en la matriz del circuito*/
leeCadena(input,nfGen); /*Estadisticas detalladas por Generaci髇*/
leeCadena(input,nfCorr); /*Estadisticas detalladas por Corrida*/
strcat(nfCorr,".csv");
fclose(input);
/*Imprime los datos referentes a la tabla de verdad*/
imprimeTT();
/*Imprime los datos recibidos*/
imprimeParametros();
return 1;
}
/*Imprime en pantalla los parametros de entrada al programa recibidos en el archivo*/
void imprimeParametros(void)
{
printf("\n Tama駉 de la poblacion: %d", tPob);
printf("\n Numero de generaciones: %d", nGen);
printf("\n Numero de corridas: %d", nCorr);
printf("\n Tama駉 del vecindario: %d", tVec);
printf("\n Parametro phi1 del PSO: %.2f", phi1);
printf("\n Parametro phi2 del PSO: %.2f", phi2);
printf("\n Parametro vmax del PSO: %.2f", vMax);
printf("\n Porcentaje de mutacion: %.2f", pMut*100);
printf("\n Representacion: %s", representacion == BINARIA ? "Binaria" : representacion == ENTERAA ? "Entera A" : "Entero B");
printf("\n Numero de compuertas disponibles: %d", numGates);
printf("\n Cardinalidad: %d", cardinalidad);
printf("\n Numero de Renglones de la matriz: %d", numReng);
printf("\n Numero de Columnas de la matriz: %d", numCols);
printf("\nArchivo de resultados por corrida: %sX.csv", nfGen);
printf("\n Archivo de resultados globales: %s\n\n", nfCorr);
}
/*Inicializa las variables necesarias para el programa*/
void iniVariables(void)
{
/*El tam del vecindario debe ser menor o igual al tam de la poblacion*/
if(tVec > tPob) tVec = tPob;
/*El tama駉 de la matriz que esta representando al circuito*/
tMat = numCols*numReng;
/*Inicializa el rangos de las variables del cromosoma de la particula*/
iniLimites();
}
/*Inicializa el rangos de las variables del cromosoma de la particula*/
void iniLimites(void)
{
unsigned i;
/*Hay tantas variables como elementos tenga la matriz de compuertas y cada una
de esas variables, tiene 3 variables a su vez, para codificar la entrada1 a la
compuerta, la entrada2 a la compuerta y por ultimo el tipo de compuerta.*/
nVar = numReng * numCols * 3;
lInf = memVarX;
lSup = memVarX;
/*Entrada1 + Entrada2 + Tipo*/
for (i=0; i<nVar; i++){
lInf[i]=0;
lSup[i] = (i+1)%3 ? numReng-1 : numGates-1;
}
/*Calcula el numero de bits que ocupa cada variable en la representacion binaria*/
if(representacion == BINARIA){
bitVariable = memVarX;
nAlelo = 0;
for(i=0; i<nVar; i++){
bitVariable[i] = (unsigned)ceil(log((fabs(lInf[i]) + fabs(lSup[i])) + 1) / log(2));
nAlelo += bitVariable[i];
}
}
else
nAlelo = nVar;
}
/*Reserva la memoria necesaria para las variables del programa*/
void reservaMemoria(void)
{
unsigned i;
poblacion = memPoblacion; /*Poblacion regular*/
bestSocialExp = memPoblacion; /*Mejores experiencias sociales*/
bestIndividualExp = memPoblacion; /*Mejores experiencias individuales*/
/*Reserva memoria para cada part韈ula de la poblacion*/
for(i=0; i<tPob; i++){
reservaMemoriaParticula(&poblacion[i],0);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -