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; } }
public FuzzySet(FuzzyContext.Variable variable, string name, MembershipFunction membershipFunction) { this.variable = variable; this.name = name; this.membershipFunction = membershipFunction; }