Алгоритм Мамдані
Алгоритм Мамдані — алгоритм нечіткого логічного виводу по базі знань (базі правил). Отримав назву від імені англійського математика Ебрахіма Мамдані (Ebrahim Mamdani), який запропонував його 1974 року[1]. Алгоритм використовується переважно в задачах нечіткого моделювання, де дозволяє значно зменшити обсяги обчислень.[джерело?] ОзначенняФормується в предметній області у вигляді нечітких предикатних правил виду:
Де х — вхідна змінна(ім'я для відомих значень даних), 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) можна представити у вигляді: Передумова:
Факт: x є A Наслідок: z є B РеалізаціїАлгоритм Мамдані реалізовано в пакетах Fuzzy Logic Toolbox (розширення для MATLAB), fuzzyTECH та інших. Примітки
Література
|
Portal di Ensiklopedia Dunia