Commit 97a0f904 authored by Falko Schumann's avatar Falko Schumann

Funktionen Fuzzy dokumentiert

parent 37834937
......@@ -28,6 +28,11 @@ package de.bsvrz.iav.fuzzylib.fuzzylib;
import de.bsvrz.sys.funclib.bitctrl.interpreter.*;
/**
* Stellt eine definierte Gleitkommazahl in einem Ausdruck dar.
*
* @author BitCtrl Systems GmbH, Falko Schumann
*/
public final class DoubleLiteral implements Literal<Double> {
private final double wert;
......
......@@ -30,6 +30,11 @@ import de.bsvrz.sys.funclib.bitctrl.interpreter.*;
import java.util.*;
/**
* Stellt eine Variable einer Gleitkommazahl in einem Ausdruck dar.
*
* @author BitCtrl Systems GmbH, Falko Schumann
*/
public final class DoubleVariable implements Variable<Double> {
private final String name;
......
......@@ -31,6 +31,17 @@ import de.bsvrz.sys.funclib.bitctrl.interpreter.*;
import java.util.*;
import java.util.stream.*;
/**
* Dieser Handler stellt Operationen mit Termen und Fuzzy-Variablen bereit.
* <p>
* Diese Operationen werden für die Regeln in der Regelbasis verwendet.
*
* @author BitCtrl Systems GmbH, Falko Schumann
* @see Term
* @see FuzzyVariable
* @see Regel
* @see Regelbasis
*/
public class FuzzyLogikHandler extends Handler {
/**
......
......@@ -28,6 +28,23 @@ package de.bsvrz.iav.fuzzylib.fuzzylib;
import java.util.*;
/**
* Ein Fuzzy-Set ist eine unscharfe Menge definiert durch eine Trapezfunktion.
* <p>
* Die Trapezecken t1, t2, t3 und t4 sind monoton aufsteigend sortiert, wobei t1
* und t4 stets die Zugehörigkeit 0.0 sowie t2 und t3 stets die Zugehörigkeit
* 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,
* 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.
*
* @author BitCtrl Systems GmbH, Falko Schumann
*/
public final class FuzzySet {
private final String name;
......@@ -36,22 +53,55 @@ public final class FuzzySet {
private final double t3;
private final double t4;
public FuzzySet(String name, double t2, double t3) {
this(name, Integer.MIN_VALUE, t2, t3, Integer.MAX_VALUE);
}
public FuzzySet(String name, double t1, double t2, double t3, double t4) {
private FuzzySet(String name, double t1, double t2, double t3, double t4) {
this.name = Objects.requireNonNull(name, "name");
if (t1 > t2 || t2 > t3 || t3 > t4) {
throw new IllegalArgumentException("Die vier Trapezecken müssen aufsteigend sortiert angegeben werden: " + t1 + ", " + t2 + ", " + t3 + ", " + t4);
}
this.t1 = t1;
this.t2 = t2;
this.t3 = t3;
this.t4 = t4;
}
public static FuzzySet trapez(String name, double t1, double t2, double t3, double t4) {
if (t1 > t2 || t2 > t3 || t3 > t4) {
throw new IllegalArgumentException("Die vier Trapezecken müssen aufsteigend sortiert angegeben werden: " + t1 + ", " + t2 + ", " + t3 + ", " + t4);
}
return new FuzzySet(name, t1, t2, t3, t4);
}
public static FuzzySet dreieck(String name, double t1, double t2, double t4) {
return trapez(name, t1, t2, t2, t4);
}
public static FuzzySet strich(String name, double t1) {
return trapez(name, t1, t1, t1, t1);
}
public static FuzzySet aufsteigendeRampe(String name, double t1, double t2, double t4) {
return trapez(name, t1, t2, t4, t4);
}
public static FuzzySet abfallendeRampe(String name, double t1, double t3, double t4) {
return trapez(name, t1, t1, t3, t4);
}
public static FuzzySet rechteck(String name, double t1, double t4) {
return trapez(name, t1, t1, t4, t4);
}
public static FuzzySet trapezMitGleitendenUebergaengen(String name, double t2, double t3) {
if (t2 > t3) {
throw new IllegalArgumentException("Gleitende Übergänge: Die beiden Trapezecken müssen monoton aufsteigend sortiert angegeben werden: " + t2 + ", " + t3);
}
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;
}
......
......@@ -29,6 +29,16 @@ package de.bsvrz.iav.fuzzylib.fuzzylib;
import java.util.*;
import java.util.stream.*;
/**
* Eine Fuzzy-Variable beschreibt die Zugehörigkeiten zu den Fuzzy-Sets einer
* linguistischen Variable.
* <p>
* Ein Fuzzy-Wert ist nicht definiert ({@link #isNull()}), wenn er keinen Term
* besitzt.
*
* @author BitCtrl Systems GmbH, Falko Schumann
* @see Term
*/
public final class FuzzyVariable {
private final String name;
......@@ -84,7 +94,7 @@ public final class FuzzyVariable {
.collect(Collectors.toList());
}
public Term term(final String name) {
public Term gibTerm(final String name) {
Objects.requireNonNull(name, "name");
return terme.stream()
.filter(t -> name.equals(t.getName()))
......
......@@ -29,6 +29,21 @@ package de.bsvrz.iav.fuzzylib.fuzzylib;
import java.util.*;
import java.util.stream.*;
/**
* Eine linguistische Variable beschreibt die Fuzzy-Sets einer Messgröße.
* <p>
* Eine linguistische Variable ist nicht definiert ({@link #isNull()}), wenn sie
* keine Fuzzy-Sets besitzt.
* <p>
* Durch Fuzzyfizierung wird für einen scharfen Messwert eine Fuzzy-Variable
* bestimmt. Durch Defuzzyfizierung wird für eine Fuzzy-Variable ein scharfer
* Messwert bestimmt. Fuzzyfizierung und Defuzzyfizierung finden nur im
* Wertebereich der Messgröße statt.
*
* @author BitCtrl Systems GmbH, Falko Schumann
* @see FuzzySet
* @see FuzzyVariable
*/
public final class LinguistischeVariable {
private final String name;
......@@ -94,7 +109,7 @@ public final class LinguistischeVariable {
.collect(Collectors.toList());
}
public FuzzySet fuzzySet(final String name) {
public FuzzySet gibFuzzySet(final String name) {
Objects.requireNonNull(name, "name");
return fuzzySets.stream()
.filter(t -> name.equals(t.getName()))
......
......@@ -32,6 +32,17 @@ import java.util.*;
import static de.bsvrz.iav.fuzzylib.fuzzylib.FuzzyLogikHandler.*;
/**
* Eine Regel leitet aus vorhandenn Termen einen neuen Term ab.
* <p>
* Eine Regel wird in der Form "Wenn Prämisse dann Konklusion mit
* Sicherheitsgrad" angegeben. Die Prämisse besteht aus belieben Operationen auf
* Termen die eine Zugehörigkeiten bestimmen. Zusammen mit dem Sicherheitsgrad
* bildet die bestimmte Zugehörigkeit die Zugehörigkeit für den Term der
* Konklusion.
*
* @author BitCtrl Systems GmbH, Falko Schumann
*/
public final class Regel implements Ausdruck<TermLiteral> {
private final Ausdruck<Double> praemisse;
......
......@@ -33,6 +33,15 @@ import java.util.stream.*;
import static de.bsvrz.iav.fuzzylib.fuzzylib.FuzzyLogikHandler.*;
/**
* Eine Regelbasis ist eine Menge von Regeln.
* <p>
* Die Regelbasis wertet alle enthaltenen Regeln aus und akkumuliert
* anschließend die abgeleiteten Terme zu Fuzzy-Variablen.
*
* @author BitCtrl Systems GmbH, Falko Schumann
* @see Regel
*/
public final class Regelbasis implements Ausdruck<Collection<FuzzyVariable>> {
public static final Regelbasis NULL = new Regelbasis();
......
......@@ -28,6 +28,11 @@ package de.bsvrz.iav.fuzzylib.fuzzylib;
import java.util.*;
/**
* Der Sicherheitsgrad ist eine Gleitkommazahl zwischen 0.0 und 1.0.
*
* @author BitCtrl Systems GmbH, Falko Schumann
*/
public final class Sicherheitsgrad {
public static final Sicherheitsgrad DEFAULT = new Sicherheitsgrad(1.0);
......@@ -40,7 +45,7 @@ public final class Sicherheitsgrad {
public static Sicherheitsgrad of(double wert) {
if (wert < 0 || wert > 1) {
throw new IllegalArgumentException("Der Sicherheitsgrad muss zwischen 0 und 1 liegen: " + wert);
throw new IllegalArgumentException("Der Sicherheitsgrad muss zwischen 0.0 und 1.0 liegen: " + wert);
}
return new Sicherheitsgrad(wert);
}
......
......@@ -28,6 +28,12 @@ package de.bsvrz.iav.fuzzylib.fuzzylib;
import java.util.*;
/**
* Ein Term beschreibt die Zugehörigkeit zu einem Fuzzy-Set.
*
* @author BitCtrl Systems GmbH, Falko Schumann
* @see FuzzySet
*/
public final class Term {
private final String name;
......
......@@ -30,6 +30,12 @@ import de.bsvrz.sys.funclib.bitctrl.interpreter.*;
import java.util.*;
/**
* Stellt einen definierten Term in einem Ausdruck dar, das Ergebnis die
* Zugehörigkeit des Terms als Gleitkommazahl.
*
* @author BitCtrl Systems GmbH, Falko Schumann
*/
public final class TermLiteral implements Literal<Double> {
private final String fuzzyVariable;
......
......@@ -30,6 +30,12 @@ import de.bsvrz.sys.funclib.bitctrl.interpreter.*;
import java.util.*;
/**
* Stellt eine Variable eines Terms in einem Ausdruck dar, das Ergebnis die
* Zugehörigkeit des Terms als Gleitkommazahl.
*
* @author BitCtrl Systems GmbH, Falko Schumann
*/
public final class TermVariable implements Variable<Double> {
private final String fuzzyVariable;
......@@ -58,7 +64,7 @@ public final class TermVariable implements Variable<Double> {
@Override
public Double interpret(Kontext kontext) {
FuzzyVariable fv = kontext.get(fuzzyVariable, FuzzyVariable.class);
Term t = fv.term(term);
Term t = fv.gibTerm(term);
return t.getZugehoerigkeit().nonNull() ? t.getZugehoerigkeit().getWert() : null;
}
......
......@@ -2,6 +2,11 @@ package de.bsvrz.iav.fuzzylib.fuzzylib;
import java.util.*;
/**
* Der Wertebereich einer Messgröße definiert durch sein Minimum und Maximum.
*
* @author BitCtrl Systems GmbH, Falko Schumann
*/
public final class Wertebereich {
public static final Wertebereich KEINE_EINSCHRAENKUNG = new Wertebereich(Double.MIN_VALUE, Double.MAX_VALUE);
......
......@@ -28,6 +28,13 @@ package de.bsvrz.iav.fuzzylib.fuzzylib;
import java.util.*;
/**
* Die Zugehörigkeit ist eine Gleitkommazahl zwischen 0.0 und 1.0.
* <p>
* Die Zugehörigkeit kann undefiniert ({@link #isNull()}) sein.
*
* @author BitCtrl Systems GmbH, Falko Schumann
*/
public final class Zugehoerigkeit implements Comparable<Zugehoerigkeit> {
public static final Zugehoerigkeit NULL = new Zugehoerigkeit(-1);
......@@ -40,7 +47,7 @@ public final class Zugehoerigkeit implements Comparable<Zugehoerigkeit> {
public static Zugehoerigkeit of(double wert) {
if (wert < 0 || wert > 1) {
throw new IllegalArgumentException("Die Zugehörigkeit muss zwischen 0 und 1 liegen: " + wert);
throw new IllegalArgumentException("Die Zugehörigkeit muss zwischen 0.0 und 1.0 liegen: " + wert);
}
return new Zugehoerigkeit(wert);
}
......
......@@ -25,7 +25,7 @@
*/
/**
* Funktionsbibliothek Fuzzy.
* Fuzzy-Funktionen.
*
* <p><strong>Domainmodel der Fuzzyfizierung</strong></p>
* <p><img src="doc-files/fuzzyfizierung.png" alt="Fuzzyfizierung"></p>
......
......@@ -18,17 +18,15 @@
<data key="d4" xml:space="preserve"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="132.0" width="161.33333333333337" x="555.0" y="64.0"/>
<y:Geometry height="101.0" width="186.33333333333337" x="542.5" y="79.5"/>
<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="97.9072265625" x="31.713053385416686" xml:space="preserve" y="3.0">FuzzyVariable<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>
<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="97.9072265625" x="44.213053385416686" xml:space="preserve" y="3.0">FuzzyVariable<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>
<y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="false">
<y:AttributeLabel xml:space="preserve">name: String
terme: Term[]
termnamen(): String[]
gueltig: boolean
ungueltig: boolean</y:AttributeLabel>
<y:MethodLabel xml:space="preserve">term(name: String): Term</y:MethodLabel>
termnamen(): String[]</y:AttributeLabel>
<y:MethodLabel xml:space="preserve">gibTerm(name: String): Term</y:MethodLabel>
</y:UML>
</y:UMLClassNode>
</data>
......@@ -37,15 +35,13 @@ ungueltig: boolean</y:AttributeLabel>
<data key="d4" xml:space="preserve"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="99.0" width="147.0" x="562.1666666666667" y="266.0"/>
<y:Geometry height="70.0" width="195.0" x="538.1666666666667" y="266.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="39.1025390625" x="53.94873046875" xml:space="preserve" y="3.0">Term<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>
<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="39.1025390625" x="77.94873046875" xml:space="preserve" y="3.0">Term<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>
<y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="false">
<y:AttributeLabel xml:space="preserve">name: String
zugehoerigkeit: double
gueltig: boolean
ungueltig: boolean</y:AttributeLabel>
zugehoerigkeit: Zugehoerigkeit</y:AttributeLabel>
<y:MethodLabel xml:space="preserve"/>
</y:UML>
</y:UMLClassNode>
......@@ -83,7 +79,7 @@ t4: double</y:AttributeLabel>
wertebereich: Wertebereich
fuzzySets: FuzzySet[]
terme: String[]</y:AttributeLabel>
<y:MethodLabel xml:space="preserve">fuzzySet(name: String): FuzzySet
<y:MethodLabel xml:space="preserve">gibFuzzySet(name: String): FuzzySet
fuzzyfiziere(wert: double): FuzzyVariable
defuzzyfiziere(variable: FuzzyVariable): double</y:MethodLabel>
</y:UML>
......@@ -106,6 +102,21 @@ maximum: double</y:AttributeLabel>
</y:UMLClassNode>
</data>
</node>
<node id="n5">
<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: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>
<y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="false">
<y:AttributeLabel xml:space="preserve">wert: double</y:AttributeLabel>
<y:MethodLabel xml:space="preserve"/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<edge id="e0" source="n3" target="n2">
<data key="d8" xml:space="preserve"/>
<data key="d10">
......@@ -135,7 +146,7 @@ maximum: double</y:AttributeLabel>
<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="77.69921875" x="37.664398193359375" xml:space="preserve" y="-21.06640625">&lt;&lt;create&gt;&gt;<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="12.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: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="77.69921875" x="31.414398193359375" xml:space="preserve" y="-21.06640625">&lt;&lt;create&gt;&gt;<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="12.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>
......
<html>
<body>
<p>
Die SWE Funktionen Fuzzy wird als Softwarebibliothek ausgelegt, die von beliebigen anderen SWE eingebunden und
genutzt werden kann. Sie selbst hat keine externe Schnittstelle, keine Schnittstelle zum Datenverteiler und keine
Benutzerschnittstelle.
Funktionsbibliothek mit Fuzzy-Funktionen.
</p>
<p> Folgende Funktionen werden angeboten:</p>
<ul>
<li>Erstellen und Modifizieren von Fuzzy-Sets und linguistischen Variablen</li>
<li>Fuzzyfizierung von diskreten Zahlenwerten</li>
<li>Erstellen von Fuzzy-Sets und linguistischen Variablen</li>
<li>Fuzzyfizierung von scharfen Messwerten</li>
<li>Defuzzyfizierung von Fuzzy-Werten</li>
<li>Erstellen und Auswerten von Ausdrücken auf Basis von vordefinierten booleschen Operatoren und Fuzzy-Operatoren
</li>
<li>Ableiten von Wissen aus einer Regelbasis</li>
<li>Erstellen von Regeln und zusammenstellen von Regeln zu einer Wissensbasis</li>
<li>Ableiten von neuen Fuzzy-Werten mit Hilfe einer Wissensbasis</li>
</ul>
</body>
</html>
......@@ -38,7 +38,7 @@ public class FuzzySetTests {
@Test
public void konstruktor_Normalfall() {
FuzzySet fuzzySet = new FuzzySet("mittel", 25.0, 35.0, 75.0, 85.0);
FuzzySet fuzzySet = FuzzySet.trapez("mittel", 25.0, 35.0, 75.0, 85.0);
assertEquals("name", "mittel", fuzzySet.getName());
assertEquals("t1", 25.0, fuzzySet.getT1(), 0.001);
......@@ -52,7 +52,7 @@ public class FuzzySetTests {
exception.expect(NullPointerException.class);
exception.expectMessage("name");
new FuzzySet(null, 25.0, 35.0, 75.0, 85.0);
FuzzySet.trapez(null, 25.0, 35.0, 75.0, 85.0);
}
@Test
......@@ -60,7 +60,7 @@ public class FuzzySetTests {
exception.expect(IllegalArgumentException.class);
exception.expectMessage("Die vier Trapezecken müssen aufsteigend sortiert angegeben werden: 35.1, 35.0, 75.0, 85.0");
new FuzzySet("mittel", 35.1, 35.0, 75.0, 85.0);
FuzzySet.trapez("mittel", 35.1, 35.0, 75.0, 85.0);
}
@Test
......@@ -68,7 +68,7 @@ public class FuzzySetTests {
exception.expect(IllegalArgumentException.class);
exception.expectMessage("Die vier Trapezecken müssen aufsteigend sortiert angegeben werden: 25.0, 75.1, 75.0, 85.0");
new FuzzySet("mittel", 25.0, 75.1, 75.0, 85.0);
FuzzySet.trapez("mittel", 25.0, 75.1, 75.0, 85.0);
}
@Test
......@@ -76,12 +76,12 @@ public class FuzzySetTests {
exception.expect(IllegalArgumentException.class);
exception.expectMessage("Die vier Trapezecken müssen aufsteigend sortiert angegeben werden: 25.0, 35.0, 85.1, 85.0");
new FuzzySet("mittel", 25.0, 35.0, 85.1, 85.0);
FuzzySet.trapez("mittel", 25.0, 35.0, 85.1, 85.0);
}
@Test
public void formattierterText() {
FuzzySet fuzzySet = new FuzzySet("mittel", 25.0, 35.0, 75.0, 85.0);
FuzzySet fuzzySet = FuzzySet.trapez("mittel", 25.0, 35.0, 75.0, 85.0);
assertEquals("mittel: [25.0, 35.0, 75.0, 85.0]", fuzzySet.toString());
}
......
......@@ -76,7 +76,7 @@ public class FuzzyVariableTests {
public void term_NameIstRichtig_Treffer() {
FuzzyVariable geschwindigkeit = erzeugeFuzzyVariable();
Term niedrig = geschwindigkeit.term("niedrig");
Term niedrig = geschwindigkeit.gibTerm("niedrig");
assertEquals(erzeugeNiedrig(), niedrig);
}
......@@ -88,7 +88,7 @@ public class FuzzyVariableTests {
FuzzyVariable geschwindigkeit = erzeugeFuzzyVariable();
geschwindigkeit.term("langsam");
geschwindigkeit.gibTerm("langsam");
}
@Test
......@@ -97,7 +97,7 @@ public class FuzzyVariableTests {
exception.expectMessage("name");
FuzzyVariable geschwindigkeit = erzeugeFuzzyVariable();
geschwindigkeit.term(null);
geschwindigkeit.gibTerm(null);
}
@Test
......
......@@ -75,7 +75,7 @@ public class LinguistischeVariableTests {
public void fuzzySet_NameIstRichtig_Treffer() {
LinguistischeVariable geschwindigkeit = erzeugeLinguistischeVariable();
FuzzySet niedrig = geschwindigkeit.fuzzySet("niedrig");
FuzzySet niedrig = geschwindigkeit.gibFuzzySet("niedrig");
assertEquals(erzeugeNiedrig(), niedrig);
}
......@@ -87,7 +87,7 @@ public class LinguistischeVariableTests {
LinguistischeVariable geschwindigkeit = erzeugeLinguistischeVariable();
geschwindigkeit.fuzzySet("langsam");
geschwindigkeit.gibFuzzySet("langsam");
}
@Test
......@@ -96,7 +96,7 @@ public class LinguistischeVariableTests {
exception.expectMessage("name");
LinguistischeVariable geschwindigkeit = erzeugeLinguistischeVariable();
geschwindigkeit.fuzzySet(null);
geschwindigkeit.gibFuzzySet(null);
}
@Test
......@@ -196,15 +196,15 @@ public class LinguistischeVariableTests {
}
private static FuzzySet erzeugeNiedrig() {
return new FuzzySet("niedrig", 0.0, 0.0, 25.0, 35.0);
return FuzzySet.trapez("niedrig", 0.0, 0.0, 25.0, 35.0);
}
private static FuzzySet erzeugeMittel() {
return new FuzzySet("mittel", 25.0, 35.0, 75.0, 85.0);
return FuzzySet.trapez("mittel", 25.0, 35.0, 75.0, 85.0);
}
private static FuzzySet erzeugeHoch() {
return new FuzzySet("hoch", 75.0, 85.0, 254.0, 254.0);
return FuzzySet.trapez("hoch", 75.0, 85.0, 254.0, 254.0);
}
}
......@@ -56,7 +56,7 @@ public class ZugehoerigkeitTests {
@Test
public void konstruktor_ZugehoerigkeitKleiner0_Ausnahmefehler() {
exception.expect(IllegalArgumentException.class);
exception.expectMessage("Die Zugehörigkeit muss zwischen 0 und 1 liegen: -0.1");
exception.expectMessage("Die Zugehörigkeit muss zwischen 0.0 und 1.0 liegen: -0.1");
Zugehoerigkeit.of(-0.1);
}
......@@ -64,7 +64,7 @@ public class ZugehoerigkeitTests {
@Test
public void konstruktor_ZugehoerigkeitGroesser1_Ausnahmefehler() {
exception.expect(IllegalArgumentException.class);
exception.expectMessage("Die Zugehörigkeit muss zwischen 0 und 1 liegen: 1.1");
exception.expectMessage("Die Zugehörigkeit muss zwischen 0.0 und 1.0 liegen: 1.1");
Zugehoerigkeit.of(1.1);
}
......
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