Commit 0ab179dd authored by Falko Schumann's avatar Falko Schumann 💩
Browse files

Gleitende Übergänge der Fuzzy-Sets müssen auch bei Defuzzyfierzierung bestimmt werden

parent acb8f80a
Loading
Loading
Loading
Loading
+39 −40
Original line number Diff line number Diff line
@@ -136,11 +136,48 @@ public final class LinguistischeVariable {
    }

    public FuzzyVariable fuzzyfiziere(double wert) {
        return new Fuzzyfizierung(this).fuzzyfiziere(wert);
        return new Fuzzyfizierung(mitGleitendenUebergaenge()).fuzzyfiziere(wert);
    }

    public double defuzzyfiziere(FuzzyVariable fuzzyWert) {
        return new Defuzzyfizierung(this).defuzzyfiziere(fuzzyWert);
        return new Defuzzyfizierung(mitGleitendenUebergaenge()).defuzzyfiziere(fuzzyWert);
    }

    LinguistischeVariable mitGleitendenUebergaenge() {
        List<FuzzySet> fuzzySetsMitUebergaengen = this.fuzzySets.stream()
                .sorted(Comparator.comparingDouble(FuzzySet::getT2))
                .collect(Collectors.toList());
        Wertebereich wertebereich = getWertebereich();
        for (int i = 0; i < fuzzySetsMitUebergaengen.size(); i++) {
            FuzzySet vorgaenger = i > 0 ? fuzzySetsMitUebergaengen.get(i - 1) : null;
            FuzzySet fuzzySet = fuzzySetsMitUebergaengen.get(i);
            FuzzySet nachfolger = i < fuzzySetsMitUebergaengen.size() - 1 ? fuzzySetsMitUebergaengen.get(i + 1) : null;

            double t1;
            if (Double.isNaN(fuzzySet.getT1())) {
                if (vorgaenger == null) {
                    t1 = wertebereich.getMinimum();
                } else {
                    t1 = vorgaenger.getT3();
                }
            } else {
                t1 = fuzzySet.getT1();
            }
            double t2 = fuzzySet.getT2();
            double t3 = fuzzySet.getT3();
            double t4;
            if (Double.isNaN(fuzzySet.getT4())) {
                if (nachfolger == null) {
                    t4 = wertebereich.getMaximum();
                } else {
                    t4 = nachfolger.getT2();
                }
            } else {
                t4 = fuzzySet.getT4();
            }
            fuzzySetsMitUebergaengen.set(i, FuzzySet.trapez(fuzzySet.getName(), t1, t2, t3, t4));
        }
        return new LinguistischeVariable(name, wertebereich, fuzzySetsMitUebergaengen);
    }

    @Override
@@ -173,49 +210,11 @@ public final class LinguistischeVariable {

        FuzzyVariable fuzzyfiziere(double wert) {
            List<FuzzySet> fuzzySets = linguistischeVariable.getFuzzySets();
            fuzzySets = ergaenzeGleitendeUebergaenge(fuzzySets);
            List<Term> terme = fuzzyfiziere(fuzzySets, wert);
            terme = fasseGleicheTermeZusammen(terme);
            return new FuzzyVariable(linguistischeVariable.getName(), terme);
        }

        private List<FuzzySet> ergaenzeGleitendeUebergaenge(List<FuzzySet> fuzzySets) {
            fuzzySets = fuzzySets.stream()
                    .sorted(Comparator.comparingDouble(FuzzySet::getT2))
                    .collect(Collectors.toList());
            Wertebereich wertebereich = linguistischeVariable.getWertebereich();
            for (int i = 0; i < fuzzySets.size(); i++) {
                FuzzySet vorgaenger = i > 0 ? fuzzySets.get(i - 1) : null;
                FuzzySet fuzzySet = fuzzySets.get(i);
                FuzzySet nachfolger = i < fuzzySets.size() - 1 ? fuzzySets.get(i + 1) : null;

                double t1;
                if (Double.isNaN(fuzzySet.getT1())) {
                    if (vorgaenger == null) {
                        t1 = wertebereich.getMinimum();
                    } else {
                        t1 = vorgaenger.getT3();
                    }
                } else {
                    t1 = fuzzySet.getT1();
                }
                double t2 = fuzzySet.getT2();
                double t3 = fuzzySet.getT3();
                double t4;
                if (Double.isNaN(fuzzySet.getT4())) {
                    if (nachfolger == null) {
                        t4 = wertebereich.getMaximum();
                    } else {
                        t4 = nachfolger.getT2();
                    }
                } else {
                    t4 = fuzzySet.getT4();
                }
                fuzzySets.set(i, FuzzySet.trapez(fuzzySet.getName(), t1, t2, t3, t4));
            }
            return fuzzySets;
        }

        private List<Term> fuzzyfiziere(List<FuzzySet> fuzzySets, double wert) {
            return fuzzySets.stream()
                    .map(fs -> bestimmeTerm(fs, wert))