00001 #include "fuzzyobj.h"
00002 #include <stdio.h>
00003
00004 #include <stdlib.h>
00005
00006 cFuzzyObj::cFuzzyObj()
00007 {
00008 input=NULL,output=NULL,rule=NULL;
00009 inputs=outputs=rules=0;
00010 }
00011 cFuzzyObj::~cFuzzyObj()
00012 {
00013 int i;
00014
00015 for(i=0;i<inputs;i++) delete(input[i]);
00016 for(i=0;i<outputs;i++) delete(output[i]);
00017 for(i=0;i<rules;i++) delete(rule[i]);
00018 if(input!=NULL) free(input);
00019 if(output!=NULL) free(output);
00020 if(rule!=NULL) free(rule);
00021 }
00022 void cFuzzyObj::SetSamples(int samples1)
00023 {
00024 samples=samples1;
00025 }
00026 void cFuzzyObj::AddInput(float min1,float max1)
00027 {
00028 inputs++;
00029 input=(fuzzygroup **)realloc(input,inputs*sizeof(fuzzygroup *));
00030 input[inputs-1]=new fuzzygroup(min1,max1,samples);
00031 }
00032 void cFuzzyObj::AddOutput(float min1,float max1)
00033 {
00034 outputs++;
00035 output=(fuzzygroup **)realloc(output,outputs*sizeof(fuzzygroup *));
00036 output[outputs-1]=new fuzzygroup(min1,max1,samples);
00037 }
00038 void cFuzzyObj::AddInputMF(int inputgroup1,...)
00039 {
00040 va_list list;
00041 double arg1,arg2,arg3,arg4;
00042 int typ;
00043
00044 va_start(list,inputgroup1);
00045 typ=va_arg(list,int);
00046
00047 input[inputgroup1]->addfuzzy();
00048
00049 if(typ==FZ_TRIANGLE)
00050 {
00051 arg1=va_arg(list,double);
00052 arg2=va_arg(list,double);
00053 arg3=va_arg(list,double);
00054 input[inputgroup1]->mf[input[inputgroup1]->mfs-1]->settriangle(arg1,arg2,arg3);
00055 }
00056 if(typ==FZ_TRAPEZOID)
00057 {
00058 arg1=va_arg(list,double);
00059 arg2=va_arg(list,double);
00060 arg3=va_arg(list,double);
00061 arg4=va_arg(list,double);
00062 input[inputgroup1]->mf[input[inputgroup1]->mfs-1]->settrapezoid(arg1,arg2,arg3,arg4);
00063 }
00064 if(typ==FZ_LEFT)
00065 {
00066 arg1=va_arg(list,double);
00067 arg2=va_arg(list,double);
00068 input[inputgroup1]->mf[input[inputgroup1]->mfs-1]->setleft(arg1,arg2);
00069 }
00070 if(typ==FZ_RIGHT)
00071 {
00072 arg1=va_arg(list,double);
00073 arg2=va_arg(list,double);
00074 input[inputgroup1]->mf[input[inputgroup1]->mfs-1]->setright(arg1,arg2);
00075 }
00076 if(typ==FZ_CONST)
00077 {
00078 arg1=va_arg(list,double);
00079 input[inputgroup1]->mf[input[inputgroup1]->mfs-1]->setconst(arg1);
00080 }
00081
00082 if(typ==FZ_WELL) {
00083 arg1=va_arg(list,double);
00084 arg2=va_arg(list,double);
00085 arg3=va_arg(list,double);
00086 arg4=va_arg(list,double);
00087 input[inputgroup1]->mf[input[inputgroup1]->mfs-1]->setwell(arg1,arg2,arg3,arg4);
00088 }
00089 }
00090 void cFuzzyObj::AddOutputMF(int outputgroup1,...)
00091 {
00092 va_list list;
00093 double arg1,arg2,arg3,arg4;
00094 int typ;
00095
00096 va_start(list,outputgroup1);
00097 typ=va_arg(list,int);
00098
00099 output[outputgroup1]->addfuzzy();
00100 if(typ==FZ_TRIANGLE)
00101 {
00102 arg1=va_arg(list,double);
00103 arg2=va_arg(list,double);
00104 arg3=va_arg(list,double);
00105 output[outputgroup1]->mf[output[outputgroup1]->mfs-1]->settriangle(arg1,arg2,arg3);
00106 }
00107 if(typ==FZ_TRAPEZOID)
00108 {
00109 arg1=va_arg(list,double);
00110 arg2=va_arg(list,double);
00111 arg3=va_arg(list,double);
00112 arg4=va_arg(list,double);
00113 output[outputgroup1]->mf[output[outputgroup1]->mfs-1]->settrapezoid(arg1,arg2,arg3,arg4);
00114 }
00115 if(typ==FZ_LEFT)
00116 {
00117 arg1=va_arg(list,double);
00118 arg2=va_arg(list,double);
00119 output[outputgroup1]->mf[output[outputgroup1]->mfs-1]->setleft(arg1,arg2);
00120 }
00121 if(typ==FZ_RIGHT)
00122 {
00123 arg1=va_arg(list,double);
00124 arg2=va_arg(list,double);
00125 output[outputgroup1]->mf[output[outputgroup1]->mfs-1]->setright(arg1,arg2);
00126 }
00127 if(typ==FZ_CONST)
00128 {
00129 arg1=va_arg(list,double);
00130 output[outputgroup1]->mf[output[outputgroup1]->mfs-1]->setconst(arg1);
00131 }
00132 va_end(list);
00133 }
00134 void cFuzzyObj::AddRule(int outputgroup1,...)
00135 {
00136 va_list list;
00137 int i;
00138
00139 va_start(list,outputgroup1);
00140
00141 rules++;
00142 rule=(fuzzyrule **)realloc(rule,rules*sizeof(fuzzyrule *));
00143 rule[rules-1]=new fuzzyrule(inputs);
00144
00145 rule[rules-1]->setoutputgroup(outputgroup1);
00146 for(i=0;i<inputs;i++) {
00147 rule[rules-1]->setinput(i,va_arg(list,int));
00148 }
00149 rule[rules-1]->setoutput(va_arg(list,int));
00150 va_end(list);
00151 }
00152 float cFuzzyObj::CountResult(int outputgroup1,int method,int ops,...)
00153 {
00154 int i,j,k;
00155 float val;
00156 va_list list;
00157 double *values;
00158
00159 values=(double *)malloc(inputs*sizeof(double));
00160 va_start(list,ops);
00161
00162 for(i=0;i<inputs;i++) values[i]=va_arg(list,double);
00163
00164 fuzzy out(output[outputgroup1]->min,output[outputgroup1]->max,output[outputgroup1]->samples);
00165 fuzzy c(output[outputgroup1]->min,output[outputgroup1]->max,output[outputgroup1]->samples);
00166 out.setconst(0);
00167
00168 for(i=0;i<rules;i++) {
00169 if(rule[i]->outputgroup==outputgroup1)
00170 {
00171 val=1;
00172 for(j=0;j<rule[i]->inputs;j++)
00173 {
00174 if(rule[i]->input[j]>=0)
00175 {
00176 if(ops==OPS_ZADEH) val=andz(val,input[j]->mf[rule[i]->input[j]]->value(values[j]));
00177 if(ops==OPS_LARSEN) val=andp(val,input[j]->mf[rule[i]->input[j]]->value(values[j]));
00178 if(ops==OPS_LUKASIEWITZ) val=andl(val,input[j]->mf[rule[i]->input[j]]->value(values[j]));
00179 }
00180 }
00181 if(val>0)
00182 {
00183 if(ops==OPS_ZADEH) c.setandz(*output[outputgroup1]->mf[rule[i]->output],val);
00184 if(ops==OPS_LARSEN) c.setandp(*output[outputgroup1]->mf[rule[i]->output],val);
00185 if(ops==OPS_LUKASIEWITZ) c.setandl(*output[outputgroup1]->mf[rule[i]->output],val);
00186
00187 out.setorz(out,c);
00188 }
00189 }
00190 }
00191 if(values!=NULL) {
00192 free(values);
00193 }
00194 va_end(list);
00195
00196 if(method==DFZ_CENTROID) return(out.centroid());
00197 if(method==DFZ_BISECTOR) return(out.bisector());
00198 if(method==DFZ_LOM) return(out.lom());
00199 if(method==DFZ_MOM) return(out.mom());
00200 if(method==DFZ_HOM) return(out.hom());
00201 return(out.centroid());
00202 }