void AddSugenoFuzzyRule( SugenoFuzzySystem fs, FuzzyVariable fv1, FuzzyVariable fv2, SugenoVariable sv, string value1, string value2, string result) { SugenoFuzzyRule rule = fs.EmptyRule(); rule.Condition.Op = OperatorType.And; rule.Condition.ConditionsList.Add(rule.CreateCondition(fv1, fv1.GetTermByName(value1))); rule.Condition.ConditionsList.Add(rule.CreateCondition(fv2, fv2.GetTermByName(value2))); rule.Conclusion.Var = sv; rule.Conclusion.Term = sv.GetFuncByName(result); fs.Rules.Add(rule); }
/// <summary> /// Combine results of functions and rule evaluation /// </summary> /// <param name="ruleWeights">Rule weights (results of evaluation)</param> /// <param name="functionResults">Result of functions evaluation</param> /// <returns>Result of calculations</returns> public Dictionary <SugenoVariable, double> CombineResult(Dictionary <SugenoFuzzyRule, double> ruleWeights, Dictionary <SugenoVariable, Dictionary <ISugenoFunction, double> > functionResults) { Dictionary <SugenoVariable, double> numerators = new Dictionary <SugenoVariable, double>(); Dictionary <SugenoVariable, double> denominators = new Dictionary <SugenoVariable, double>(); Dictionary <SugenoVariable, double> results = new Dictionary <SugenoVariable, double>(); // // Calculate numerator and denominator separately for each output // foreach (SugenoVariable var in Output) { numerators.Add(var, 0.0); denominators.Add(var, 0.0); } foreach (SugenoFuzzyRule rule in ruleWeights.Keys) { SugenoVariable var = rule.Conclusion.Var; double z = functionResults[var][rule.Conclusion.Term]; double w = ruleWeights[rule]; numerators[var] += z * w; denominators[var] += w; } // // Calculate the fractions // foreach (SugenoVariable var in Output) { if (denominators[var] == 0.0) { results[var] = 0.0; } else { results[var] = numerators[var] / denominators[var]; } } return(results); }