Нечеткая логика. Проверить корректность алгоритма Мамдани - C#
Формулировка задачи:
Всем привет. Попытался реализовать алгоритм Мамдани, но результат алгоритма с ответом в учебнике не сошелся. Возможно кто-нибудь может проверить корректность реализации. И не ругайтесь на ужасный код самого проекта так,как восстановил древние исходники, хочу просто узнать корректность алгоритма. Вот исходник
Решение задачи: «Нечеткая логика. Проверить корректность алгоритма Мамдани»
textual
Листинг программы
/// <summary> /// Алгортим Мамдани /// </summary> public class Mamdani { public List<Variable> InputVariables { get; } = new List<Variable>(); public List<Variable> OutputVariables { get; } = new List<Variable>(); public List<Rule> Rules { get; } = new List<Rule>(); /// <summary> /// Делает расчет модели, принимает значения входных переменных, возвращает значения выходных переменных /// </summary> public IEnumerable<double> Calculate(params double[] inpVarValues) { var varVals = new Dictionary<string, double>(); for (int i = 0; i < inpVarValues.Length; i++) varVals[InputVariables[i].Name] = inpVarValues[i]; //для каждой выходной перменной... foreach (var outputVar in OutputVariables) { var union = new Union(); //для каждого выходного терма foreach (var outTerm in outputVar.Terms.Values) { //перебираем правила для этого выходного терма foreach (var rule in Rules.Where(r => r.Conclusion == outTerm)) { //ищем худшее значение из условий (Фаззификация и Агрегирование) var min = rule.Conditions.Min(c => c.MembershipFunction(varVals[c.Variable.Name])); //добавляем в объединение термов активизированный терм union.Add(new Term() {Name = outTerm.Name, Variable = outTerm.Variable, MembershipFunction = (x)=>Math.Min(outTerm.MembershipFunction(x), min * rule.Weight) }); } } yield return union.CenterMass(outputVar.Min, outputVar.Max); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д