MATLAB.Exponenta
MATLAB и Simulink на русском
Технологии разработки и отладки
		сложных технических систем

Проектирование систем управления\Fuzzy Logic Toolbox

С.Д.Штовба "Введение в теорию нечетких множеств и нечеткую логику"

В оглавление книги \ К следующему разделу \ К предыдущему разделу

4. Прикладные нечеткие системы

4.6. Проектирование нечётких иерархических систем с помощью Fuzzy Logic Toolbox

Для моделирования многомерных зависимостей "входы - выход" целесообразно использовать иерархические системы нечеткого вывода. В иерархических системах выход одной базы знаний подается на вход для другой базы знаний. На рис. 1 приведен пример иерархической системі, моделирующей зависимость y=f(x1,x2,x3,x4,x5,x6) с помощью трех баз знаний. Эти базы знаний описывают такие зависимости: y1=f1(x1,x2), y2=f2(x3,x4,x5) и y=f3(x6,y1,y2).


Рисунок 1 - Пример иерархической нечеткой базы знаний

Существует два способа создания иерархических нечетких систем. Первый способ состоит в выполнении нечеткого вывода для промежуточных переменных с последующей передачей четких значений этих переменных в нечеткие системы следующего уровня иерархии. Для реализации этого способа необходимо вызвать функцию evalfis для каждой нечеткой базы знаний. Пример такой иерархической системы приведен в разделе 4.5. Недостаток этого способа состоит в том, что над промежуточными переменными (y1, y2 на рис.1) последовательно выполняются операции дефаззификации и фаззификации. Нечеткие результаты промежуточных логических выводов дефаззифицируют, потом эти четкие значения подают на вход нечетких систем следующего уровня иерархии и там они фаззифицируються, т.е становятся нечеткими, Следовательно, для промежуточных переменных надо задавать функции принадлежности. Кроме того, необходимо обеспечить эквивалентность нечетких множества до и после операций дефаззификации и фаззификации. При втором способе процедуры дефаззификации и фаззификации для промежуточных переменных не выполняются. Результат логического вывода в виде нечеткого множества напрямую передается в машину нечеткого вывода следующего уровня иерархии. Поэтому, для описания промежуточных переменных в иерархических нечетких базах знаний достаточно задать только терм-множества, без определения функций принадлежностей.

Рассмотрим как расширить Fuzzy Logic Toolbox, чтобы выполнять логический вывод по иерархической нечеткой базе знаний по второму способу, т.е без лишних дефаззификации и фаззификации промежуточных переменных. Для этого необходимо запрограммировать две процедуры. Первая процедура должна выдавать результат вывода по промежуточной базе знаний в виде нечеткого множества типа:
,
где степень принадлежности результата нечеткому терму - количество термов. Вторая процедура должна передавать найденные степени принадлежности в машину нечеткого вывода следующего уровня иерархии.

Для первой процедуры воспользуемся приемами, заложенными в нечеткий классификатор. В качестве промежуточной нечеткой системы будем использовать систему нечеткого вывода Сугено. Классам решений поставим в соответствие "функции принадлежности" выходной переменной. Параметры заключений правил (параметры "функций принадлежности" выходной переменной) могут быть произвольными, т.к. они не влияют на результирующее нечеткое множество. Для получения результата вывода в виде нечеткого множества выполним следующие команды:

%Нечеткий вывод:
[a,b,c,d]=evalfis(inputs,fis);         %inputs - входы, fis - нечеткая система
%Вытаскивание степеней принадлежности:
number_of_terms=length(fis.output(1).mf);         %количество термов
mf_grades=zeros(1, number_of_terms);         %искомые степени принадлежности
number_of_rules=length(fis.rule);         %количество правил в базе знаний
for j=1:number_of_rules
term_index=fis.rule(j).consequent;         mf_grades(term_index)=max(mf_grades(term_index), d(j));
%s-норма реализована максимумом
end

