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

Funktionen Fuzzy dokumentiert

parent 37834937
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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;
+5 −0
Original line number Diff line number Diff line
@@ -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;
+11 −0
Original line number Diff line number Diff line
@@ -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 {

    /**
+59 −9
Original line number Diff line number Diff line
@@ -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;
    }
+11 −1
Original line number Diff line number Diff line
@@ -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()))
Loading