Example #1
0
        /// <summary>
        /// Centroid method to obtain the numerical representation of a fuzzy output. The numerical
        /// value will be the center of the shape formed by the several fuzzy labels with their
        /// constraints.
        /// </summary>
        /// 
        /// <param name="fuzzyOutput">A <see cref="FuzzyOutput"/> containing the output of several
        /// rules of a Fuzzy Inference System.</param>
        /// <param name="normOperator">A <see cref="INorm"/> operator to be used when constraining
        /// the label to the firing strength.</param>
        /// 
        /// <returns>The numerical representation of the fuzzy output.</returns>
        /// 
        /// <exception cref="Exception">The numerical output is unavaliable. All memberships are zero.</exception>
        /// 
        public float Defuzzify( FuzzyOutput fuzzyOutput, INorm normOperator )
        {
            // results and accumulators
            float weightSum = 0, membershipSum = 0;

            // speech universe
            float start = fuzzyOutput.OutputVariable.Start;
            float end = fuzzyOutput.OutputVariable.End;

            // increment
            float increment = ( end - start ) / this.intervals;

            // running through the speech universe and evaluating the labels at each point
            for ( float x = start; x < end; x += increment )
            {
                // we must evaluate x membership to each one of the output labels
                foreach ( FuzzyOutput.OutputConstraint oc in fuzzyOutput.OutputList )
                {
                    // getting the membership for X and constraining it with the firing strength
                    float membership = fuzzyOutput.OutputVariable.GetLabelMembership( oc.Label, x );
                    float constrainedMembership = normOperator.Evaluate( membership, oc.FiringStrength );

                    weightSum += x * constrainedMembership;
                    membershipSum += constrainedMembership;
                }
            }

            // if no membership was found, then the membershipSum is zero and the numerical output is unknown.
            if ( membershipSum == 0 )
                throw new Exception( "The numerical output in unavaliable. All memberships are zero." );

            return weightSum / membershipSum;
        }
Example #2
0
            public double Defuzzify(FuzzyOutput fuzzyOutput, INorm normOperator)
            {
                // results and accumulators
                double weightSum = 0, membershipSum = 0;
                // speech universe
                double start = fuzzyOutput.OutputVariable.Start;
                double end   = fuzzyOutput.OutputVariable.End;

                // increment
                double increment = (end - start) / intervals;

                // running through the speech universe and evaluating the labels at each point
                for (double x = start; x < end; x += increment)
                {
                    // we must evaluate x membership to each one of the output labels
                    foreach (FuzzyOutput.OutputConstraint oc in fuzzyOutput.OutputList)
                    {
                        // getting the membership for X and constraining it with the firing strength
                        double membership            = fuzzyOutput.OutputVariable.GetLabelMembership(oc.Label, x);
                        double constrainedMembership = normOperator.Evaluate(membership, oc.FiringStrength);


                        weightSum     += x * constrainedMembership;
                        membershipSum += constrainedMembership;
                    }
                }
                // if no membership was found, then the membershipSum is zero and the numerical output is unknown.
                if (membershipSum == 0)
                {
                    return(0);
                }
                return(weightSum / membershipSum);
            }
Example #3
0
 private void SetSystemOutput(FuzzyOutput fuzzyOutput)
 {
     if (fuzzyOutput.OutputList.Count != 0)
     {
         _systemOutputValue      = _centroidDefuzzifier.Defuzzify(fuzzyOutput, new MinimumNorm());
         _systemOutputPercentage = fuzzyOutput.OutputList.Max(x => x.FiringStrength);
         _systenOutputName       = fuzzyOutput.OutputList.First(x => x.FiringStrength == _systemOutputPercentage).Label;
     }
     else
     {
         _systemOutputValue      = float.NaN;
         _systenOutputName       = "STOP";
         _systemOutputPercentage = 1;
     }
 }
Example #4
0
        private Dictionary <string, float> GetOutput()
        {
            Dictionary <string, float> output = new Dictionary <string, float>();

            FuzzyOutput fuzzyOutput = _system.ExecuteInference(_outputName);

            foreach (var oc in fuzzyOutput.OutputList)
            {
                if (!output.ContainsKey(oc.Label))
                {
                    output.Add(oc.Label, oc.FiringStrength);
                }
                else if (output[oc.Label] < oc.FiringStrength)
                {
                    output[oc.Label] = oc.FiringStrength;
                }
            }
            SetSystemOutput(fuzzyOutput);

            return(output);
        }
Example #5
0
        /// <summary>
        /// Executes the fuzzy inference, obtaining the <see cref="FuzzyOutput"/> of the system for the required
        /// <see cref="LinguisticVariable"/>. 
        /// </summary>
        /// 
        /// <param name="variableName">Name of the <see cref="LinguisticVariable"/> to evaluate.</param>
        /// 
        /// <returns>A <see cref="FuzzyOutput"/> containing the fuzzy output of the system for the
        /// <see cref="LinguisticVariable"/> specified in <paramref name="variableName"/>.</returns>
        /// 
        /// <exception cref="KeyNotFoundException">The variable indicated was not found in the database.</exception>
        /// 
        public FuzzyOutput ExecuteInference( string variableName )
        {
            // gets the variable
            LinguisticVariable lingVar = database.GetVariable( variableName );

            // object to store the fuzzy output
            FuzzyOutput fuzzyOutput = new FuzzyOutput( lingVar );

            // select only rules with the variable as output
            Rule[] rules = rulebase.GetRules( );
            foreach ( Rule r in rules )
            {
                if ( r.Output.Variable.Name == variableName )
                {
                    string labelName = r.Output.Label.Name;
                    float firingStrength = r.EvaluateFiringStrength( );
                    if ( firingStrength > 0 )
                        fuzzyOutput.AddOutput( labelName, firingStrength );
                }
            }

            // returns the fuzzy output obtained
            return fuzzyOutput;
        }