Commit 820526d1 authored by Falko Schumann's avatar Falko Schumann

Dokumentation auf den letzten Stand gebracht

parent 457a6126
......@@ -28,6 +28,12 @@ package de.bsvrz.iav.fuzzylib.fuzzylib;
import java.util.*;
/**
* Definition eines Ausdrucks, als Basis(klasse) eines Interpreters.
*
* @param <T> das Ergebnis des Ausdrucks.
* @author BitCtrl Systems GmbH, Falko Schumann
*/
public interface Ausdruck<T> {
T interpretiere(Map<String, ?> kontext);
......
......@@ -32,6 +32,7 @@ import java.util.function.*;
/**
* Definiert eine Operation mit zwei Operatoren.
*
* @param <T> das Ergebnis des Ausdrucks.
* @author BitCtrl Systems GmbH, Falko Schumann
*/
public class BiOperation<T> implements Ausdruck<T> {
......
......@@ -36,12 +36,9 @@ import java.util.*;
* 1.0 besitzen. Damit lassen sich die Funktionen Trapez, Rechteck, Dreieck,
* Strich, aufsteigende Rampe und abfallende Rampe abbilden.
* <p>
* Es gibt zwei Spezialfälle. Bei einem Fuzzy-Set mit gleitenden Übergängen,
* Es gibt einen Spezialfall. Bei einem Fuzzy-Set mit gleitenden Übergängen,
* werden nur t2 und t3 definiert. Eine linguistische Variable muss t1 und t4 so
* bestimmen, dass zwischen den Fuzzy-Sets gleitende Übergänge entstehen. Ein
* Fuzzy-Set überschneidet Anfang und Ende eines runden Wertebereichs, wenn sich
* das Tupel [t1, t2] hinter dem Tupel [t3, t4] auf der Achse des Wertebereichs
* befindet.
* bestimmen, dass zwischen den Fuzzy-Sets gleitende Übergänge entstehen.
*
* @author BitCtrl Systems GmbH, Falko Schumann
*/
......
......@@ -29,7 +29,7 @@ package de.bsvrz.iav.fuzzylib.fuzzylib;
import java.util.*;
/**
* Bestimmt das Maximum von Gleitkommazahlen.
* Bestimmt das Maximum von Zugehörigkeiten.
*
* @author BitCtrl Systems GmbH, Falko Schumann
*/
......@@ -64,6 +64,7 @@ public final class Maximum implements Ausdruck<Zugehoerigkeit> {
operanden.stream()
.map(Object::toString)
.reduce((o1, o2) -> o1 + ", " + o2)
.orElse("keine Operanden")
+ ")";
}
......
......@@ -29,7 +29,7 @@ package de.bsvrz.iav.fuzzylib.fuzzylib;
import java.util.*;
/**
* Bestimmt das Minimum von Gleitkommazahlen.
* Bestimmt das Minimum von Zugehörigkeiten.
*
* @author BitCtrl Systems GmbH, Falko Schumann
*/
......@@ -64,6 +64,7 @@ public final class Minimum implements Ausdruck<Zugehoerigkeit> {
operanden.stream()
.map(Object::toString)
.reduce((o1, o2) -> o1 + ", " + o2)
.orElse("keine Operanden")
+ ")";
}
......
......@@ -32,6 +32,7 @@ import java.util.function.*;
/**
* Definiert eine Operation mit einem Operator.
*
* @param <T> das Ergebnis des Ausdrucks.
* @author BitCtrl Systems GmbH, Falko Schumann
*/
public class Operation<T> implements Ausdruck<T> {
......
......@@ -128,11 +128,10 @@ public final class Regelbasis implements Ausdruck<Collection<FuzzyVariable>> {
@Override
public String toString() {
StringBuilder wb = new StringBuilder();
for (final Regel r : regeln) {
wb.append(r).append("\n");
}
return wb.toString();
return regeln.stream()
.map(Regel::toString)
.reduce((r1, r2) -> r1 + "\n" + r2)
.orElse("null");
}
}
......@@ -47,7 +47,11 @@ public final class Wertebereich {
@Override
public String toString() {
return minimum + "-" + maximum;
if (this.equals(KEINE_EINSCHRAENKUNG)) {
return "keine Einschränkung";
} else {
return minimum + "-" + maximum;
}
}
}
......@@ -42,6 +42,10 @@ public final class ZugehoerigkeitVariable implements Ausdruck<Zugehoerigkeit> {
this.name = Objects.requireNonNull(name, "name");
}
public String getName() {
return name;
}
@Override
public Zugehoerigkeit interpretiere(Map<String, ?> kontext) {
Object zugehoerigkeit = kontext.get(name);
......
......@@ -29,7 +29,22 @@
*
* <p><strong>Domainmodel der Fuzzyfizierung</strong></p>
* <p><img src="doc-files/fuzzyfizierung.png" alt="Fuzzyfizierung"></p>
* <p><strong>Domainmodel der Inferenz unter Nutzung des Interpreters</strong></p>
* <p><img src="doc-files/Inferenz.png" alt="Inferenz"></p>
* <p>Mit der {@link de.bsvrz.iav.fuzzylib.fuzzylib.LinguistischeVariable} können Messwerte fuzzyfiziert und eine
* {@link de.bsvrz.iav.fuzzylib.fuzzylib.FuzzyVariable} defuzzyfiziert werden.</p>
* <p><strong>Domainmodel der Inferenz</strong></p>
* <p><img src="doc-files/inferenz.png" alt="Inferenz"></p>
* <p>Für die Auswertung von Regeln wird ein minimaler Interpreter verwendet. Alle Ausdrücke in Regeln werden durch
* das Interface {@link de.bsvrz.iav.fuzzylib.fuzzylib.Ausdruck} repräsentiert. Die beiden Klassen
* {@link de.bsvrz.iav.fuzzylib.fuzzylib.Operation} und {@link de.bsvrz.iav.fuzzylib.fuzzylib.BiOperation} bilden
* beliebige Operationen auf den Zugehörigkeiten ab. Die folgenden Operationen sind vordefiniert:</p>
* <ul>
* <li>{@link de.bsvrz.iav.fuzzylib.fuzzylib.Minimum}</li>
* <li>{@link de.bsvrz.iav.fuzzylib.fuzzylib.Maximum}</li>
* <li>{@link de.bsvrz.iav.fuzzylib.fuzzylib.Komplement}</li>
* <li>{@link de.bsvrz.iav.fuzzylib.fuzzylib.Implikation}</li>
* <li>{@link de.bsvrz.iav.fuzzylib.fuzzylib.AlgebraischesProdukt}</li>
* <li>{@link de.bsvrz.iav.fuzzylib.fuzzylib.AlgebraischesSumme}</li>
* <li>{@link de.bsvrz.iav.fuzzylib.fuzzylib.GammaOperator}</li>
* </ul>
*/
package de.bsvrz.iav.fuzzylib.fuzzylib;
......@@ -70,7 +70,7 @@ t4: double</y:AttributeLabel>
<data key="d4" xml:space="preserve"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="144.0" width="285.0" x="117.0" y="58.0"/>
<y:Geometry height="162.0" width="285.0" x="117.0" y="49.0"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="147.9013671875" x="68.54931640625" xml:space="preserve" y="3.0">LinguistischeVariable<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
......@@ -81,7 +81,8 @@ fuzzySets: FuzzySet[]
terme: String[]</y:AttributeLabel>
<y:MethodLabel xml:space="preserve">gibFuzzySet(name: String): FuzzySet
fuzzyfiziere(wert: double): FuzzyVariable
defuzzyfiziere(variable: FuzzyVariable): double</y:MethodLabel>
defuzzyfiziere(variable: FuzzyVariable): double
erzeugeFuzzyVariable(): FuzzyVariable</y:MethodLabel>
</y:UML>
</y:UMLClassNode>
</data>
......@@ -106,7 +107,7 @@ maximum: double</y:AttributeLabel>
<data key="d4" xml:space="preserve"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="56.0" width="120.0" x="575.6666666666667" y="366.0"/>
<y:Geometry height="56.0" width="120.0" x="575.6666666666667" y="416.0"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="105.61962890625" x="7.190185546875" xml:space="preserve" y="3.0">Zugehoerigkeit<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
......@@ -162,6 +163,19 @@ maximum: double</y:AttributeLabel>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e4" source="n1" target="n5">
<data key="d8" xml:space="preserve"/>
<data key="d9"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="62.40625" x="3.7968546549479925" xml:space="preserve" y="30.916748046875">&lt;&lt;use&gt;&gt;<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="35.0" distanceToCenter="true" position="left" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
</graph>
<data key="d7">
<y:Resources/>
......
......@@ -8,8 +8,8 @@
<li>Erstellen von Fuzzy-Sets und linguistischen Variablen</li>
<li>Fuzzyfizierung von scharfen Messwerten</li>
<li>Defuzzyfizierung von Fuzzy-Werten</li>
<li>Erstellen von Regeln und zusammenstellen von Regeln zu einer Wissensbasis</li>
<li>Ableiten von neuen Fuzzy-Werten mit Hilfe einer Wissensbasis</li>
<li>Erstellen von Regeln und zusammenstellen von Regeln zu einer Regelbasis</li>
<li>Ableiten von neuen Fuzzy-Werten mit Hilfe einer Regelbasis</li>
</ul>
</body>
</html>
......@@ -140,4 +140,23 @@ public class RegelbasisTests {
assertEquals(Arrays.asList(verkehrszustand, verkehrszustandUnruhe), konklusionen);
}
@Test
public void formattierterText() {
String regeln = "min(VKfz[hoch], KB[niedrig]) -> VerkehrsZustand[frei] (1.0)\n"
+ "min(VKfz[hoch], KB[hoch]) -> VerkehrsZustand[dicht] (1.0)\n"
+ "min(VKfz[mittel], KB[nicht sehr hoch]) -> VerkehrsZustand[zähfließend] (1.0)\n"
+ "min(VKfz[niedrig], VKfz1[niedrig]) -> VerkehrsZustand[gestaut] (1.0)\n"
+ "min(KB[sehr hoch]) -> VerkehrsZustand[gestaut] (1.0)\n"
+ "min(SKfz[hoch], QKfz[hoch]) -> VerkehrsZustandUnruhe[Unruhe im Verkehr] (1.0)\n"
+ "min(SKfz[hoch], QKfz[sehr hoch]) -> VerkehrsZustandUnruhe[Unruhe im Verkehr] (1.0)\n"
+ "min(SKfz[hoch], QKfz[mittel]) -> VerkehrsZustandUnruhe[Keine Unruhe] (1.0)\n"
+ "min(SKfz[hoch], QKfz[niedrig]) -> VerkehrsZustandUnruhe[Keine Unruhe] (1.0)\n"
+ "min(SKfz[hoch], QKfz[sehr niedrig]) -> VerkehrsZustandUnruhe[Keine Unruhe] (1.0)\n"
+ "min(SKfz[niedrig]) -> VerkehrsZustandUnruhe[Keine Unruhe] (1.0)";
assertEquals(regeln, regelbasis.toString());
Regelbasis keineRegeln = new Regelbasis();
assertEquals("null", keineRegeln.toString());
}
}
......@@ -52,4 +52,13 @@ public class WertebereichTests {
new Wertebereich(300, 200);
}
@Test
public void formattierterText() {
Wertebereich w = new Wertebereich(0, 254);
assertEquals("0.0-254.0", w.toString());
w = Wertebereich.KEINE_EINSCHRAENKUNG;
assertEquals("keine Einschränkung", w.toString());
}
}
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