Алгоритм Мамдані — алгоритм нечіткого логічного виводу по базі знань (базі правил). Отримав назву від імені англійського математика Ебрахіма Мамдані (Ebrahim Mamdani), який запропонував його 1974 рокуMamdani, E. H., Application of fuzzy algorithms for the control of a simple dynamic plant. In Proc IEEE (1974), 121–159..
Алгоритм використовується переважно в задачах нечіткого моделювання, де дозволяє значно зменшити обсяги обчислень.
Означення Формується в предметній області у вигляді нечітких предикатних правил виду: П1: якщо x є A1, тоді z є B1, П2: якщо x є A2, тоді z є B2, . . . . . . . . . . Пn: якщо x є An, тоді z є Bn,
Де х — вхідна змінна(ім'я для відомих значень даних), z — змінна виводу(ім'я для значення даних, яке буде обчислене). Ai та Bi — нечіткі множини, визначені на X та Z відповідно за допомогою функції приналежності та (z).
Математичне трактування У представленій ситуації даних вивід у формі алгоритму Мамдані математично можна представити наступним чином.
1. Введення нечіткості (fuzzification): для заданого(чіткого) значення аргументу х = х0 знаходяться степені істинності для передумов кожного правила аі = (х0).
2. Нечіткий вивід: знаходиться рівні відсічення для передумов кожного з правил (з використання правила мінімуму):
де через позначено операцію логічного мінімуму.
Потім знаходяться усічені функції належності:
3. Композиція: з використанням операції max (позначеної як ) виконується об'єднання знайдених усічених функцій, що приводить до отримання підсумкової нечіткої підмножини для змінної виходу з функцією належності.
Реалізація private List<UnionOfFuzzySets> accumulation(List<ActivatedFuzzySet> activatedFuzzySets) { List<UnionOfFuzzySets> unionsOfFuzzySets = new ArrayList<UnionOfFuzzySets>(numberOfOutputVariables); for (Rule rule : rules) { for (Conclusion conclusion : rule.getConclusions()) { int id = conclusion.getVariable().getId(); unionsOfFuzzySets.get(id).addFuzzySet(activatedFuzzySets.get(id));
return unionsOfFuzzySets;
private double getMaxValue(double x) { double result = 0.0; for (FuzzySet fuzzySet : fuzzySets) { result = Math.max(result, fuzzySet.getValue(x));
return result;
4. Приведення до чіткості (для знаходження z0) виконується центроїдним методом (як центр тяжіння для кривої функції належності):
Реалізація private double[] defuzzification(List<UnionOfFuzzySets> unionsOfFuzzySets) { double[] y = new double[numberOfOutputVariables]; for(int i = 0; i < numberOfOutputVariables; i++) { double i1 = integral(unionsOfFuzzySets.get(i), true); double i2 = integral(unionsOfFuzzySets.get(i), false); y[i] = i1 / i2;
return y;
Приклад даного правила якщо x — низько, то z — високо.
Механізм нечіткого виводу при апроксимації функції z(x) можна представити у вигляді: Передумова:
П1: якщо x є A1, тоді z є B1, П2: якщо x є A2, тоді z є B2, . . . . . . . . . . Пn: якщо x є An, тоді z є Bn,
Факт: x є A
Наслідок: z є B
Реалізації Алгоритм Мамдані реалізовано в пакетах Fuzzy Logic Toolbox (розширення для MATLAB), fuzzyTECH та інших.
Примітки
Література Алгоритмы нечёткого вывода: алгоритм Мамдани и алгоритм Сугэно. // В. Дьяконов, В. Круглов. Математические пакеты расширения MATLAB. Специальный справочник. — Санкт-Петербург: Питер, 2001 — С. 307–309 Штовба С. Д. Проектирование нечетких систем средствами MATLAB / С. Штовба. — М: Горячая линия-Телеком, 2007. — 288 с. Леоненков А. В. Нечеткое моделирование в среде MATLAB и fuzzyTECH / А. Леоненков. — СПб: БХВ-Петербург, 2003. — 736 с.