Алгоритм Мамдані
Алгоритм Мамдані — алгоритм нечіткого логічного виводу по базі знань (базі правил). Отримав назву від імені англійського математика Ебрахіма Мамдані (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 та інших.
Примітки
- 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 с.