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

Gleitende Übergänge von Fuzzy-Sets werden berechnet

parent 06a5f863
......@@ -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());
}
......
......@@ -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(
......
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