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

📄 igka.c

📁 遗传算法
💻 C
📖 第 1 页 / 共 2 页
字号:
	for(d=0; d<D; d++)
	{
		S[m].SFDelta[k1][d] = S[m].SFDelta[k1][d] - X[n][d];
		S[m].SFDelta[k2][d] = S[m].SFDelta[k2][d] + X[n][d];
	}
}


void IncrementalUpdate(int m)
{

	int j, d, k, n, oldZ;
	double oldWCV, oldDist;

	S[m].TWCVDelta = 0;

	for (k=0; k<K; k++)
	{
		if (S[m].change[k] != 1 ) continue;

			oldZ = S[m].Z[k];
			S[m].Z[k] = S[m].Z[k] + S[m].ZDelta[k];

			for (d=0; d<D; d++)
			{
				S[m].SF[k][d] = S[m].SF[k][d] + S[m].SFDelta[k][d];
				S[m].SFDelta[k][d] = 0;
				if(S[m].Z[k] > 0 )
					S[m].C[k][d] = S[m].SF[k][d] / S[m].Z[k];
			}
			S[m].change[k] = 0;
			S[m].ZDelta[k] = 0;

			if(oldZ == 0 && S[m].Z[k] >0 )
				S[m].num ++;
			else
				if(oldZ>0 && S[m].Z[k]==0)
					S[m].num --;

			oldWCV = S[m].WCV[k];
			S[m].WCV[k] = 0;

			for(n=0; n<N; n++)
			{
				if(S[m].a[n] == k)
				{
					for(d=0; d<D; d++)
						S[m].WCV[k] = S[m].WCV[k] + (X[n][d] - S[m].C[k][d])*(X[n][d] - S[m].C[k][d]);
				}
			}
			S[m].TWCVDelta = S[m].TWCVDelta + S[m].WCV[k] - oldWCV;

			for(n=0; n<N; n++)
			{
				oldDist = S[m].d[n][k];
				S[m].d[n][k] = 0;
				for(d=0; d<D; d++)
					S[m].d[n][k] = S[m].d[n][k] + (X[n][d] - S[m].C[k][d])*(X[n][d] - S[m].C[k][d]);

				if (S[m].d[n][k]> S[m].dmax[n])
				{
					S[m].dmax[n] = S[m].d[n][k];
					S[m].kmax[n] = k;
				}
				if (S[m].d[n][k] < S[m].dmin[n])
				{
					S[m].dmin[n] = S[m].d[n][k];
					S[m].kmin[n] = k;
				}

				if(S[m].d[n][k] < oldDist && S[m].kmax[n] == k)
				{
					S[m].dmax[n] = 0;
					for(j=0; j<K; j++)
						if(S[m].dmax[n] < S[m].d[n][j])
						{
							S[m].dmax[n] = S[m].d[n][j];
							S[m].kmax[n] = j;
						}
				}

				if(S[m].d[n][k] > oldDist && S[m].kmin[n] == k)
				{
					S[m].dmin[n] = MAX_NUMBER;
					for(j=0; j<K; j++)
						if(S[m].dmin[n] > S[m].d[n][j])
						{
							S[m].dmin[n] = S[m].d[n][j];
							S[m].kmin[n] = j;
						}
				}

				S[m].dsum[n] = S[m].dsum[n] - oldDist + S[m].d[n][k];
			}
	}

	S[m].e = S[m].num/K;
	S[m].TWCV = S[m].TWCV + S[m].TWCVDelta;

	if(TWCVMax < S[m].TWCV)
		TWCVMax = S[m].TWCV;
}