Для реализации второй процедуры предлагается специальная функция принадлежности treemf, которая возвращает степень принадлежности, равную ее первому параметру:

function mu = treemf(x, params)
mu=x; %Чтобы не определять размер
mu(:,:)=params(1);

Этот тип функции принадлежности следует установить для каждого терма входной промежуточной переменной. Для передачи в машину нечеткого вывода следующего уровня иерархии степеней принадлежности, найденных первой процедурой, необходимо первый параметр функции принадлежности treemf установить равным соответствующей координате вектора mf_grades. Параметры функций принадлежности входных промежуточных переменных необходимо устанавливать при каждом нечетком выводе.
Для логического вывода по иерархической базе знаний предлагается пакет fuzzy_tree. Он включает функции treemf, prepare_tree и hier_evalfis. Для работы пакета необходим Fuzzy Logic Toolbox. Для нечетких иерархических классификаторов необходим также функция fuzzy_classifier из пакета FALEFC. Описание функций пакета fuzzy_tree приведено ниже.

treemf
Назначение Функция принадлежности для промежуточных входных переменных в иерархических системах нечеткого вывода.
Синтаксис mu = treemf(x, params)
Описание Возвращает степень принадлежности. равную первой координате входного аргумента params.


prepare_tree
Назначение Преобразовывает дерево нечеткого вывода для функции hier_evalfis.
Синтаксис FIS_list, input_list]=prepare_tree(fis_file_names, tree_list)
Описание Преобразовывает дерево нечеткого вывода к формату, требуемом функцией hier_evalfis. Функцию следует 1 раз запустить для каждой иерархической базы знаний до вызова функции hier_evalfis. Функция устанавливает для всех термов нетерминальных входных переменных тип функции принадлежности 'treemf'. Функция prepare_tree вызывается с двумя входными аргументами:

1) fis_file_names {список fis-файлов}, составляющих иерархическую нечеткую базу знаний. Сначала нечеткий вывод осуществляется по первой нечеткой системе, затем - по второй и т.д.; 2) tree_list - матрица связей между базами знаний. Размер матрицы (N-1)x2, где N - количество баз знаний. Первая строка матрицы указывает куда входит выходная переменная первой базы знаний, вторая строка указывает точку входа выходной переменной второй базы знаний и т.д. Формат: первый элемент строки - порядковый номер "принимающей" базы знаний из fis_file_names; второй элемент строки - порядковый номер входной переменной в "принимающей" базе знаний. В базах знаний номера терминальных входных переменных должны следовать до нетерминальных (т.е. исходящих из других баз знаний).

Функция возвращает два аргумента:

1) FIS_list - массив нечетких систем. Последний элемент массива - нечеткая система верхнего уровня иерархии. Первая система не содержит нетерминальных входных переменных; 2) input_list - матрица размером Nx3. Показывает распределение терминальных входных переменных по нечетким системам. Каждая строка описывает одну нечеткую систему. Первый столбец - общее количество входов системы; второй столбец - количество терминальных входов; третий столбец - порядковый номер первой терминальной переменной.


hier_evalfis
Назначение Нечеткий вывод по иерархической базе знаний.
Синтаксис [a,b ,c, d]=hier_evalfis(x, FIS_list, input_list, tree_list, system_type)
Описание Осуществляет нечеткий вывод по иерархической базе знаний. Перед вызовом функции hier_evalfis следует 1 раз запустить для каждой иерархической базы знаний функцию prepare_tree. Функция hier_evalfis имеет 5 входных аргументов:

