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);
        }
Esempio n. 2
0
        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));
        }
Esempio n. 5
0
        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);
        }