src/fuzzyobj.cpp

Go to the documentation of this file.
00001 #include "fuzzyobj.h"
00002 #include <stdio.h>
00003 //#include <unistd.h>
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 } 

Generated on Thu Apr 26 22:45:27 2007 for GangOfSix(GOS)-RoboCupTeamProject by  doxygen 1.5.1-p1