1) x - вектор значений входов (терминальных переменных); 2) FIS_list - массив нечетких систем. Последний элемент массива - нечеткая система верхнего уровня иерархии. Первая система не содержит нетерминальных переменных. Готовится функцией prepare_tree; 3) input_list - матрица размером Nx3. Показывает распределение терминальных входных переменных по нечетким системам. Каждая строка описывает одну нечеткую систему. Первый столбец - количество входов; второй столбец - количество терминальных входов; третий столбец - порядковый номер первой терминальной переменной, представленной вектором x. Готовится функцией prepare_tree; 4) tree_list - матрица связей между базами знаний. Размер матрицы (N-1)x2, где N - количество баз знаний. Первая строка матрицы указывает куда входит выходная переменная первой базы знаний, вторая строка указывает точку входа выходной переменной второй базы знаний и т.д. Формат: первый элемент строки - номер "принимающей" базы знаний; второй элемент строки - порядковый номер входной переменной в "принимающей" базе знаний. В базах знаний порядковые номера терминальных входных переменных должны быть меньше номеров нетерминальных (выходящих из других баз знаний); 5) system_type - тип нечеткой системы верхнего уровня иерархии: 1 - непрерывный выход, 2 - дискретный выход. Системы с непрерывным выходом должны быть системами Сугено нулевого порядка или системами Мамдани.

При system_type==1 функция hier_evalfis может возвращать до четырех аргументов: a - результат нечеткого вывода по иерархической базе знаний; b, c и d - промежуточные результаты вывода Мамдани по базе знаний верхнего уровня иерархии. Все аргументы аналогичны выходным переменным функции evalfis.

При system_type==2 функция hier_evalfis может возвращать до трех аргуметов: a - результат нечеткого вывода по иерархической базе знаний в виде номера класса; b - результат нечеткого вывода по иерархической базе знаний в виде наименования класса; c - вектор степеней принадлежности каждому классу.


Пример. Дерево логического вывода изображено на рис. 1. Нечеткие базы знаний приведены в табл. 1-3. Нечеткие системы y1=f1(x1,x2), y2=f2(x3,x4,x5) и y=f3(x6,y1,y2) записаны в файлах hy1.fis, hy2.fis и hy.fis.

Таблица 1 - Нечеткая база знаний о y1=f1(x1,x2)

Низкий Средний Низкий
Низкий Низкий Средний
Высокий Средний Высокий
Высокий Средний Средний
 

Таблица 2 - Нечеткая база знаний о y2=f2(x3,x4,x5)

Низкий Низкий Низкий Низкий
Средний Низкий Низкий Низкий
Средний Высокий Низкий Средний
Низкий Средний Высокий Средний
Высокий Высокий Высокий Высокий
 

Таблица 3 - Нечеткая база знаний о y=f3(x6,y1,y2)

Низкий Низкий Низкий Низкий
Низкий Средний Средний Ниже Среднего
Низкий Высокий Средний Средний
Высокий Средний Высокий Выше Среднего
Высокий Высокий Высокий Высокий
 

Необходимо найти значение выходной переменной y, если входные переменные принимают такие значения:

x1 x2 x3 x4 x5 x6
1 2 9 5 2 5
2 5 7 4 4 8
3 7 2 2 4 1
 

Для этого напишем следующую программу:

fis_file_names ={'hy1.fis' 'hy2.fis' 'hy.fis'};% список fis-файлов
tree_list=[3 2; 3 3]; %матрица связей между базами знаний
[FIS_list, input_list]=prepare_tree(fis_file_names, tree_list)
X1=[1 2 9 5 2 5] %Значения входных (терминальных) переменных
out1=hier_evalfis(X1, FIS_list, input_list, tree_list, 1)
X2=[2 5 7 4 4 8]
out2=hier_evalfis(X2, FIS_list, input_list, tree_list, 1)
X3=[3 7 2 2 4 1]
out3=hier_evalfis(X3, FIS_list, input_list, tree_list, 1)
[out1 out2 out3]

В результате получаем такие значения выходной переменой у:
ans =
4.9704 2.4302 3.0829

В оглавление книги \ К следующему разделу \ К предыдущему разделу


Поиск по сайту:

Система Orphus

Яндекс.Метрика