Loading src/main/java/de/bsvrz/iav/fuzzylib/fuzzylib/LinguistischeVariable.java +41 −5 Original line number Diff line number Diff line Loading @@ -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)) Loading Loading @@ -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()); } Loading src/test/java/de/bsvrz/iav/fuzzylib/fuzzylib/LinguistischeVariableTests.java +21 −0 Original line number Diff line number Diff line Loading @@ -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( Loading Loading
src/main/java/de/bsvrz/iav/fuzzylib/fuzzylib/LinguistischeVariable.java +41 −5 Original line number Diff line number Diff line Loading @@ -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)) Loading Loading @@ -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()); } Loading
src/test/java/de/bsvrz/iav/fuzzylib/fuzzylib/LinguistischeVariableTests.java +21 −0 Original line number Diff line number Diff line Loading @@ -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( Loading