コード例 #1
0
            private void Defuzzify()
            {
                Dictionary <FuzzyContext.Variable, List <KeyValuePair <FuzzySet, FuzzyValue> > > setsByVariable = new Dictionary <FuzzyContext.Variable, List <KeyValuePair <FuzzySet, FuzzyValue> > >();

                foreach (var setKv in context.inferedResult.GetSets())
                {
                    if (!setsByVariable.ContainsKey(setKv.Key.GetVariable()))
                    {
                        setsByVariable.Add(setKv.Key.GetVariable(), new List <KeyValuePair <FuzzySet, FuzzyValue> >());
                    }
                    setsByVariable[setKv.Key.GetVariable()].Add(setKv);
                }

                foreach (var varKV in setsByVariable)
                {
                    FuzzyContext.Variable variable = varKV.Key;
                    float min = float.MaxValue;
                    float max = float.MinValue;
                    foreach (var setKv in varKV.Value)
                    {
                        min = Mathf.Min(min, setKv.Key.GetMembershipFunction().GetMinCrispValue());
                        max = Mathf.Max(max, setKv.Key.GetMembershipFunction().GetMaxCrispValue());
                    }
                    float step        = (max - min) / 100.0f;
                    float numerator   = 0.0f;
                    float denominator = 0.0f;
                    for (float x = min; x <= max; x += step)
                    {
                        float maxMembership = 0.0f;
                        foreach (var setKv in varKV.Value)
                        {
                            maxMembership = Mathf.Max(maxMembership, Mathf.Min(setKv.Key.GetMembershipFunction().Calculate(x).value, setKv.Value.value));
                        }
                        numerator   += x * maxMembership;
                        denominator += maxMembership;
                    }
                    float centerOfMass = numerator / denominator;
                    context.crispOutputValues[variable] = centerOfMass;
                }
            }
コード例 #2
0
 public FuzzySet(FuzzyContext.Variable variable, string name, MembershipFunction membershipFunction)
 {
     this.variable           = variable;
     this.name               = name;
     this.membershipFunction = membershipFunction;
 }