Нечеткая логика. Проверить корректность алгоритма Мамдани - 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);
            }
        }
    }

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


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

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

8   голосов , оценка 4.25 из 5
Похожие ответы