Commit ac2e53d1 authored by Falko Schumann's avatar Falko Schumann
Browse files

Sonderfall runder Wertebereich entfernt

parent 6e2b548a
Loading
Loading
Loading
Loading
+0 −11
Original line number Diff line number Diff line
@@ -95,13 +95,6 @@ public final class FuzzySet {
        return new FuzzySet(name, Double.NaN, t2, t3, Double.NaN);
    }

    public static FuzzySet runderWertebereich(String name, double t1, double t2, double t3, double t4) {
        if (t1 > t2 || t2 <= t3 || t3 > t4) {
            throw new IllegalArgumentException("Runder Wertebereich: Die ersten beiden und die letzten beiden Trapezecken müssen monoton aufsteigend sortiert angegeben werden, die beiden mittleren Trapezecken müssen dagegen streng monoton fallend angegeben werden: " + t1 + ", " + t2 + ", " + t3 + ", " + t4);
        }
        return new FuzzySet(name, t1, t2, t3, t4);
    }

    public String getName() {
        return name;
    }
@@ -122,10 +115,6 @@ public final class FuzzySet {
        return t4;
    }

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
+0 −13
Original line number Diff line number Diff line
@@ -128,24 +128,11 @@ public final class LinguistischeVariable {
        // 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<FuzzySet> fuzzySets = zerlegeFuzzySetsDieAnfangUndEndeDesWertebereichsUeberschneiden();
        List<Term> terme = fuzzyfiziere(fuzzySets, wert);
        terme = fasseGleicheTermeZusammen(terme);
        return new FuzzyVariable(name, terme);
    }

    private List<FuzzySet> zerlegeFuzzySetsDieAnfangUndEndeDesWertebereichsUeberschneiden() {
        List<FuzzySet> fuzzySets = new ArrayList<>(this.fuzzySets);
        for (int i = 0; i < fuzzySets.size(); i++) {
            FuzzySet fs = fuzzySets.get(i);
            if (fs.ueberschneidetAnfangUndEndeDesWertebereichs()) {
                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()));
            }
        }
        return fuzzySets;
    }

    private static List<Term> fuzzyfiziere(List<FuzzySet> fuzzySets, double wert) {
        return fuzzySets.stream()
                .map(fs -> bestimmeTerm(fs, wert))
+0 −36
Original line number Diff line number Diff line
@@ -153,42 +153,6 @@ public class FuzzySetTests {
        FuzzySet.trapezMitGleitendenUebergaengen("mittel", 75.1, 75.0);
    }


    @Test
    public void runderWertebereich_Normalfall() {
        FuzzySet fuzzySet = FuzzySet.runderWertebereich("Nord", 330.0, 359.0, 0.0, 30.0);

        assertEquals("name", "Nord", fuzzySet.getName());
        assertEquals("t1", 330.0, fuzzySet.getT1(), 0.001);
        assertEquals("t2", 359.0, fuzzySet.getT2(), 0.001);
        assertEquals("t3", 0.0, fuzzySet.getT3(), 0.001);
        assertEquals("t4", 30.0, fuzzySet.getT4(), 0.001);
    }

    @Test
    public void runderWertebereich_T1ZuGross_Ausnahmefehler() {
        exception.expect(IllegalArgumentException.class);
        exception.expectMessage("Runder Wertebereich: Die ersten beiden und die letzten beiden Trapezecken müssen monoton aufsteigend sortiert angegeben werden, die beiden mittleren Trapezecken müssen dagegen streng monoton fallend angegeben werden: 360.0, 359.0, 0.0, 30.0");

        FuzzySet.runderWertebereich("Nord", 360.0, 359.0, 0.0, 30.0);
    }

    @Test
    public void runderWertebereich_T2ZuKlein_Ausnahmefehler() {
        exception.expect(IllegalArgumentException.class);
        exception.expectMessage("Runder Wertebereich: Die ersten beiden und die letzten beiden Trapezecken müssen monoton aufsteigend sortiert angegeben werden, die beiden mittleren Trapezecken müssen dagegen streng monoton fallend angegeben werden: 330.0, 10.0, 20.0, 30.0");

        FuzzySet.runderWertebereich("Nord", 330.0, 10.0, 20.0, 30.0);
    }

    @Test
    public void runderWertebereich_T3ZuGross_Ausnahmefehler() {
        exception.expect(IllegalArgumentException.class);
        exception.expectMessage("Runder Wertebereich: Die ersten beiden und die letzten beiden Trapezecken müssen monoton aufsteigend sortiert angegeben werden, die beiden mittleren Trapezecken müssen dagegen streng monoton fallend angegeben werden: 330.0, 359.0, 31.0, 30.0");

        FuzzySet.runderWertebereich("Nord", 330.0, 359.0, 31.0, 30.0);
    }

    @Test
    public void formattierterText() {
        FuzzySet fuzzySet = FuzzySet.trapez("mittel", 25.0, 35.0, 75.0, 85.0);
+0 −23
Original line number Diff line number Diff line
@@ -185,29 +185,6 @@ 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.von(1.0)),
                        new Term("Ost", Zugehoerigkeit.von(0.0)),
                        new Term("Süd", Zugehoerigkeit.von(0.0)),
                        new Term("West", Zugehoerigkeit.von(0.0))
                ),
                fuzzyVariable);
    }

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