Exemplo n.º 1
0
        internal void Evaluate_WithThreeGroupCompoundStatementAndOtherFunctions_ReturnsExpectedResult()
        {
            // Arrange
            var tnorm   = TriangularNormFactory.Lukasiewicz();
            var tconorm = TriangularConormFactory.ProbabilisticSum();

            var evaluator = new FuzzyEvaluator(tnorm, tconorm);

            var evaluations = new List <Evaluation>
            {
                // Statement group 1
                new Evaluation(LogicOperators.If(), UnitInterval.Create(0.25)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.0)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.2)),

                // Statement group 2
                new Evaluation(LogicOperators.Or(), UnitInterval.Create(1)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.9)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.8)),

                // Statement group 3
                new Evaluation(LogicOperators.Or(), UnitInterval.Create(0.5)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(1)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(1))
            };

            // Act
            var result = evaluator.Evaluate(evaluations);

            // Assert
            Assert.Equal(0.85, Math.Round(result.Value, 2));
        }
Exemplo n.º 2
0
        public void computeAtom()
        {
            string    testString = "23.5";
            Tokenizer tokened    = Tokenizer.tokenize(testString);

            Assert.AreEqual(23.5, FuzzyEvaluator.computeAtom(tokened, FuzzyOperator.MinMax));
        }
Exemplo n.º 3
0
        internal void Evaluate_WithFourGroupCompoundStatementThenConnectedByMultipleOrs_ReturnsExpectedResult()
        {
            // Arrange
            var evaluator = new FuzzyEvaluator();

            var evaluations = new List <Evaluation>
            {
                // Statement group 1 (assumed to evaluate to 0.9).
                new Evaluation(LogicOperators.If(), UnitInterval.Create(1)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(1)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.9)),

                // Statement group 2 (assumed to evaluate to 0.8).
                new Evaluation(LogicOperators.Or(), UnitInterval.Create(1)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.9)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.8)),

                // Statement group 3 (assumed to evaluate to 0.7).
                new Evaluation(LogicOperators.Or(), UnitInterval.Create(0.7)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.7)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.7)),

                // Then multiple or connectives (assumed to evaluate to 1).
                new Evaluation(LogicOperators.Or(), UnitInterval.Create(0.8)),
                new Evaluation(LogicOperators.Or(), UnitInterval.Create(0.9)),
                new Evaluation(LogicOperators.Or(), UnitInterval.Create(1))
            };

            // Act
            var result = evaluator.Evaluate(evaluations);

            // Assert
            Assert.Equal(UnitInterval.Create(1), result);
        }
Exemplo n.º 4
0
        internal void Evaluate_WithThreeGroupCompoundStatementAndEinsteinFunctions_ReturnsExpectedResult()
        {
            // Arrange
            var tnorm   = TriangularNormFactory.EinsteinProduct();
            var tconorm = TriangularConormFactory.EinsteinSum();

            var evaluator = new FuzzyEvaluator(tnorm, tconorm);

            var evaluations = new List <Evaluation>
            {
                // Statement group 1
                new Evaluation(LogicOperators.If(), UnitInterval.Create(0.25)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.0)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.2)),

                // Statement group 2
                new Evaluation(LogicOperators.Or(), UnitInterval.Create(1)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.9)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.8)),

                // Statement group 3
                new Evaluation(LogicOperators.Or(), UnitInterval.Create(0.5)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(1)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(1))
            };

            // Act
            var result = evaluator.Evaluate(evaluations);

            // Assert
            Assert.Equal(0.891304347826087, result.Value);
        }
Exemplo n.º 5
0
        internal void Evaluate_WithThreeGroupCompoundStatement_ReturnsExpectedResult()
        {
            // Arrange
            var evaluator = new FuzzyEvaluator();

            var evaluations = new List <Evaluation>
            {
                // Statement group 1 (assumed to evaluate to 0).
                new Evaluation(LogicOperators.If(), UnitInterval.Create(0.25)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.0)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.2)),

                // Statement group 2 (assumed to evaluate to 0.8).
                new Evaluation(LogicOperators.Or(), UnitInterval.Create(1)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.9)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(0.8)),

                // Statement group 3 (assumed to evaluate to 0.9).
                new Evaluation(LogicOperators.Or(), UnitInterval.Create(0.9)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(1)),
                new Evaluation(LogicOperators.And(), UnitInterval.Create(1))
            };

            // Act
            var result = evaluator.Evaluate(evaluations);

            // Assert
            Assert.Equal(UnitInterval.Create(0.9), result);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Evaluates the fuzzy condition.
        /// </summary>
        /// <param name="data">
        /// The data.
        /// </param>
        /// <param name="evaluator">
        /// The evaluator.
        /// </param>
        /// <returns>
        /// A <see cref="double"/>.
        /// </returns>
        /// <exception cref="ArgumentException">
        /// Throws if provided data does not contain all subjects.
        /// </exception>
        public Evaluation Evaluate(
            IReadOnlyDictionary <Label, DataPoint> data,
            FuzzyEvaluator evaluator)
        {
            Validate.NotNull(data, nameof(data));
            Validate.NotNull(evaluator, nameof(evaluator));

            var evaluations = new List <Evaluation>();

            foreach (var premise in this.Premises)
            {
                if (data.ContainsKey(premise.Subject))
                {
                    var input = data[premise.Subject];

                    evaluations.Add(premise.Evaluate(input));
                }
                else
                {
                    throw new InvalidOperationException(
                              $"Evaluation Failed (cannot evaluate premise '{premise.Subject}' with provided data).");
                }
            }

            return(new Evaluation(this.Connective, UnitInterval.Create(evaluator.Evaluate(evaluations) * this.Weight)));
        }
