?? fis.c
字號:
int i, j, k;
if (fis == NULL)
fisError("Given fis pointer is NULL, no data to print!");
PRINTF("fis_name = %s\n", fis->name);
PRINTF("fis_type = %s\n", fis->type);
PRINTF("in_n = %d\n", fis->in_n);
PRINTF("out_n = %d\n", fis->out_n);
PRINTF("in_mf_n: ");
for (i = 0; i < fis->in_n; i++)
PRINTF("%d ", fis->input[i]->mf_n);
PRINTF("\n");
PRINTF("out_mf_n: ");
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");
}
}
}
#endif
static 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++;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -