00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef NL_FUZZYSET_H
00027 #define NL_FUZZYSET_H
00028
00029 #include "nel/ai/agent/agent.h"
00030 #include "nel/ai/agent/agent_digital.h"
00031 #include "nel/ai/agent/object_type.h"
00032
00033 namespace NLAIFUZZY {
00034
00035 class IFuzzySet : public NLAIAGENT::IObjectIA {
00036 protected:
00037 char *_Name;
00038 std::list<double> _Facts;
00039 double _Value;
00040
00041 public:
00042 IFuzzySet(char *name)
00043 {
00044 _Name = new char[strlen(name) + 1];
00045 strcpy(_Name, name);
00046 }
00047
00048 virtual ~IFuzzySet()
00049 {
00050 delete[] _Name;
00051 }
00052
00053 char *getName()
00054 {
00055 return _Name;
00056 }
00057
00058 virtual double membership(double) = 0;
00059 virtual double surface() = 0;
00060 virtual bool isIn(double) = 0;
00061 virtual double center() = 0;
00062 virtual void addFact(double);
00063 virtual double agregate();
00064 virtual double getValue();
00065
00066 virtual NLAIAGENT::tQueue isMember(const NLAIAGENT::IVarName *, const NLAIAGENT::IVarName *, const NLAIAGENT::IObjectIA &) const;
00067 virtual NLAIAGENT::IObjectIA::CProcessResult runMethodeMember(sint32, NLAIAGENT::IObjectIA *);
00068 };
00069
00070 class CFuzzyInterval : public IFuzzySet
00071 {
00072 private:
00073 double _Min;
00074 double _Max;
00075 public:
00076 CFuzzyInterval(char *,double min, double max);
00077 CFuzzyInterval(const CFuzzyInterval &cp);
00078 virtual double membership(double val);
00079 virtual bool isIn(double val);
00080 virtual double surface();
00081 virtual double center();
00082
00083 virtual const NLAIC::IBasicType *clone() const;
00084 virtual const NLAIC::IBasicType *newInstance() const;
00085 virtual const NLAIC::CIdentType &getType() const;
00086 virtual void save(NLMISC::IStream &os);
00087 virtual void load(NLMISC::IStream &is);
00088 virtual void getDebugString(std::string &) const;
00089 virtual bool isEqual(const NLAIAGENT::IBasicObjectIA &a) const;
00090 virtual const CProcessResult &run();
00091
00092 static const NLAIC::CIdentType IdFuzzyInterval;
00093 virtual void init(NLAIAGENT::IObjectIA *);
00094 };
00095
00096 class CRightFuzzySet : public IFuzzySet {
00097 private:
00098 double _X1;
00099 double _X2;
00100 double _X3;
00101
00102 public:
00103 CRightFuzzySet(char *, double, double, double);
00104 CRightFuzzySet(const CRightFuzzySet &);
00105 virtual double membership(double val);
00106 virtual bool isIn(double val);
00107 virtual double surface();
00108 virtual double center();
00109
00110 static const NLAIC::CIdentType IdRightFuzzySet;
00111
00112 virtual const NLAIC::IBasicType *clone() const;
00113 virtual const NLAIC::IBasicType *newInstance() const;
00114 virtual const NLAIC::CIdentType &getType() const;
00115 virtual void save(NLMISC::IStream &os);
00116 virtual void load(NLMISC::IStream &is);
00117 virtual void getDebugString(std::string &) const;
00118 virtual bool isEqual(const NLAIAGENT::IBasicObjectIA &a) const;
00119 virtual const CProcessResult &run();
00120 virtual void init(NLAIAGENT::IObjectIA *);
00121 };
00122
00123 class CTriangleFuzzySet : public IFuzzySet {
00124 private:
00125 double _X1;
00126 double _X2;
00127 double _X3;
00128
00129 public:
00130 CTriangleFuzzySet(char *,double, double, double);
00131 CTriangleFuzzySet(const CTriangleFuzzySet &);
00132
00133 virtual double membership(double);
00134 virtual bool isIn(double);
00135 virtual double surface();
00136 virtual double center();
00137
00138 static const NLAIC::CIdentType IdTriangleFuzzySet;
00139 virtual const NLAIC::IBasicType *clone() const;
00140 virtual const NLAIC::IBasicType *newInstance() const;
00141 virtual const NLAIC::CIdentType &getType() const;
00142 virtual void save(NLMISC::IStream &os);
00143 virtual void load(NLMISC::IStream &is);
00144 virtual void getDebugString(std::string &) const;
00145 virtual bool isEqual(const NLAIAGENT::IBasicObjectIA &a) const;
00146 virtual const CProcessResult &run();
00147
00148 virtual void init(NLAIAGENT::IObjectIA *);
00149 };
00150
00151 class CTrapezeFuzzySet : public IFuzzySet {
00152 private:
00153 double _X1;
00154 double _X2;
00155 double _X3;
00156 double _X4;
00157
00158 public:
00159 static const NLAIC::CIdentType IdTrapezeFuzzySet;
00160
00161 CTrapezeFuzzySet(char *,double p1,double p2,double p3, double p4);
00162 CTrapezeFuzzySet(const CTrapezeFuzzySet &);
00163 ~CTrapezeFuzzySet();
00164 virtual double membership(double val);
00165 virtual bool isIn(double val);
00166 virtual double surface();
00167 virtual double center();
00168
00169 virtual const NLAIC::IBasicType *clone() const;
00170 virtual const NLAIC::IBasicType *newInstance() const;
00171 virtual const NLAIC::CIdentType &getType() const;
00172 virtual void save(NLMISC::IStream &os);
00173 virtual void load(NLMISC::IStream &is);
00174 virtual void getDebugString(std::string &) const;
00175 virtual bool isEqual(const NLAIAGENT::IBasicObjectIA &a) const;
00176 virtual const CProcessResult &run();
00177
00178 virtual void init(NLAIAGENT::IObjectIA *);
00179 };
00180
00181 class CLeftFuzzySet : public IFuzzySet {
00182 private:
00183 double _X1;
00184 double _X2;
00185 double _X3;
00186
00187 public:
00188 CLeftFuzzySet(char *,double p1,double p2,double p3);
00189 CLeftFuzzySet(const CLeftFuzzySet &);
00190 ~CLeftFuzzySet();
00191 virtual double membership(double val);
00192 virtual bool isIn(double val);
00193 virtual double surface();
00194 virtual double center();
00195
00196 static const NLAIC::CIdentType IdLeftFuzzySet;
00197
00198 virtual const NLAIC::IBasicType *clone() const;
00199 virtual const NLAIC::IBasicType *newInstance() const;
00200 virtual const NLAIC::CIdentType &getType() const;
00201 virtual void save(NLMISC::IStream &os);
00202 virtual void load(NLMISC::IStream &is);
00203 virtual void getDebugString(std::string &) const;
00204 virtual bool isEqual(const NLAIAGENT::IBasicObjectIA &a) const;
00205 virtual const CProcessResult &run();
00206
00207 virtual void init(NLAIAGENT::IObjectIA *);
00208 };
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235 }
00236 #endif
00237
00238