internal void Defuzzify_WithTwoTriangles_ReturnsExpectedResult() { // Arrange var fuzzySet1 = new FuzzySet("left", TriangularFunction.Create(1, 2, 3)); var fuzzySet2 = new FuzzySet("right", TriangularFunction.Create(3, 4, 5)); var fuzzyOutput = new List <FuzzyOutput> { new FuzzyOutput( Label.Create("Balance"), fuzzySet1, UnitInterval.One()), new FuzzyOutput( Label.Create("Balance"), fuzzySet2, UnitInterval.One()) }; var centroidDefuzzifier = new CentroidDefuzzifier(); // Act var result = centroidDefuzzifier.Defuzzify(fuzzyOutput); // Assert Assert.Equal("Balance", result.Subject.Value); Assert.Equal(3, result.Value); }
private void Initialize(List <Variable> variables, List <String> roles) { _fuzzyDB = new Database(); foreach (var variable in variables) { _fuzzyDB.AddVariable(variable.FVariable); if (variable.Type == JConfig.VariableType.Ouput) { _outputName = variable.FVariable.Name; } } _centroidDefuzzifier = new CentroidDefuzzifier(1000); _system = new InferenceSystem(_fuzzyDB, _centroidDefuzzifier); foreach (var variable in variables) { if (variable.Type == JConfig.VariableType.Input) { _system.SetInput(variable.Name, (float)variable.ResultValue); } } int roleCounter = 0; foreach (var role in roles) { _system.NewRule("Role " + roleCounter++, role); } }
internal void Defuzzify_WithTriangle_ReturnsExpectedResult() { // Arrange var fuzzySet = new FuzzySet("centre", TriangularFunction.Create(-1, 0, 1)); var fuzzyOutput = new List <FuzzyOutput> { new FuzzyOutput( Label.Create("Balance"), fuzzySet, UnitInterval.Create(0.5)) }; var centroidDefuzzifier = new CentroidDefuzzifier(); // Act var result = centroidDefuzzifier.Defuzzify(fuzzyOutput); // Assert Assert.Equal("Balance", result.Subject.Value); Assert.Equal(0, result.Value); }
internal void Defuzzify_WhenSubjectsUnrelated_Throws() { // Arrange var fuzzySet = new FuzzySet("centre", TriangularFunction.Create(-1, 0, 1)); var fuzzyOutput = new List <FuzzyOutput> { new FuzzyOutput( Label.Create("Subject1"), fuzzySet, UnitInterval.One()), new FuzzyOutput( Label.Create("Subject2"), fuzzySet, UnitInterval.One()) }; var centroidDefuzzifier = new CentroidDefuzzifier(); // Act // Assert Assert.Throws <InvalidOperationException>(() => centroidDefuzzifier.Defuzzify(fuzzyOutput)); }
internal void RunMamdaniInference(double foodInput, double serviceInput, double expected) { // Define the input and output linguistic variables. var foodQuality = new LinguisticVariable( InputVariable.FoodQuality, new List <FuzzySet> { new FuzzySet(FoodQuality.Poor, TrapezoidalFunction.CreateWithLeftEdge(0, 5)), new FuzzySet(FoodQuality.Average, TriangularFunction.Create(0, 5, 10)), new FuzzySet(FoodQuality.Good, TrapezoidalFunction.CreateWithRightEdge(5, 10)) }); var serviceQuality = new LinguisticVariable( InputVariable.FoodQuality, new List <FuzzySet> { new FuzzySet(ServiceQuality.Poor, TrapezoidalFunction.CreateWithLeftEdge(0, 5)), new FuzzySet(ServiceQuality.Average, TriangularFunction.Create(0, 5, 10)), new FuzzySet(ServiceQuality.Good, TrapezoidalFunction.CreateWithRightEdge(5, 10)) }); var tipAmount = new LinguisticVariable( OutputVariable.TipAmount, new List <FuzzySet> { new FuzzySet(TipAmount.Low, TrapezoidalFunction.CreateWithLeftEdge(0, 13)), new FuzzySet(TipAmount.Medium, TriangularFunction.Create(0, 13, 25)), new FuzzySet(TipAmount.High, TrapezoidalFunction.CreateWithRightEdge(13, 25)) }); // Define the rules for the fuzzy inference engine. var rule1 = new FuzzyRuleBuilder(TippingProblem.Rule1) .If(foodQuality.Is(FoodQuality.Poor)) .Or(serviceQuality.Is(ServiceQuality.Poor)) .Then(tipAmount.Is(TipAmount.Low)) .Build(); var rule2 = new FuzzyRuleBuilder(TippingProblem.Rule2) .If(serviceQuality.Is(ServiceQuality.Average)) .Then(tipAmount.Is(TipAmount.Medium)) .Build(); var rule3 = new FuzzyRuleBuilder(TippingProblem.Rule3) .If(foodQuality.Is(FoodQuality.Good)) .Or(serviceQuality.Is(ServiceQuality.Good)) .Then(tipAmount.Is(TipAmount.High)) .Build(); // Construct the fuzzy inference engine. var tnorm = TriangularNormFactory.MinimumTNorm(); var tconorm = TriangularConormFactory.MaximumTConorm(); var defuzzifier = new CentroidDefuzzifier(); var fuzzyEngine = new MamdaniInferenceEngine(tnorm, tconorm, defuzzifier); // Add the rules to the rulebase. fuzzyEngine.Rulebase.AddRule(rule1); fuzzyEngine.Rulebase.AddRule(rule2); fuzzyEngine.Rulebase.AddRule(rule3); // Prepare database to receive inputs. fuzzyEngine.Database.AddVariable(Label.Create(InputVariable.FoodQuality)); fuzzyEngine.Database.AddVariable(Label.Create(InputVariable.ServiceQuality)); // Generate input data. var foodData = new DataPoint(InputVariable.FoodQuality, foodInput); var serviceData = new DataPoint(InputVariable.ServiceQuality, serviceInput); // Feed inference engine the data. fuzzyEngine.Database.UpdateData(foodData); fuzzyEngine.Database.UpdateData(serviceData); // Compute the inference engine. var result = fuzzyEngine.Compute(); Assert.Equal(OutputVariable.TipAmount.ToString(), result[0].Subject.Value); Assert.Equal(expected, result[0].Value); }