Commit 3b041239 authored by Falko Schumann's avatar Falko Schumann
Browse files

Runder Wertebereich wie Windrichtung kann auf zwei Arten definiert werden

1)  Zwei Fuzzy-Sets mit gleichem Namen "Nord", die bei Fuzzyfizierung
zusammengefasst werden.
2)  Ein Fuzzy-Set wo abfallende Rampe und aufsteigende Rampe
zusammengefasst werden. Der Anfang bzw. das Ende der Rampen werden auf
das Minimum bzw. Maximum des Wertebereichs gesetzt.
parent ceb9da31
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -122,6 +122,10 @@ public final class FuzzySet {
        return t4;
    }

    public boolean isRunderWertebereich() {
        return t1 <= t2 && t2 >= t3 && t3 <= t4;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
+8 −0
Original line number Diff line number Diff line
@@ -129,6 +129,14 @@ public final class LinguistischeVariable {
        // TODO Wenn nur t2 und t3 der Fuzzy-Sets angegeben sind, für erstes und letztes Fuzzy-Set im Wertebereich Rampen annehmen
        // TODO Spezialfall runder Wertebreich: Aus einem Fuzzy-Set, dass beide Wertebereichsgrenzen schneidet, werden zwei Fuzyy-Sets erzeugt

        List<FuzzySet> fuzzySets = new ArrayList<>(this.fuzzySets);
        for (int i = 0; i < fuzzySets.size(); i++) {
            FuzzySet fs = fuzzySets.get(i);
            if (fs.isRunderWertebereich()) {
                fuzzySets.set(i, FuzzySet.aufsteigendeRampe(fs.getName(), fs.getT1(), fs.getT2(), wertebereich.getMaximum()));
                fuzzySets.add(FuzzySet.abfallendeRampe(fs.getName(), wertebereich.getMinimum(), fs.getT3(), fs.getT4()));
            }
        }
        List<Term> terme = fuzzyfiziere(fuzzySets, wert);
        terme = fasseGleicheTermeZusammen(terme);
        return new FuzzyVariable(name, terme);
+24 −1
Original line number Diff line number Diff line
@@ -165,7 +165,7 @@ public class LinguistischeVariableTests {
    public void fuzzyfiziere_FuzzySetsMitGleichenNamen() {
        LinguistischeVariable linguistischeVariable = new LinguistischeVariable(
                "Windrichtung",
                erzeugeWertebereich(),
                new Wertebereich(0.0, 359.0),
                FuzzySet.trapez("Nord", 0.0, 0.0, 35.0, 55.0),
                FuzzySet.trapez("Ost", 35.0, 55.0, 125.0, 145.0),
                FuzzySet.trapez("Süd", 125.0, 145.0, 215.0, 235.0),
@@ -185,6 +185,29 @@ public class LinguistischeVariableTests {
                fuzzyVariable);
    }

    @Test
    public void fuzzyfiziere_RunderWertebereich() {
        LinguistischeVariable linguistischeVariable = new LinguistischeVariable(
                "Windrichtung",
                new Wertebereich(0.0, 359.0),
                FuzzySet.runderWertebereich("Nord", 305.0, 325.0, 35.0, 55.0),
                FuzzySet.trapez("Ost", 35.0, 55.0, 125.0, 145.0),
                FuzzySet.trapez("Süd", 125.0, 145.0, 215.0, 235.0),
                FuzzySet.trapez("West", 215.0, 235.0, 305.0, 325.0)
        );

        FuzzyVariable fuzzyVariable = linguistischeVariable.fuzzyfiziere(30.0);

        assertEquals(
                new FuzzyVariable("Windrichtung",
                        new Term("Nord", Zugehoerigkeit.of(1.0)),
                        new Term("Ost", Zugehoerigkeit.of(0.0)),
                        new Term("Süd", Zugehoerigkeit.of(0.0)),
                        new Term("West", Zugehoerigkeit.of(0.0))
                ),
                fuzzyVariable);
    }

    @Test
    @Ignore("Defuzzyfizierung noch nicht implementiert")
    public void defuzzyfiziere_Normalfall() {