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

📄 fis.c

📁 模糊控制 C语言实现
💻 C
📖 第 1 页 / 共 5 页
字号:
	for (i = 0; i < fis->out_n; i++)		PRINTF("%d ", fis->output[i]->mf_n);	PRINTF("\n");	PRINTF("rule_n = %d\n", fis->rule_n);	PRINTF("andMethod = %s\n", fis->andMethod);	PRINTF("orMethod = %s\n", fis->orMethod);	PRINTF("impMethod = %s\n", fis->impMethod);	PRINTF("aggMethod = %s\n", fis->aggMethod);	PRINTF("defuzzMethod = %s\n", fis->defuzzMethod);	/*	for (i = 0; i < fis->in_n; i++) {		printf("Input variable %d = %s\n", i+1, fis->input[i]->name);		for (j = 0; j < fis->input[i]->mf_n; j++)			printf("\t Label for MF %d = %s\n", j+1, fis->input[i]->mf[j]->label);	}	for (i = 0; i < fis->out_n; i++) {		printf("Output variable %d = %s\n", i+1, fis->output[i]->name);		for (j = 0; j < fis->output[i]->mf_n; j++)			printf("\t Label for MF %d = %s\n", j+1, fis->output[i]->mf[j]->label);	}	*/	for (i = 0; i < fis->in_n; i++)		PRINTF("Bounds for input variable %d: [%6.3f %6.3f]\n", i+1,			fis->input[i]->bound[0], fis->input[i]->bound[1]);	for (i = 0; i < fis->out_n; i++)		PRINTF("Bounds for output variable %d: [%6.3f %6.3f]\n", i+1,			fis->output[i]->bound[0], fis->output[i]->bound[1]);	for (i = 0; i < fis->in_n; i++) {		PRINTF("MF for input variable %d (%s):\n", i+1, fis->input[i]->name);		for (j = 0; j < fis->input[i]->mf_n; j++)			PRINTF("\t Type for MF %d = %s\n", j+1, fis->input[i]->mf[j]->type);	}	for (i = 0; i < fis->out_n; i++) {		PRINTF("MF for output variable %d (%s):\n", i+1, fis->output[i]->name);		for (j = 0; j < fis->output[i]->mf_n; j++)			PRINTF("\t Type for MF %d = %s\n", j+1, fis->output[i]->mf[j]->type);	}	PRINTF("Rule list:\n");	for (i = 0; i < fis->rule_n; i++) {		for (j = 0; j < fis->in_n + fis->out_n; j++)			PRINTF("%d ", fis->rule_list[i][j]);		PRINTF("\n");	}	PRINTF("Rule weights:\n");	for (i = 0; i < fis->rule_n; i++)		PRINTF("%f\n", fis->rule_weight[i]);	PRINTF("AND-OR indicator:\n");	for (i = 0; i < fis->rule_n; i++)		PRINTF("%d\n", fis->and_or[i]);	for (i = 0; i < fis->in_n; i++) {		PRINTF("MF parameters for input variable %d (%s):\n",			i+1, fis->input[i]->name);		for (j = 0; j < fis->input[i]->mf_n; j++) {			PRINTF("\tParameters for MF %d (%s) (%s): ",				j+1, fis->input[i]->mf[j]->label,				fis->input[i]->mf[j]->type);			for (k = 0; k < fis->input[i]->mf[j]->nparams; k++)				PRINTF("%6.3f ", fis->input[i]->mf[j]->params[k]);			PRINTF("\n");		}	}	for (i = 0; i < fis->out_n; i++) {		PRINTF("MF parameters for output variable %d (%s):\n",				i+1, fis->output[i]->name);			for (j = 0; j < fis->output[i]->mf_n; j++) {				PRINTF("\tParameters for MF %d (%s) (%s): ",					j+1, fis->output[i]->mf[j]->label,					fis->output[i]->mf[j]->type);				for (k = 0; k < fis->output[i]->mf[j]->nparams; k++)					PRINTF("%6.3f ", fis->output[i]->mf[j]->params[k]);				PRINTF("\n");			}	}}#endifstatic void fisFreeMfList(MF *mf_list, int n){	int i;	for (i = 0; i < n; i++) {		FREE(mf_list[i].params);		FREE(mf_list[i].value_array);	}	FREE(mf_list);}static void fisFreeIoList(IO *io_list, int n){	int i;	for (i = 0; i < n; i++) {		if (io_list[i].mf_n > 0)	/* check if no MF at all */			fisFreeMfList(io_list[i].mf[0], io_list[i].mf_n);		FREE(io_list[i].mf);	}	FREE(io_list);}void fisFreeFisNode(FIS *fis){	if (fis == NULL)		return;	fisFreeIoList(fis->input[0], fis->in_n);	FREE(fis->input);	fisFreeIoList(fis->output[0], fis->out_n);	FREE(fis->output);#ifdef FREEMAT	FREEMAT((void **)fis->rule_list, fis->rule_n);#else	fisFreeMatrix((void **)fis->rule_list, fis->rule_n);#endif	FREE(fis->rule_weight);	FREE(fis->and_or);	FREE(fis->firing_strength);	FREE(fis->rule_output);	FREE(fis->BigOutMfMatrix);	FREE(fis->BigWeightMatrix);	FREE(fis->mfs_of_rule);	FREE(fis);}/* Compute arrays of MF values (for Mamdani model only) *//* This is done whenever new parameters are loaded */void fisComputeOutputMfValueArray(FIS *fis, int numofpoints){	int i, j, k;	DOUBLE x, lx, ux, dx;	MF *mf_node;	for (i = 0; i < fis->out_n; i++) {		lx = fis->output[i]->bound[0];		ux = fis->output[i]->bound[1];		dx = (ux - lx)/(numofpoints - 1);		for (j = 0; j < fis->output[i]->mf_n; j++) {			mf_node = fis->output[i]->mf[j];			if (!mf_node->userDefined)				for (k = 0; k < numofpoints; k++) {					x = lx + k*dx;					mf_node->value_array[k] =					(*mf_node->mfFcn)(x, mf_node->params);				}			else { 	/* user defined MF */#ifdef MATLAB_MEX_FILE				/* this is vector version */				{					DOUBLE *X;					X = (DOUBLE *)fisCalloc(numofpoints, sizeof(DOUBLE));					/*	double X[numofpoints]; */					for (k = 0; k < numofpoints; k++)						X[k] = lx + k*dx;					fisCallMatlabMf2(X, mf_node->nparams, mf_node->params, 						mf_node->type, numofpoints, mf_node->value_array);					FREE(X);				}#else				PRINTF("Cannot find MF type %s!\n", mf_node->type);				fisError("Exiting ...");#endif			}		}	}}/* Copyright 1994-2002 The MathWorks, Inc.  *//* $Revision: $  $Date: $  *//* copy string (the first 'length' characters) from array to target string */static void fisGetString2(char *target, DOUBLE *array, int max_leng){	int i;	int actual_leng;	/* Find the actual length of the string */	/* If the string is not ended with 0, take max_leng */	for (actual_leng = 0; actual_leng < max_leng; actual_leng++)		if (array[actual_leng] == 0)			break;	if (actual_leng + 1 > STR_LEN) {		PRINTF("actual_leng = %d\n", actual_leng);		PRINTF("STR_LEN = %d\n", STR_LEN);		fisError("String too long!");	}	for (i = 0; i < actual_leng; i++)		target[i] = (char)array[i];	target[actual_leng] = 0;}/* Check if there are abnormal situations is the FIS data structure *//* Things being checked:	1. MF indices out of bound.	2. Rules with no premise part.	3. Sugeno system with negated consequent.	4. Sugeno system with zero consequent.*/void fisCheckDataStructure(FIS *fis){	int i, j, mf_index;	int found;	/* check if MF indices are out of bound */	for (i = 0; i < fis->rule_n; i++) {		for (j = 0; j < fis->in_n; j++) {			mf_index = fis->rule_list[i][j];			if (ABS(mf_index) > fis->input[j]->mf_n) {				PRINTF("MF index for input %d in rule %d is out of bound.\n", 					j+1, i+1);				fisFreeFisNode(fis);				fisError("Exiting ...");			}		}		for (j = 0; j < fis->out_n; j++) {			mf_index = fis->rule_list[i][fis->in_n+j];			if (ABS(mf_index) > fis->output[j]->mf_n) {				PRINTF("MF index for output %d in rule %d is out of bound.\n", 					j+1, i+1);				fisFreeFisNode(fis);				fisError("Exiting ...");			}		}	}	/* check if there is a rule whose premise MF indice are all zeros */ 	for (i = 0; i < fis->rule_n; i++) {		found = 1;		for (j = 0; j < fis->in_n; j++) {			mf_index = fis->rule_list[i][j];			if (mf_index != 0) {				found = 0;				break;			}		}		if (found == 1) {			PRINTF("Rule %d has no premise part.\n", i+1);			fisFreeFisNode(fis);			fisError("Exiting ...");		}	}	/* check if it's sugeno system with "NOT" consequent */	if (strcmp(fis->type, "sugeno") == 0)	for (i = 0; i < fis->rule_n; i++)		for (j = 0; j < fis->out_n; j++) {			mf_index = fis->rule_list[i][fis->in_n+j];			if (mf_index < 0) {				PRINTF("Rule %d has a 'NOT' consequent.\n", i+1);				PRINTF("Sugeno fuzzy inference system does not allow this.\n");				fisError("Exiting ...");			}		}	/* check if it's sugeno system with zero consequent */	if (strcmp(fis->type, "sugeno") == 0)	for (i = 0; i < fis->rule_n; i++)		for (j = 0; j < fis->out_n; j++) {			mf_index = fis->rule_list[i][fis->in_n+j];			if (mf_index == 0) {				PRINTF("Warning: Output %d in rule %d has a zero MF index.\n", j+1, i+1);				PRINTF("This output in the rule is assumed zero in subsequent calculation.\n\n");			}		}}/* Build FIS node and load parameter from fismatrix directly *//* col_n is the number of columns of the fismatrix */static void fisBuildFisNode(FIS *fis, DOUBLE **fismatrix, int col_n, int numofpoints){	int i, j, k;	int *in_mf_n, *out_mf_n;	IO *io_list;	int start;	fisGetString2(fis->name, fismatrix[0], col_n);	fisGetString2(fis->type, fismatrix[1], col_n);	fis->in_n  = (int) fismatrix[2][0];	fis->out_n = (int) fismatrix[2][1];	/* create input node list */	in_mf_n = (int *)fisCalloc(fis->in_n, sizeof(int));	for (i = 0; i < fis->in_n; i++)		in_mf_n[i] = (int) fismatrix[3][i];	io_list = fisBuildIoList(fis->in_n, in_mf_n);	FREE(in_mf_n);	fis->input = (IO **)fisCalloc(fis->in_n, sizeof(IO *));	for (i = 0; i < fis->in_n; i++)		fis->input[i] = io_list+i;	/* create output node list */	out_mf_n = (int *)fisCalloc(fis->out_n, sizeof(int));	for (i = 0; i < fis->out_n; i++)		out_mf_n[i] = (int) fismatrix[4][i];	io_list = fisBuildIoList(fis->out_n, out_mf_n);	FREE(out_mf_n);	fis->output = (IO **)fisCalloc(fis->out_n, sizeof(IO *));	for (i = 0; i < fis->out_n; i++)		fis->output[i] = io_list+i;	fis->rule_n = (int) fismatrix[5][0];	fisGetString2(fis->andMethod, fismatrix[6], col_n);	fisGetString2(fis->orMethod, fismatrix[7], col_n);	fisGetString2(fis->impMethod, fismatrix[8], col_n);	fisGetString2(fis->aggMethod, fismatrix[9], col_n);	fisGetString2(fis->defuzzMethod, fismatrix[10], col_n);	start = 11;	/* For efficiency, I/O names and MF labels are not stored */	for (i = 0; i < fis->in_n; i++) {		fis->input[i]->name[0] = '\0';		for (j = 0; j < fis->input[i]->mf_n; j++)			fis->input[i]->mf[j]->label[0] = '\0';	}	for (i = 0; i < fis->out_n; i++) {		fis->output[i]->name[0] = '\0';		for (j = 0; j < fis->output[i]->mf_n; j++)			fis->output[i]->mf[j]->label[0] = '\0';	}	start = start + fis->in_n + fis->out_n;	for (i = start; i < start + fis->in_n; i++) {		fis->input[i-start]->bound[0] = fismatrix[i][0];		fis->input[i-start]->bound[1] = fismatrix[i][1];	}	start = start + fis->in_n;	for (i = start; i < start + fis->out_n; i++) {		fis->output[i-start]->bound[0] = fismatrix[i][0];		fis->output[i-start]->bound[1] = fismatrix[i][1];	}	/* update "start" to skip reading of MF labels */	for (i = 0; i < fis->in_n; start += fis->input[i]->mf_n, i++);	for (i = 0; i < fis->out_n; start += fis->output[i]->mf_n, i++);	start = start + fis->out_n;	for (i = 0; i < fis->in_n; i++)		for (j = 0; j < fis->input[i]->mf_n; j++) {			fisGetString2(fis->input[i]->mf[j]->type, fismatrix[start], col_n);			start++;		}	for (i = 0; i < fis->out_n; i++)		for (j = 0; j < fis->output[i]->mf_n; j++) {			fisGetString2(fis->output[i]->mf[j]->type, fismatrix[start], col_n);			start++;		}	fisAssignMfPointer(fis);	fisAssignFunctionPointer(fis);	/* get input MF parameters */	for (i = 0; i < fis->in_n; i++) {		for (j = 0; j < fis->input[i]->mf_n; j++) {			fis->input[i]->mf[j]->nparams = MF_PARA_N;			fis->input[i]->mf[j]->params = (DOUBLE *)fisCalloc(MF_PARA_N,sizeof(DOUBLE));			for (k = 0; k < MF_PARA_N; k++)				fis->input[i]->mf[j]->params[k] = fismatrix[start][k];			start++;		}	}	/* get Mamdani output MF parameters and compute MF value array */	if (strcmp(fis->type, "mamdani") == 0) {		for (i = 0; i < fis->out_n; i++)			for (j = 0; j < fis->output[i]->mf_n; j++) {				fis->output[i]->mf[j]->value_array =					(DOUBLE *)fisCalloc(numofpoints, sizeof(DOUBLE));				fis->output[i]->mf[j]->nparams = MF_PARA_N;				fis->output[i]->mf[j]->params = 					(DOUBLE *)fisCalloc(MF_PARA_N,sizeof(DOUBLE));				for (k = 0; k < MF_PARA_N; k++)					fis->output[i]->mf[j]->params[k] = fismatrix[start][k];				start++;			}		fisComputeOutputMfValueArray(fis, numofpoints);	/* get Sugeno output equation parameters */	} else if (strcmp(fis->type, "sugeno") == 0) {		for (i = 0; i < fis->out_n; i++)			for (j = 0; j < fis->output[i]->mf_n; j++) {				fis->output[i]->mf[j]->nparams = fis->in_n+1;				fis->output[i]->mf[j]->params =					(DOUBLE *)fisCalloc(fis->in_n+1, sizeof(DOUBLE));				for (k = 0; k < fis->in_n+1; k++)					fis->output[i]->mf[j]->params[k] = fismatrix[start][k];				start++;			}	} else {		PRINTF("fis->type = %s\n", fis->type);		fisError("Unknown fis type!");	}	fis->rule_list = (int **)fisCreateMatrix		(fis->rule_n, fis->in_n + fis->out_n, sizeof(int));	fis->rule_weight = (DOUBLE *)fisCalloc(fis->rule_n, sizeof(DOUBLE));	fis->and_or = (int *)fisCalloc(fis->rule_n, sizeof(int));	for (i = 0; i < fis->rule_n; i++) {		for (j = 0; j < fis->in_n + fis->out_n; j++)			fis->rule_list[i][j] = (int)fismatrix[start][j];		fis->rule_weight[i] = fismatrix[start][fis->in_n+fis->out_n];		fis->and_or[i] = (int)fismatrix[start][fis->in_n+fis->out_n+1];		start++;	}	fis->firing_strength = (DOUBLE *)fisCalloc(fis->rule_n, sizeof(DOUBLE));	fis->rule_output = (DOUBLE *)fisCalloc(fis->rule_n, sizeof(DOUBLE));	if (strcmp(fis->type, "mamdani") == 0) {		fis->BigOutMfMatrix = (DOUBLE *)			fisCalloc(fis->rule_n*numofpoints, sizeof(DOUBLE));		fis->BigWeightMatrix = (DOUBLE *)			fisCalloc(fis->rule_n*numofpoints, sizeof(DOUBLE));	}	fis->mfs_of_rule = (DOUBLE *)fisCalloc(fis->in_n, sizeof(DOUBLE));	fisCheckDataStructure(fis);}/* load parameters and rule list from given fismatrix */static void fisLoadParameter(FIS *fis, DOUBLE **fismatrix, int numofpoints){	int start;	int i, j, k;	start = 11 + 2*(fis->in_n + fis->out_n);	for (i = 0; i < fis->in_n; start += fis->input[i]->mf_n, i++);	for (i = 0; i < fis->out_n; start += fis->output[i]->mf_n, i++);	for (i = 0; i < fis->in_n; start += fis->input[i]->mf_n, i++);	for (i = 0; i < fis->out_n; start += fis->output[i]->mf_n, i++);	/* get input MF parameters */	for (i = 0; i < fis->in_n; i++) {		for (j = 0; j < fis->input[i]->mf_n; j++) {			fis->input[i]->mf[j]->nparams = MF_PARA_N;			fis->input[i]->mf[j]->params = (DOUBLE *)fisCalloc(MF_PARA_N,sizeof(DOUBLE));			for (k = 0; k < MF_PARA_N; k++)				fis->input[i]->mf[j]->params[k] = fismatrix[start][k];			start++;		}	}	/* get Mamdani output MF parameters */	if (strcmp(fis->type, "mamdani") == 0) {		for (i = 0; i < fis->out_n; i++)			for (j = 0; j < fis->output[i]->mf_n; j++) {				fis->output[i]->mf[j]->nparams = MF_PARA_N;				fis->output[i]->mf[j]->params = 					(DOUBLE *)fisCalloc(MF_PARA_N,sizeof(DOUBLE));				for (k = 0; k < MF_PARA_N; k++)					fis->output[i]->mf[j]->params[k] =						fismatrix[start][k];				start++;			}		fisComputeOutputMfValueArray(fis, numofpoints);	/* get Sugeno output equation parameters */	} else if (strcmp(fis->type, "sugeno") == 0) {		for (i = 0; i < fis->out_n; i++)			for (j = 0; j < fis->output[i]->mf_n; j++) {				fis->output[i]->mf[j]->nparams = fis->in_n+1;				fis->output[i]->mf[j]->params =					(DOUBLE *)fisCalloc(fis->in_n+1, sizeof(DOUBLE));				for (k = 0; k < fis->in_n+1; k++)					fis->output[i]->mf[j]->params[k] =						fismatrix[start][k];				start++;			}	} else {		PRINTF("fis->type = %s\n", fis->type);

⌨️ 快捷键说明

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