/*
double Twcv(int *PN)
{
	double twcv;
	double center;
	int i,j,k;
	int ClusterName;

	for(i=0; i<K; i++) num[i]=0;

	for(i=0; i<K; i++) wcv[i]=0;

	for(i=0; i<K; i++)
		for(j=0; j<D;j++)
			Sum[i][j]=0;

	twcv = 0;

	for(i=0; i<N; i++)
	{
		ClusterName = PN[i];
		num[ClusterName] ++;
		for(j=0; j<D;j++)
		{
			wcv[ClusterName] += X[i][j] * X[i][j];
			Sum[ClusterName][j] += X[i][j];
		}
	}

	for(k=0; k<K; k++)
	{
		for(j=0; j<D;j++)
		{
			if (num[k] != 0)
				center =  Sum[k][j] / num[k];
			else
				center = 0;
			wcv[k] = wcv[k] + num[k]*center*center - 2*Sum[k][j]*center;
		}
		twcv += wcv[k];
	}
	return twcv;
}
*/

void Eval(int m)
{
	int d, n, k;

	for(k = 0; k < K; k++)
	{
		S[m].Z[k] = 0;
		S[m].WCV[k] = 0;
		for(d=0; d<D; d++)
		{
			S[m].SF[k][d] = 0;
		}
	}
	S[m].num = 0;

	for(n=0; n<N; n++)
	{
		k = S[m].a[n];
		S[m].Z[k] = S[m].Z[k] + 1;
		for(d=0; d<D; d++)
		{
			S[m].SF[k][d] += X[n][d];
		}
	}

	for(k = 0; k < K; k++)
	{
		if (S[m].Z[k] >0)
		{
			S[m].num ++;
			for(d=0; d<D; d++)
			{
				S[m].C[k][d] = S[m].SF[k][d] / S[m].Z[k];
			}
		}
	}

	for(n=0; n<N; n++)
	{
		k = S[m].a[n];
		for(d=0; d<D; d++)
			S[m].WCV[k] = S[m].WCV[k] + (X[n][d] - S[m].C[k][d]) * (X[n][d] - S[m].C[k][d]);
	}

	S[m].e = S[m].num/K;
	S[m].TWCV = 0;
	for(k=0; k<K; k++)
		S[m].TWCV = S[m].TWCV + S[m].WCV[k];

	if ( TWCVMax < S[m].TWCV )
		TWCVMax = S[m].TWCV;

	for( n=0; n<N; n++)
	{
		S[m].dmax[n] = 0;
		S[m].dmin[n] = MAX_NUMBER;
		S[m].dsum[n] = 0;

		for(k=0; k<K; k++)
		{
			S[m].d[n][k] = 0;
		}
	}

	for( n=0; n<N; n++)
	{
		for(k=0; k<K; k++)
		{
			for(d=0; d<D; d++)
			{
				S[m].d[n][k] = S[m].d[n][k] + (X[n][d] -S[m].C[k][d])* (X[n][d] -S[m].C[k][d]);
			}
			S[m].dsum[n] = S[m].dsum[n] + S[m].d[n][k];
			if(S[m].d[n][k] > S[m].dmax[n])
			{
				S[m].dmax[n] = S[m].d[n][k];
				S[m].kmax[n] = k;
			}

			if(S[m].d[n][k] < S[m].dmin[n])
			{
				S[m].dmin[n] = S[m].d[n][k];
				S[m].kmin[n] = k;
			}
		}
	}

}


char* getline(FILE* inputfile)
{
	int c;
  	char* newline;
  	int n = 0;
  	int size = 1023;
  	char* line = (char*)malloc((size_t)(size+1)*sizeof(char));
  	while ((c = getc(inputfile))!='\n' && c != EOF)
  	{
		if (c!='\r')
    	{
			if (n == size)
      		{
				size *= 2;
        		newline = (char*)malloc((size_t)(size+1)*sizeof(char));
        		strncpy (newline, line, n);
        		free (line);
        		line = newline;
      		}
      		line[n] = c;
      		n++;
    	}
  	}

  	if (n==0)
  	{
		free (line);
    	return 0;
  	}

  	line[n] = '\0';
  	newline = (char*)malloc((size_t)(n+1)*sizeof(char));
  	strcpy (newline, line);
  	free(line);
  	return newline;
}

