Відкрити головне меню

Алгоритм Мамдані — алгоритм нечіткого логічного виводу по базі знань (базі правил). Отримав назву від імені англійського математика Ебрахіма Мамдані (Ebrahim Mamdani), який запропонував його 1974 року[1].

Алгоритм використовується переважно в задачах нечіткого моделювання, де дозволяє значно зменшити обсяги обчислень.[джерело?]

ОзначенняРедагувати

Формується в предметній області у вигляді нечітких предикатних правил виду:

П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 та інших.

ПриміткиРедагувати

  1. Mamdani, E. H., Application of fuzzy algorithms for the control of a simple dynamic plant. In Proc IEEE (1974), 121–159.

ЛітератураРедагувати

  • Алгоритмы нечёткого вывода: алгоритм Мамдани и алгоритм Сугэно. // В. Дьяконов, В. Круглов. Математические пакеты расширения MATLAB. Специальный справочник. — Санкт-Петербург: Питер, 2001 — С. 307–309
  • Штовба С. Д. Проектирование нечетких систем средствами MATLAB / С. Штовба. — М: Горячая линия-Телеком, 2007. — 288 с.
  • Леоненков А. В. Нечеткое моделирование в среде MATLAB и fuzzyTECH / А. Леоненков. — СПб: БХВ-Петербург, 2003. — 736 с.