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

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
......@@ -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;
......
......@@ -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);
......
......@@ -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() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment