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 unavailable. All memberships are zero.");
return weightSum / membershipSum;
}
}