📄 fis.c
字号:
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 + -