Нечеткая логика. Проверить корректность алгоритма Мамдани - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет. Попытался реализовать алгоритм Мамдани, но результат алгоритма с ответом в учебнике не сошелся. Возможно кто-нибудь может проверить корректность реализации. И не ругайтесь на ужасный код самого проекта так,как восстановил древние исходники, хочу просто узнать корректность алгоритма. Вот исходник

Решение задачи: «Нечеткая логика. Проверить корректность алгоритма Мамдани»

textual
Листинг программы
  1.     /// <summary>
  2.     /// Алгортим Мамдани
  3.     /// </summary>
  4.     public class Mamdani
  5.     {
  6.         public List<Variable> InputVariables { get; } = new List<Variable>();
  7.         public List<Variable> OutputVariables { get; } = new List<Variable>();
  8.         public List<Rule> Rules { get; } = new List<Rule>();
  9.  
  10.         /// <summary>
  11.         /// Делает расчет модели, принимает значения входных переменных, возвращает значения выходных переменных
  12.         /// </summary>
  13.         public IEnumerable<double> Calculate(params double[] inpVarValues)
  14.         {
  15.             var varVals = new Dictionary<string, double>();
  16.             for (int i = 0; i < inpVarValues.Length; i++)
  17.                 varVals[InputVariables[i].Name] = inpVarValues[i];
  18.  
  19.             //для каждой выходной перменной...
  20.             foreach (var outputVar in OutputVariables)
  21.             {
  22.                 var union = new Union();
  23.  
  24.                 //для каждого выходного терма
  25.                 foreach (var outTerm in outputVar.Terms.Values)
  26.                 {
  27.                     //перебираем правила для этого выходного терма
  28.                     foreach (var rule in Rules.Where(r => r.Conclusion == outTerm))
  29.                     {
  30.                         //ищем худшее значение из условий (Фаззификация и Агрегирование)
  31.                         var min = rule.Conditions.Min(c => c.MembershipFunction(varVals[c.Variable.Name]));
  32.                         //добавляем в объединение термов активизированный терм
  33.                         union.Add(new Term() {Name = outTerm.Name, Variable = outTerm.Variable, MembershipFunction = (x)=>Math.Min(outTerm.MembershipFunction(x), min * rule.Weight) });
  34.                     }
  35.                 }
  36.  
  37.                 yield return union.CenterMass(outputVar.Min, outputVar.Max);
  38.             }
  39.         }
  40.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы