mirror of
https://github.com/esiur/esiur-dotnet.git
synced 2025-06-27 13:33:13 +00:00
Fuzzy
This commit is contained in:
@ -9,7 +9,7 @@ namespace Esiur.Analysis.Fuzzy
|
|||||||
{
|
{
|
||||||
public MembershipFunction Function { get; set; }
|
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);
|
var results = Function(input);
|
||||||
|
|
||||||
return results < AlphaCut ? 0 : results;
|
return results > AlphaCut ? AlphaCut : results;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
@ -48,12 +49,26 @@ namespace Esiur.Analysis.Fuzzy
|
|||||||
|
|
||||||
public KeyValuePair<double, double>[] Maximas
|
public KeyValuePair<double, double>[] Maximas
|
||||||
{
|
{
|
||||||
get {
|
get
|
||||||
|
{
|
||||||
var max = vector.Values.Max();
|
var max = vector.Values.Max();
|
||||||
return vector.Where(x => x.Value == max).ToArray();
|
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<double, double>[] Minimas
|
public KeyValuePair<double, double>[] Minimas
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@ -63,5 +78,6 @@ namespace Esiur.Analysis.Fuzzy
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,6 @@ namespace Esiur.Analysis.Fuzzy
|
|||||||
CenterOfGravity,
|
CenterOfGravity,
|
||||||
FirstMaxima,
|
FirstMaxima,
|
||||||
LastMaxima,
|
LastMaxima,
|
||||||
Bisector,
|
|
||||||
MeanOfMaxima,
|
MeanOfMaxima,
|
||||||
}
|
}
|
||||||
public class MamdaniDefuzzifier
|
public class MamdaniDefuzzifier
|
||||||
@ -21,9 +20,20 @@ namespace Esiur.Analysis.Fuzzy
|
|||||||
|
|
||||||
var union = sets.FuzzyUnion();
|
var union = sets.FuzzyUnion();
|
||||||
var output = union.ToDiscrete(from, to, step);
|
var output = union.ToDiscrete(from, to, step);
|
||||||
|
|
||||||
|
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;
|
var max = output.Maximas;
|
||||||
return max[0].Key;
|
return max.First().Key + ((max.Last().Key - max.First().Key) / 2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw new Exception("Unknown method");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ namespace Esiur.Analysis.Fuzzy
|
|||||||
|
|
||||||
public INumericalSet<double>[] Sets { get; internal set; }
|
public INumericalSet<double>[] Sets { get; internal set; }
|
||||||
|
|
||||||
public double AlphaCut { get; set; }
|
public double AlphaCut { get; set; } = double.MaxValue;
|
||||||
|
|
||||||
public double this[double index]
|
public double this[double index]
|
||||||
{
|
{
|
||||||
@ -32,7 +32,7 @@ namespace Esiur.Analysis.Fuzzy
|
|||||||
x = Sets.Min(x => x[index]);
|
x = Sets.Min(x => x[index]);
|
||||||
|
|
||||||
// Alpha might be changed for this instance
|
// 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)
|
if (operation == Operation.Intersection)
|
||||||
AlphaCut = sets.Min(x => x.AlphaCut);
|
AlphaCut = sets.Min(x => x.AlphaCut);
|
||||||
else if (Operation == Operation.Union)
|
else if (operation == Operation.Union)
|
||||||
AlphaCut = sets.Max(x => x.AlphaCut);
|
AlphaCut = sets.Max(x => x.AlphaCut);
|
||||||
|
|
||||||
Operation = operation;
|
Operation = operation;
|
||||||
|
@ -83,23 +83,25 @@ namespace Test
|
|||||||
var excelent = new ContinuousSet(MembershipFunctions.Ascending(70, 100));
|
var excelent = new ContinuousSet(MembershipFunctions.Ascending(70, 100));
|
||||||
|
|
||||||
var small = new ContinuousSet(MembershipFunctions.Descending(100, 200));
|
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 big = new ContinuousSet(MembershipFunctions.Ascending(200, 300));
|
||||||
|
|
||||||
//var speedIsLowThenSmall = new FuzzyRule("Low=>Small", low, small);
|
//var speedIsLowThenSmall = new FuzzyRule("Low=>Small", low, small);
|
||||||
|
|
||||||
double temp = 34;
|
double rating = 80;
|
||||||
double rating = 70;
|
|
||||||
|
|
||||||
|
for (double temp = 60; temp < 100; temp++)
|
||||||
|
{
|
||||||
var v = MamdaniDefuzzifier.Evaluate(new INumericalSet<double>[]
|
var v = MamdaniDefuzzifier.Evaluate(new INumericalSet<double>[]
|
||||||
{
|
{
|
||||||
temp.Is(low).Or(rating.Is(bad)).Then(small),
|
temp.Is(low).And(rating.Is(bad)).Then(small),
|
||||||
temp.Is(mid).Or(rating.Is(ok)).Then(avg),
|
temp.Is(mid).And(rating.Is(ok)).Then(avg),
|
||||||
temp.Is(high).Or(rating.Is(excelent)).Then(big),
|
temp.Is(high).And(rating.Is(excelent)).Then(big),
|
||||||
}, MamdaniDefuzzifierMethod.FirstMaxima, 0, 600, 1);
|
}, MamdaniDefuzzifierMethod.CenterOfGravity, 100, 300, 1);
|
||||||
|
|
||||||
|
|
||||||
Console.WriteLine(v);
|
Console.WriteLine(temp + " " + v);
|
||||||
|
}
|
||||||
|
|
||||||
// Create stores to keep objects.
|
// Create stores to keep objects.
|
||||||
var system = await Warehouse.Put("sys", new MemoryStore());
|
var system = await Warehouse.Put("sys", new MemoryStore());
|
||||||
|
Reference in New Issue
Block a user