From e83f51f952f237b3b930a464972e05f3979850e1 Mon Sep 17 00:00:00 2001 From: Ahmed Zamil Date: Sun, 30 Oct 2022 18:43:45 +0300 Subject: [PATCH] Fuzzy --- Esiur.Analysis/Fuzzy/ContinuousSet.cs | 4 ++-- Esiur.Analysis/Fuzzy/DiscreteSet.cs | 18 +++++++++++++++++- Esiur.Analysis/Fuzzy/MamdaniDefuzzifier.cs | 16 +++++++++++++--- Esiur.Analysis/Fuzzy/OperationSet.cs | 6 +++--- Test/Program.cs | 20 +++++++++++--------- 5 files changed, 46 insertions(+), 18 deletions(-) diff --git a/Esiur.Analysis/Fuzzy/ContinuousSet.cs b/Esiur.Analysis/Fuzzy/ContinuousSet.cs index 276e976..28800d6 100644 --- a/Esiur.Analysis/Fuzzy/ContinuousSet.cs +++ b/Esiur.Analysis/Fuzzy/ContinuousSet.cs @@ -9,7 +9,7 @@ namespace Esiur.Analysis.Fuzzy { public MembershipFunction Function { get; set; } - public double AlphaCut { get; set; } = double.MinValue; + public double AlphaCut { get; set; } = double.MaxValue; @@ -35,7 +35,7 @@ namespace Esiur.Analysis.Fuzzy var results = Function(input); - return results < AlphaCut ? 0 : results; + return results > AlphaCut ? AlphaCut : results; } } diff --git a/Esiur.Analysis/Fuzzy/DiscreteSet.cs b/Esiur.Analysis/Fuzzy/DiscreteSet.cs index 358f172..91d7f87 100644 --- a/Esiur.Analysis/Fuzzy/DiscreteSet.cs +++ b/Esiur.Analysis/Fuzzy/DiscreteSet.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; @@ -48,12 +49,26 @@ namespace Esiur.Analysis.Fuzzy public KeyValuePair[] Maximas { - get { + get + { var max = vector.Values.Max(); return vector.Where(x => x.Value == max).ToArray(); } } + + public double Integral(double from, double to) + { + return vector.Where(x => x.Key >= from && x.Key <= to).Sum(x => x.Value); + } + + public double Centroid(double from, double to) + { + var r = vector.Where(x => x.Key >= from && x.Key <= to).ToArray(); + + return r.Sum(x => x.Key * x.Value ) / r.Sum(x=>x.Value); + } + public KeyValuePair[] Minimas { get @@ -63,5 +78,6 @@ namespace Esiur.Analysis.Fuzzy } } + } } diff --git a/Esiur.Analysis/Fuzzy/MamdaniDefuzzifier.cs b/Esiur.Analysis/Fuzzy/MamdaniDefuzzifier.cs index 9e2bc65..7a83df9 100644 --- a/Esiur.Analysis/Fuzzy/MamdaniDefuzzifier.cs +++ b/Esiur.Analysis/Fuzzy/MamdaniDefuzzifier.cs @@ -10,7 +10,6 @@ namespace Esiur.Analysis.Fuzzy CenterOfGravity, FirstMaxima, LastMaxima, - Bisector, MeanOfMaxima, } public class MamdaniDefuzzifier @@ -21,9 +20,20 @@ namespace Esiur.Analysis.Fuzzy var union = sets.FuzzyUnion(); var output = union.ToDiscrete(from, to, step); - var max = output.Maximas; - return max[0].Key; + if (method == MamdaniDefuzzifierMethod.CenterOfGravity) + return output.Centroid(from, to); + else if (method == MamdaniDefuzzifierMethod.FirstMaxima) + return output.Maximas.First().Key; + else if (method == MamdaniDefuzzifierMethod.LastMaxima) + return output.Maximas.Last().Key; + else if (method == MamdaniDefuzzifierMethod.MeanOfMaxima) + { + var max = output.Maximas; + return max.First().Key + ((max.Last().Key - max.First().Key) / 2); + } + else + throw new Exception("Unknown method"); } } diff --git a/Esiur.Analysis/Fuzzy/OperationSet.cs b/Esiur.Analysis/Fuzzy/OperationSet.cs index f207339..4ed81a8 100644 --- a/Esiur.Analysis/Fuzzy/OperationSet.cs +++ b/Esiur.Analysis/Fuzzy/OperationSet.cs @@ -19,7 +19,7 @@ namespace Esiur.Analysis.Fuzzy public INumericalSet[] Sets { get; internal set; } - public double AlphaCut { get; set; } + public double AlphaCut { get; set; } = double.MaxValue; public double this[double index] { @@ -32,7 +32,7 @@ namespace Esiur.Analysis.Fuzzy x = Sets.Min(x => x[index]); // Alpha might be changed for this instance - return x < AlphaCut ? 0 : x; + return x > AlphaCut ? AlphaCut : x; } } @@ -42,7 +42,7 @@ namespace Esiur.Analysis.Fuzzy if (operation == Operation.Intersection) AlphaCut = sets.Min(x => x.AlphaCut); - else if (Operation == Operation.Union) + else if (operation == Operation.Union) AlphaCut = sets.Max(x => x.AlphaCut); Operation = operation; diff --git a/Test/Program.cs b/Test/Program.cs index bff75be..b4343d3 100644 --- a/Test/Program.cs +++ b/Test/Program.cs @@ -83,23 +83,25 @@ namespace Test var excelent = new ContinuousSet(MembershipFunctions.Ascending(70, 100)); var small = new ContinuousSet(MembershipFunctions.Descending(100, 200)); - var avg = new ContinuousSet(MembershipFunctions.Triangular(150, 200, 250)); + var avg = new ContinuousSet(MembershipFunctions.Triangular(100, 200, 300)); var big = new ContinuousSet(MembershipFunctions.Ascending(200, 300)); //var speedIsLowThenSmall = new FuzzyRule("Low=>Small", low, small); - double temp = 34; - double rating = 70; + double rating = 80; - var v = MamdaniDefuzzifier.Evaluate(new INumericalSet[] + for (double temp = 60; temp < 100; temp++) { - temp.Is(low).Or(rating.Is(bad)).Then(small), - temp.Is(mid).Or(rating.Is(ok)).Then(avg), - temp.Is(high).Or(rating.Is(excelent)).Then(big), - }, MamdaniDefuzzifierMethod.FirstMaxima, 0, 600, 1); + var v = MamdaniDefuzzifier.Evaluate(new INumericalSet[] + { + temp.Is(low).And(rating.Is(bad)).Then(small), + temp.Is(mid).And(rating.Is(ok)).Then(avg), + temp.Is(high).And(rating.Is(excelent)).Then(big), + }, MamdaniDefuzzifierMethod.CenterOfGravity, 100, 300, 1); - Console.WriteLine(v); + Console.WriteLine(temp + " " + v); + } // Create stores to keep objects. var system = await Warehouse.Put("sys", new MemoryStore());