kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Objektorientierte Implementierung einer Fuzzygröße

fuzzy_cpp.zip - Klassen Fuzzygroesse, Eingangsfuzzyset, Ausgangsfuzzyset.
  • Im Hauptkapitel wurden top-down einige Implementierungstechniken beschrieben.
  • Nun folgen bottom-up einige Teilimplementierungen.
  • Zunächst soll eine Fuzzygröße durch eine C++-Klasse repräsentiert werden.
  • Dies geschieht im wesentlichen durch die analythische Repräsentation der Zugehörigkeitsfunktion.
  • Dabei ist zu unterscheiden, ob die Ränder begrenzt sind oder nicht:
Varianten bei einer Fuzzy-Größe

Bild 0-1: Varianten bei einer Fuzzy-Größe

  • Eine begrenzte Fuzzygröße ist eindeutig durch Angabe der Stellen p0, p1 und p2 bestimmt (s. Bild oben), mit p0<p1<p2.
  • Sie kann als Alternative noch rechts oder links unbegrenzt sein. In diesen Fällen spielen die Stellen p0, bzw. p2 dann keine Rolle.
  • Für die Berechnung des Zugehörigkeitswertes für eine Eingangsgröße x, müssen die entsprechenden Fallunterscheidungen vorgenommen werden.
  • Dies ist in der entsprechenden Funktion folgender Implementierung bereits umgesetzt worden:
class Fuzzygroesse
{
    public:
        double p[3];
        bool links_unbegrenzt, rechts_unbegrenzt;
        Fuzzygroesse(double p0, double p1, double p2, 
                     bool links_unbegrenzt=false, bool rechts_unbegrenzt=false)
        {
            this->p[0] = p0;
            this->p[1] = p1;
            this->p[2] = p2;
            this->links_unbegrenzt  = links_unbegrenzt;
            this->rechts_unbegrenzt = rechts_unbegrenzt;
            //Sinnvolle Festlegung von p0 und p2 bei teilweise unbegrenzten Funktionen,
            //damit die Fallunterscheidung unten richtig funktioniert:
            if(links_unbegrenzt == true)
                p[0]=p[1]-1.0;
            if(rechts_unbegrenzt == true)
                p[2]=p[1]+1.0;
        }
        double berechneZugehoerigkeitswert(double x)
        {
            //Behandlung der trivialen Fälle:
            if(links_unbegrenzt==true && x<=p[1])
                return 1.0;
            if(rechts_unbegrenzt==true && x>=p[1])
                return 1.0;
            if(x<=p[0])
                return 0.0;
            if(x>=p[2])
                return 0.0;
            if(x<p[1]) //steigende Gerade
                return (x-p[0])/(p[1]-p[0]);
            else       //fallende Gerade
                return (x-p[2])/(p[1]-p[2]);
        }
        double berechneSchwerpunkt(double aktivierung)
        {
            if(aktivierung==0.0)  //Division durch Null vermeiden.
                return 0.0;
            //Schnittpunkte mit y=aktivierung bestimmen:
            double x1 = p[0] + aktivierung*(p[1]-p[0]);
            double x2 = p[2] + aktivierung*(p[1]-p[2]);
            //Flächen von erstem Dreieck, Rechteck und zweitem Dreieck bestimmen:
            double A0 = 0.5*(x1-p[0])*aktivierung;
            double A1 = (x2-x1)*aktivierung;
            double A2 = 0.5*(p[2]-x2)*aktivierung;
            //Schwerpunkte von erstem Dreieck, Rechteck und zweitem Dreieck bestimmen:
            double s0 = p[0]+(2.0/3.0)*(x1-p[0]);
            double s1 = 0.5*(x1+x2);
            double s2 = p[2]-(2.0/3.0)*(p[2]-x2);
            return (s0*A0+s1*A1+s2*A2)/(A0+A1+A2);
        }
        double berechneFlaeche(double aktivierung)
        {
            //Schnittpunkte mit y=aktivierung bestimmen:
            double x1 = p[0] + aktivierung*(p[1]-p[0]);
            double x2 = p[2] + aktivierung*(p[1]-p[2]);
            //Flächen von erstem Dreieck, Rechteck und zweitem Dreieck bestimmen:
            double A0 = 0.5*(x1-p[0])*aktivierung;
            double A1 = (x2-x1)*aktivierung;
            double A2 = 0.5*(p[2]-x2)*aktivierung;
            return A0+A1+A2;
        }
};

Code 0-1: Quellcode der Klasse Fuzzygroesse in der Datei Fuzzygroesse.h

Übungsaufgabe a): Schreiben Sie ein Testprogramm "TestFuzzygroesse.cpp" für obige Klasse, das alle Fuzzygrößen der Übung9 erzeugt und die Zugehörigkeitswerte zu den Eingangsgrößen berechnet.
R=7 und T=12.5, =>
Rkalt   = 0.6
Rmittel = 0.4
Rwarm   = 0
Tkalt   = 0.5
Twarm   = 0.5
R=5 und T=7, =>
Rkalt   = 1
Rmittel = 0
Rwarm   = 0
Tkalt   = 0.866667
Twarm   = 0.133333

Code 0-2: Ihr Programm sollte obige Ausgabe liefern.