Exemplo n.º 1
0
 /// <summary>
 /// Generates fuzzy set with specified membership function.
 /// </summary>
 /// <param name="cFunction">The membership function.</param>
 /// <param name="dFrom">The begin of interval.</param>
 /// <param name="dTo">The end of interval.</param>
 /// <param name="dStep">The step.</param>
 /// <returns>Builded fuzzy set.</returns>
 public FuzzySet Generate(SetMembershipFunction cFunction, double dFrom, double dTo, double dStep)
 {
     var cSet = new FuzzySet();
     for (double dIndex = dFrom; dIndex <= dTo; dIndex += dStep)
         cSet.Add(new FuzzyElement(dIndex, cFunction(dIndex)));
     return cSet;
 }
Exemplo n.º 2
0
        public double Solve()
        {
            // Aplicación de las reglas y cálculo del fuzzy set resultante
            FuzzySet res = new FuzzySet(Output.MinValue, Output.MaxValue);

            res.Add(Output.MinValue, 0);
            res.Add(Output.MaxValue, 0);

            foreach (FuzzyRule rule in Rules)
            {
                // Cálculo
                res = res | rule.Apply(Problem);
            }

            // Defuzzificación
            return(res.Centroid());
        }
Exemplo n.º 3
0
    public double Solve()
    {
        // Application des règles et calcul du fuzzy set résultant
        FuzzySet res = new FuzzySet(Output.MinValue, Output.MaxValue);

        res.Add(Output.MinValue, 0);
        res.Add(Output.MaxValue, 0);

        foreach (FuzzyRule rule in Rules)
        {
            // Calcul
            res = res | rule.Apply(Problem);
        }

        // Defuzzification
        return(res.Centroid());
    }
Exemplo n.º 4
0
    public static FuzzySet operator !(FuzzySet fs)
    {
        FuzzySet result = new FuzzySet(fs.Min, fs.Max);

        foreach (Point2D pt in fs.Points)
        {
            result.Add(new Point2D(pt.X, 1 - pt.Y));
        }
        return(result);
    }
Exemplo n.º 5
0
    public static FuzzySet operator *(FuzzySet fs, double value)
    {
        FuzzySet result = new FuzzySet(fs.Min, fs.Max);

        foreach (Point2D pt in fs.Points)
        {
            result.Add(new Point2D(pt.X, pt.Y * value));
        }
        return(result);
    }
Exemplo n.º 6
0
    private static FuzzySet Merge(FuzzySet fs1, FuzzySet fs2, Func <double, double, double> MergeFt)
    {
        // New Fuzzy set
        FuzzySet result = new FuzzySet(Math.Min(fs1.Min, fs2.Min), Math.Max(fs1.Max, fs2.Max));

        // Creation of iterators on lists + initialization
        List <Point2D> .Enumerator enum1 = fs1.Points.GetEnumerator();
        List <Point2D> .Enumerator enum2 = fs2.Points.GetEnumerator();
        enum1.MoveNext();
        enum2.MoveNext();
        Point2D oldPt1 = enum1.Current;

        // Relative positions of fuzzy sets (to know when they intersect)
        int relativePosition    = 0;
        int newRelativePosition = Math.Sign(enum1.Current.Y - enum2.Current.Y);

        // Loop while there are points in the two collections
        Boolean endOfList1 = false;
        Boolean endOfList2 = false;

        while (!endOfList1 && !endOfList2)
        {
            // New x values
            double x1 = enum1.Current.X;
            double x2 = enum2.Current.X;
            // New current position
            relativePosition    = newRelativePosition;
            newRelativePosition = Math.Sign(enum1.Current.Y - enum2.Current.Y);

            if (relativePosition != newRelativePosition && relativePosition != 0 && newRelativePosition != 0)
            {
                // Positions have changed, so we have to compute the intersection and add it
                // Compute the points coordinates
                double x      = (x1 == x2 ? oldPt1.X : Math.Min(x1, x2));
                double xPrime = Math.Max(x1, x2);
                // Intersection
                double slope1 = (fs1.DegreeAtValue(xPrime) - fs1.DegreeAtValue(x)) / (xPrime - x);
                double slope2 = (fs2.DegreeAtValue(xPrime) - fs2.DegreeAtValue(x)) / (xPrime - x);
                double delta  = (fs2.DegreeAtValue(x) - fs1.DegreeAtValue(x)) / (slope1 - slope2);
                // Add point
                result.Add(x + delta, fs1.DegreeAtValue(x + delta));
                // Go on
                if (x1 < x2)
                {
                    oldPt1     = enum1.Current;
                    endOfList1 = !(enum1.MoveNext());
                }
                else if (x1 > x2)
                {
                    endOfList2 = !(enum2.MoveNext());
                }
            }
            else if (x1 == x2)
            {
                // The two points are on the same X, so we take the good value (eg min or max)
                result.Add(x1, MergeFt(enum1.Current.Y, enum2.Current.Y));
                oldPt1     = enum1.Current;
                endOfList1 = !(enum1.MoveNext());
                endOfList2 = !(enum2.MoveNext());
            }
            else if (x1 < x2)
            {
                // Fs1 point is first, we add the value (eg min or max) between the enum1 point and the degree for fs2
                result.Add(x1, MergeFt(enum1.Current.Y, fs2.DegreeAtValue(x1)));
                oldPt1     = enum1.Current;
                endOfList1 = !(enum1.MoveNext());
            }
            else
            {
                // This time, it's fs2 first
                result.Add(x2, MergeFt(fs1.DegreeAtValue(x2), enum2.Current.Y));
                endOfList2 = !(enum2.MoveNext());
            }
        }

        // Add end points
        if (!endOfList1)
        {
            while (!endOfList1)
            {
                result.Add(enum1.Current.X, MergeFt(0, enum1.Current.Y));
                endOfList1 = !enum1.MoveNext();
            }
        }
        else if (!endOfList2)
        {
            while (!endOfList2)
            {
                result.Add(enum2.Current.X, MergeFt(0, enum2.Current.Y));
                endOfList2 = !enum2.MoveNext();
            }
        }

        return(result);
    }