Exemplo n.º 7
0
        public void Apply(List <LinguisticVariable> LingVars)
        {
            string    numericRule = this.numericRule(LingVars);
            Tokenizer ruleTokens  = Tokenizer.tokenize(numericRule);

            this.membershipValue.fuzzy = FuzzyEvaluator.computeExpr(ruleTokens, 1, this.fOperator, false);
        }
Exemplo n.º 8
0
        public void computeExpr()
        {
            string    testString = "not 23.5 or ( 3.5 and 0.004 ) and ( 32 or ( 0.3 and 0.012 ) )";
            Tokenizer tokened    = Tokenizer.tokenize(testString);
            double    result     = FuzzyEvaluator.computeExpr(tokened, 1, FuzzyOperator.Probabilistic, false);

            Debug.Log("[Fuzzy Evaluator Calculation Test Result] \n" +
                      testString + " = " + result);
        }
Exemplo n.º 9
0
        internal void And_WhenFunctionsDefault_ReturnsExpectedResult()
        {
            // Arrange
            var evaluator = new FuzzyEvaluator();

            var membershipA = UnitInterval.Create(0.25);
            var membershipB = UnitInterval.Create(0.5);

            // Act
            var result = evaluator.And(membershipA, membershipB);

            // Assert
            Assert.Equal(UnitInterval.Create(0.25), result);
        }
Exemplo n.º 10
0
        /// <summary>
        /// Returns the evaluation of all fuzzy rules in the <see cref="Rulebase"/>.
        /// </summary>
        /// <param name="rules">
        /// The fuzzy rules.
        /// </param>
        /// <param name="data">
        /// The data.
        /// </param>
        /// <param name="evaluator">
        /// The evaluator.
        /// </param>
        /// <returns>
        /// A <see cref="IList{T}"/>.
        /// </returns>
        protected static IList <FuzzyOutput> EvaluateRules(
            IEnumerable <FuzzyRule> rules,
            IReadOnlyDictionary <Label, DataPoint> data,
            FuzzyEvaluator evaluator)
        {
            var fuzzyOutputs = new List <FuzzyOutput>();

            foreach (var rule in rules)
            {
                var ruleOutputs = rule.Evaluate(data, evaluator);

                ruleOutputs.ForEach(o => fuzzyOutputs.Add(o));
            }

            return(fuzzyOutputs);
        }
Exemplo n.º 11
0
        internal void Evaluate_WithTwoEvaluationsOrConnective_ReturnsExpectedResult()
        {
            // Arrange
            var evaluator = new FuzzyEvaluator();

            var evaluations = new List <Evaluation>
            {
                new Evaluation(LogicOperators.If(), UnitInterval.Create(0.25)),
                new Evaluation(LogicOperators.Or(), UnitInterval.Create(1))
            };

            // Act
            var result = evaluator.Evaluate(evaluations);

            // Assert
            Assert.Equal(UnitInterval.Create(1), result);
        }
Exemplo n.º 12
0
        internal void Or_WhenFunctionsDefault_ReturnsExpectedResult()
        {
            // Arrange
            var tNorm   = TriangularNormFactory.MinimumTNorm();
            var tConorm = TriangularConormFactory.MaximumTConorm();

            var evaluator = new FuzzyEvaluator(tNorm, tConorm);

            var membershipA = UnitInterval.Create(0.25);
            var membershipB = UnitInterval.Create(0.5);

            // Act
            var result = evaluator.Or(membershipA, membershipB);

            // Assert
            Assert.Equal(UnitInterval.Create(0.5), result);
        }