Commit 1e3b9cb6 authored by Falko Schumann's avatar Falko Schumann
Browse files

Gleitende Übergänge von Fuzzy-Sets werden berechnet

parent 06a5f863
Loading
Loading
Loading
Loading
+41 −5
Original line number Diff line number Diff line
@@ -160,14 +160,50 @@ public final class LinguistischeVariable {
        }

        FuzzyVariable fuzzyfiziere(double wert) {
            // TODO Wenn nur t2 und t3 der Fuzzy-Sets angegeben sind, t1 und t4 so berechnen, das fließende Übergänge entstehen
            // TODO Wenn nur t2 und t3 der Fuzzy-Sets angegeben sind, für erstes und letztes Fuzzy-Set im Wertebereich Rampen annehmen

            List<Term> terme = fuzzyfiziere(linguistischeVariable.getFuzzySets(), 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))
@@ -222,7 +258,7 @@ public final class LinguistischeVariable {
        private List<FuzzySet> bestimmeRelevanteFuzzySets(FuzzyVariable fuzzyWert) {
            List<String> gemeinsameTerme = bestimmeGemeinsameTerme(fuzzyWert);
            return gemeinsameTerme.stream()
                    .map(t -> linguistischeVariable.gibFuzzySet(t))
                    .map(linguistischeVariable::gibFuzzySet)
                    .sorted(Comparator.comparingDouble(FuzzySet::getT1))
                    .collect(Collectors.toList());
        }
+21 −0
Original line number Diff line number Diff line
@@ -185,6 +185,27 @@ public class LinguistischeVariableTests {
                fuzzyVariable);
    }

    @Test
    public void fuzzyfiziere_FuzzySetsMitGleitendenUebergaengen() {
        LinguistischeVariable linguistischeVariable = new LinguistischeVariable(
                "Geschwindigkeit",
                erzeugeWertebereich(),
                FuzzySet.trapezMitGleitendenUebergaengen("niedrig", 0.0, 25.0),
                FuzzySet.trapezMitGleitendenUebergaengen("mittel", 35.0, 75.0),
                FuzzySet.trapezMitGleitendenUebergaengen("hoch", 85.0, 254.0)
        );

        FuzzyVariable fuzzyVariable = linguistischeVariable.fuzzyfiziere(30.0);

        assertEquals(
                new FuzzyVariable("Geschwindigkeit",
                        new Term("niedrig", Zugehoerigkeit.von(0.5)),
                        new Term("mittel", Zugehoerigkeit.von(0.5)),
                        new Term("hoch", Zugehoerigkeit.von(0.0))
                ),
                fuzzyVariable);
    }

    @Test
    public void defuzzyfiziere_BeispielWikipedia_FuzzyRegler() {
        LinguistischeVariable linguistischeVariable = new LinguistischeVariable(