Нечеткая логика. Проверить корректность алгоритма Мамдани - 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);
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д