int Export(const char *filename)
{
	FILE *outputfile, *inputfile;
  	int i,c,Columns,row;
  	char *line;
  	char *word;
	char *error;
	double number;

	inputfile = fopen(filename,"rt");
  	if (!inputfile){
      	printf("Error opening file");
      	return -1;
	}

	outputfile = fopen("result.out","w");
  	if (!outputfile){
      	printf("Error opening file");
      	return -1;
	}

  	fseek (inputfile, 0, SEEK_SET);

  	/* Count the number of columns in the first row */
  	Columns = 1; /* One more column than tabs */
  	while ((c = getc(inputfile)) && (c!='\n') && (c!='\r'))
	{
    	if (c == '\t') Columns++;
	}


  	while ((line = getline(inputfile)))
  	{
		if (strlen(line) > 1) /* Ignore completely empty lines */
			N ++;
    	free(line);
  	}


  	D = Columns; //used for fig2data.txt

  	if (D < 1)
  	{
      	printf("Error: less than six columns found in the file");
      	return -1;
  	}

  	fseek (inputfile, 0, SEEK_SET);
 	getline(inputfile);  /* Skip header line and empty lines*/
	row = 0;

  	while ((line=getline(inputfile)))
  	{
		if (strlen(line) > 1) /* Ignore completely empty lines */
    	{

			word = strtok(line,"\t");

			number = strtod(word, &error);
			fprintf(outputfile, "%d \t", SO.a[row]);

			for(i=0; i<D-1; i++)
			{
				word = strtok(NULL,"\t");
				if (!(*error)) fprintf(outputfile, "%s\t", word);
				else fprintf(outputfile, "%f\t", 0);
            }
      	}
		fprintf(outputfile, "\n");
    	free(line);
		row++;
  	}

	fclose(inputfile);
	fclose(outputfile);
  	return 0;

}

int LoadData (const char* filename)
{
	FILE* inputfile;
  	int i,c,Columns;
  	int row;
  	char *line;
  	char *word;
	char *error;
	double number;

	inputfile = fopen(filename,"rt");
  	if (!inputfile){
      	printf("Error opening file");
      	return -1;
	}

  	fseek (inputfile, 0, SEEK_SET);

  	/* Count the number of columns in the first row */
  	Columns = 1; /* One more column than tabs */
  	while ((c = getc(inputfile)) && (c!='\n') && (c!='\r'))
	{
    	if (c == '\t') Columns++;
	}


  	while ((line = getline(inputfile)))
  	{
		if (strlen(line) > 1) /* Ignore completely empty lines */
			N ++;
    	free(line);
  	}


//  	D = Columns - 4; //used for fig2data.txt
	D = Columns - 2; // used for chodata

  	if (D < 1)
  	{
      	printf("Error: less than six columns found in the file");
      	return -1;
  	}

  	/* Allocate space for data */
  	X = (double**)malloc((size_t)N*sizeof(double*));
  	for (row = 0; row < N; row++)
  	{
		X[row] =(double*)malloc((size_t)D*sizeof(double));
  	}
  	origin = (int*)malloc((size_t)N*sizeof(int));

  	row = 0;
  	fseek (inputfile, 0, SEEK_SET);
 	getline(inputfile);  /* Skip header line and empty lines*/

  	while ((line=getline(inputfile)))
  	{
		if (strlen(line) > 1) /* Ignore completely empty lines */
    	{

			//skip first 4 columns
			word = strtok(line,"\t");

			number = strtod(word, &error);
			origin[row] = number;
/*
			for(i=0; i<3; i++ )
				word = strtok( NULL, "\t");
*/
			for(i=0; i<D; i++)
			{
				word = strtok(NULL,"\t");
				number = strtod(word, &error);
				if (!(*error)) X[row][i] = number;
				else X[row][i]  = 0;
            }
        	row++;
      	}
    	free(line);
  	}

  	fclose(inputfile);
  	return 0;
}

⌨️ 快捷键说明

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