ТЕЛЕ 2

Нечеткая логика на практике. Fuzzy logic. Учим «электронные мозги» мыслить по-человечьи

Основы теории нечетких множеств и нечеткой логики

Одним из методов изучения множеств без уточнения их границ является теория нечетких множеств, которая была предложена в 1965 г. профессором Калифорнийского университета Лотфи Заде. Первоначально она разрабатывалась как средство моделирования неопределенности естественного языка. Однако впоследствии круг задач, решаемых с использованием аппарата нечетких множеств, значительно расширился и сейчас включает в себя такие области, как анализ данных, распознавание, исследование операций, моделирование сложных систем, поддержка принятия решений и т. д. .

Нередко при определении и описании характеристик объектов оперируют не только количественными, но и качественными значениями. В частности, рост человека можно количественно измерить в сантиметрах, а можно описать, используя качественные значения: карликовый, низкий, средний, высокий или гигантский. Интерпретация качественных значений носит субъективный характер, т.е. они могут по-разному трактоваться разными людьми (субъектами). В силу нечеткости (размытости) качественных значений, при необходимости перехода от них к количественным величинам возникают определенные трудности.

В системах, построенных на базе нечетких множеств, используются правила вида «ЕСЛИ А ТО В» (А ® В), в которых как в А (условие, предпосылку), так и в В (результат, гипотезу) могут входить качественные значения. Например, «ЕСЛИ Рост = "высокий" ТО Вид_спорта = "баскетбол"».

Переменная, значение которой определяется набором качественных значений некоторого свойства, в теории нечетких множеств называются лингвистической . В приведенном примере правила используются две лингвистические переменные: Рост и Вид_спорта.

Каждое значение лингвистической переменной определяется через так называемое нечеткое множество. Нечеткое множество определяется через некоторую базовую шкалу X и функцию принадлежности (характеристическую функцию) m(х ), где х Î Х . При этом, если в классическом канторовском множестве элемент либо принадлежит множеству (m(х ) = 1), либо не принадлежит (m(х ) = 0), то в теории нечетких множеств m(х ) может принимать любое значение в интервале . Над нечеткими множествами можно выполнять стандартные операции: дополнение (отрицание), объединение, пересечение, разность и т. д. (рис. 33).

Для нечетких множеств существует также ряд специальных операций: сложение, умножение, концентрирование, расширение и т. д.

При задании лингвистической переменной ее значения, т. е. нечеткие множества, должны удовлетворять определенным требованиям (рис. 34).

1. Упорядоченность. Нечеткие множества должны быть упорядочены (располагаться по базовой шкале) в соответствии с порядком задания качественных значений для лингвистической переменной.

2. Ограниченность. Область определения лингвистической переменной должна быть четко обозначена (определены минимальные и максимальные значения лингвистической переменной на базовой шкале). На границах универсального множества, где определена лингвистическая переменная, значения функций принадлежности ее минимального и максимального нечеткого множества должны быть единичными. На рисунке Т 1 имеет неправильную функцию принадлежности, а Т 6 – правильную.

3. Согласованность. Должно соблюдаться естественное разграничение понятий (значений лингвистической переменной), когда одна и та же точка универсального множества не может одновременно принадлежать с m(х ) = 1 двум и более нечетким множествам (требование нарушается парой Т 2 – Т 3).

4. Полнота. Каждое значение из области определения лингвистической переменной должно описываться хотя бы одним нечетким множеством (требование нарушается между парой T 3 – Т 4).

5. Нормальность. Каждое понятие в лингвистической переменной должно иметь хотя бы один эталонный или типичный объект, т. е. в какой-либо точке функция принадлежности нечеткого множества должна быть единичной (требование нарушается T 5).

X

Нечеткое множество «низкий рост» m н (х )

0 20 40 60 80 100 110 120 140 160 X

Нечеткое множество «высокий рост» m в (х )

0 20 40 60 80 100 110 120 140 160 X

Д = Н: Дополнение нечеткого множества «низкий рост»

m д (х ) = 1 – m н (х )

0 20 40 60 80 100 110 120 140 160 X

Н È В: Объединение нечетких множеств «низкий рост» и «высокий рост»

m нв (х ) = mах (m н (х ), m в (х ))

0 20 40 60 80 100 110 120 140 160 X

Н Ç В: Пересечение нечетких множеств «низкий рост» и «высокий рост»

m нв (х ) = min (m н (х ), m в (х ))

Рис. 33. Операции над нечеткими множествами

m(х ) Т 1 Т 2 Т 3 Т 4 Т 5 Т 6

Рис. 34. Пример задания нечетких множеств для линг­вис­тической переменной с нарушением требований

Требования 2–4 можно заменить одним универсальным – сумма функций принадлежности m(х ) по всем нечетким множествам в каждой точке области определения переменной должна равняться 1.

При обработке правил с лингвистическими переменными (нечетких правил) для вычисления истинности гипотезы применяются правила нечеткой логики. Нечеткая логика – разновидность непрерывной логики, в которой предпосылки, гипотезы и сами логические формулы могут принимать истинностные значения с некоторой долей вероятности.

Основные положения нечеткой логики:

· истинность предпосылки, гипотезы или формулы лежит в интервале ;

· если две предпосылки (Е 1 и Е 2) соединены Ù (логическим И), то истинность гипотезы Н рассчитывается по формуле t(Н) = MIN(t(Е 1), t(Е 2));

· если две предпосылки (Е 1 и Е 2) соединены Ú (логическим ИЛИ), то истинность гипотезы Н рассчитывается по формуле t(Н) = MAX(t(Е 1), t(Е 2));

· если правило (П) имеет свою оценку истинности, тогда итоговая истинность гипотезы Н итог корректируется с учетом истинности правила t(Н итог) = MIN(t(Н), t(П)).

Стандартная статья о нечеткой логике обычно грешит двумя вещами:

  1. В 99% случаев статья касается исключительно применения нечеткой логики в контексте нечетких множеств, а точнее нечеткого вывода, а еще точнее алгоритма Мамдани. Складывается впечатление, что только этим способом нечеткая логика может быть применена, однако это не так.
  2. Почти всегда статья написана на математическом языке. Замечательно, но программисты пользуются другим языком с другими обозначениями. Поэтому оказывается, что статья просто непонятна тем, кому, казалось бы, должна быть полезна.
Все это грустно, потому что нечеткая логика - это одно из величайших достижений математики XX-ого века, если критерием брать практическую пользу. В этой статье я попытаюсь показать, насколько это простой и мощный инструмент программирования - настолько же простой, но гораздо более мощный, чем система обычных логических операций.

Самым замечательным фактом о нечеткой логике является то, что это прежде всего логика . Из начал мат-логики известно, что любая логическая функция может быть представлена дизъюнктивной или конъюнктивной нормальной формой, из чего следует, что для реализации исчисления высказываний достаточно всего трех операций: конъюнкции (&&), дизъюнкции (||) и отрицания (!). В классической логике каждая из этих операций задана таблицей истинности:

A b || a b && a ! -------- -------- ---- 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 1 1
В нечеткой логике, в отличие от классической, вместо величин истина и ложь используется величина степень истинности , принимающая любые значения из бесконечного множества от 0 до 1 включительно. Следовательно логические операции уже нельзя представить таблично. В нечеткой логике они задаются фукнциями.

Есть два способа реализации дизъюнкции и конъюнкции:

#Максиминный подход: a || b => max(a, b) a && b => min(a, b) #Колорометрический подход: a || b => a + b - a * b a && b => a * b
Отрицание задается единственным способом (не трудно догадаться):

A => 1 - a
Легко проверить, что для крайних случаев - когда значения переменных исключительно 1 или 0 - приведенные выше функции дают таблицы истинности операций классической логики. Готово! Теперь у нас есть расширенная логика, обладающая невероятной мощью, простотой и при этом полностью совместимая с классической логикой в предельных случаях. Значит везде, где мы [программисты] используем логические выражения, мы можем использовать выражения нечеткой логики? Не совсем.

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

Для примера представим себе систему управления ракетой, использующую нечеткую логику для обхода препятствий. Представим себе, что ракета летит точно в гору, и система управления вычисляет решение: лететь вправо - 0.5, лететь влево - 0.5. Если использовать дефаззификацию методом центра масс, то система управления даст команду - лететь прямо. Бум! Очевидно, что в этом случае правильное решение - бросить кости и получить команду «влево» или «вправо» с вероятностью 50%.

В простейшем случае, когда нужно принять решение на основании степени истинности, можно разбить множество на интервалы и использовать if-else-if.

Если нечеткая логика используется для поиска по нечеткому критерию, то дефаззификация вообще может быть не нужна. Производя сравнения, мы будем получать некоторое значение степени равенства для каждого элемента пространства поиска. Мы можем определить некоторую минимальную степень равенства, значения ниже которой нас не интересуют; для оставшихся элементов степень равенства будет релевантностью, по убыванию которой мы будем сортировать результаты, и пускай пользователь решит, какой результат правильный.

В качестве примера приведу использование нечеткой логики для решения задачи, которой я развлекался еще в институте - это задача поиска китайского иероглифа по изображению.

Я сразу отбросил идею распознавать любой каракуль, нарисованный пользователем на экране (тогда это был экран КПК). Вместо этого программа предлагала выбрать тип черты из порядка 23-х, определенных правилами японской каллиграфии. Выбрав тип черты, пользователь рисовал прямоугольник, в который вписывалась черта. Фактически, иероглиф - и введенный, и хранимый в словаре - представлялся в виде множества прямоугольников, для которых был определен тип.

Как определить равенство иероглифов в таком представлении? Для начала сформулируем критерий в четкой постановке:

Иероглифы A и B равны тогда и только тогда, когда для каждой черты в A существует равная ей черта в B и для каждой черты в B существует равная ей черта в A.

Неявно предполагается, что иероглифы не содержат черт-дубликатов, то есть, если некоторая черта совпала с чертой в другом иероглифе, то ни с одной другой чертой в том же иероглифе она совпасть не может.

Равенство черт можно определить следующим образом:

Черты равны тогда и только тогда, когда относятся к одному типу и их прямоугольники занимают одну и ту же площадь.

Эти два определения дают нам систему утверждений, которой достаточно для реализации алгоритма поиска.

Для начала построим матрицу E следующим образом:

For i in 1..n for j in 1..n E = A[i] == B[j] end end #A и B - это иероглифы; A[i] и B[j] - это их черты, и оператор "==" вычисляет их нечеткое равенство. #Предполагается, что оба иероглифа имеют одинаковое количество черт - n.
Затем сомкнем эту матрицу в вектор M[n]:

For i in 1..n M[i] = E.max_in_row(i) end #Метод max_in_row вычисляет максимальное значение в строке матрицы.
Я использую максиминный подход, потому что, на практике, колорометрический дает слишком маленькие значения для конъюнкций. Если вспомнить, что max - это дизъюнкция, то получается, что мы вычисляем утверждение, что i-я черта A равна первой черте B или второй или третьей и т.д. Таким образом M - это вектор совпадений черт A с чертами B.

#Просто нечеткой конъюнкцией. e = M.min #Либо так: e = M.sum / M.length #(отношение суммы элементов к длине вектора).
Оба способа работают, но по-разному, причем второй способ работает даже если сравнивать черты четко. Какой из них правильней - вопрос философский.

Еще пару слов стоит сказать о сравнении черт. В соответствии с определением, равенство черт - это конъюнкция двух условий: равенства типов и равенства прямоугольников. Черты некоторых типов очень похожи. Вводя, пользователь легко может их перепутать, поэтому стоит иметь таблицу похожести, значения которой будут отражать насколько черта i похожа на черту j (на главной диагонали, естественно, будут единицы). Как степень равенства прямоугольников можно брать отношение площади их пересечения к площади большего из прямоугольников.

Вобщем, область применения нечеткой логики весьма обширна. В любом алгоритме, в любой системе правил попробуйте заменить истину и ложь на степень истинности и, возможно, эта система правил или алгоритм станут более точно отражать реальность. В конце концов, мы живем в мире, который фундаментально нечеток.

Свое начало математическая теория нечетких множеств (fuzzy sets) и сама нечеткая логика (fuzzy logic) ведет с 1965 года. Ее отцом-основателем является профессор Лотфи Заде (Lotfi Zadeh) из университета Беркли, именно он в своей статье «Fuzzy Sets» в журнале Information and Control и ввел оба этих понятия. Данный математический аппарат позволил ввести в такую точную науку, как математика, нечеткие (размытые) понятия, которыми оперирует любой человек, и заложил основу принципиально новым методам решения задач на основе мягких вычислений . Все эти нововведения, при правильном их использовании, могут значительно облегчить процесс решения задач классификации, создания экспертных систем и построения нейронных сетей.

Однако практическое применение нечеткой логики этим не ограничилось, в действительности свое наибольшее распространение данный математический аппарат получил в теории автоматического управления . Именно с этим и можно связать появление еще одного нового понятия - нечеткой модели . Нечеткая модель - это частный случай математической модели .

1. Теория нечетких множеств и нечеткой логики

Новая теория Лотфи Заде в некотором роде расширяет привычные нам границы математической логики и теории множеств. Математическая логика способна работать только со строго формализованными данными, а принадлежность объекта к тому или иному множеству определяется лишь двумя понятиями, то есть само понятие "принадлежность" - дискретная величина, способная принимать два значения:

  • "1" - если объект принадлежит тому или иному множеству;
  • "0" - если не принадлежит.

В своей теории нечетких множеств Лотфи Заде отошел от дискретного понятия "принадлежности" и ввел новое - "степень принадлежности", а привычные "множества" были заменены на "нечеткие множества".

1.1. Основные термины и определения

Определение 1. Нечетким множеством (fuzzy set) на универсальном множестве называется совокупность пар , где - степень принадлежности элемента нечеткому множеству.

Определение 2. Степень принадлежности - это число из диапазона . Чем выше степень принадлежности, тем в большей мере элемент универсального множества соответствует свойствам данного нечеткого множества. Так, если степень принадлежности равна 0, то данный элемент абсолютно не соответствует множеству, а если равна 1, то можно говорить, наоборот, о полном соответствии. Эти два случая являются краевыми и в отсутствии иных вариантов представляли бы из себя обычное множество. Наличие всех остальных вариантов и есть ключевое отличие нечеткого множества.

Определение 3. Функцией принадлежности (membership function) называется функция, которая позволяет вычислить степень принадлежности произвольного элемента универсального множества нечеткому множеству. Следовательно, область значений функций принадлежности должна принадлежать диапазону . В большинстве случаев функция принадлежности - это монотонная непрерывная функция.

Определение 4. Лингвистической (нечеткой) переменной (linguistic variable) называется переменная, значениями которой могут быть слова или словосочетания некоторого естественного или искусственного языка. Именно из лингвистических переменных и состоят нечеткие множества. При определении нечеткого множества количество и характер нечетких переменных субъективны для каждой отдельной задачи.

Определение 5. Терм–множеством (term set) называется множество всех возможных значений, которые способна принимать лингвистическая переменная.

Определение 6. Термом (term) называется любой элемент терм–множества. В теории нечетких множеств терм формализуется нечетким множеством с помощью функции принадлежности. Функция принадлежности для каждого термина индивидуальна и зачастую уникальна. Существуют различные методы построения этих функций: прямые , косвенные и методы относительных частот . В их основе зачастую лежат характерные точки функции принадлежности или эмпирические данные эксперта данной предметной области.

Пример:

Определим некоторую лингвистическую переменную с названием "Возраст". По определению "Возраст" - период, ступень в развитии и росте человека, животного, растения. Минимальное значение этой переменной равно 0, то есть человеку не исполнилось и года. В качестве максимального значения возьмем 80. В зависимости от конкретного возраста человека мы можем дать оценку: "новорожденный", "юный", "молодой", "среднего", "старый", "пожилой" и так далее. Этот список может вместить в себя довольно большое количество элементов. Он будет являться терм-множеством для нашей лингвистической переменной, а его элементами - термами.

На рисунке ниже приведен пример нечеткой переменной "Возраст", для которой задали терм-множество только из трех термов: "Юный", "Средний", "Старый". Каждый из термов имеет свою функцию принадлежности.

Рассмотрим случай, когда возраст человека равен 30 годам, что на рисунке будет соответствовать перпендикуляру, проведенному из точки (30, 0). Эта прямая будет пересекать все три функции принадлежности в точках:

  1. (30, 0) - точка пересечения графика "Возраст 30 лет" и графика "Старый".
  2. (30, 0.29) - точка пересечения графика "Возраст 30 лет" и графика "Средний".
  3. (30, 0.027) - точка пересечения графика "Возраст 30 лет" и графика "Юный".


Из координат этих трех точек можно сделать вывод, что человека в 30 лет никак нельзя назвать старым, а если выбирать между юным и средним возрастом, то преобладает второе. Степень принадлежности к терму "Средний" равна 0.29, что довольно мало, и в действительности для человека в 30 лет куда лучше подошел бы иной терм, например "Молодой".

Определение 7. Дефаззификацией (defuzzification) называется процедура преобразования нечеткого множества в четкое число. На данный момент выделяют более двадцати методов, причем их результаты могут весьма значимо отличаться друг от друга. Следует отметить, что лучшие результаты дает дефаззификации по методу центра тяжести (center of gravity).

1.2. Нечеткая логика

Нечеткая логика - это обобщение традиционной аристотелевой логики на случай, когда истинность рассматривается как лингвистическая переменная. Как и в классической логике, для нечеткой логики определены свои нечеткие логические операции над нечеткими множествами. Для нечетких множеств существуют все те же операции, что и для обычных множеств, только их вычисление на порядок сложнее. Отметим также, что композиция нечетких множеств - есть нечеткое множество.

Основными особенностями нечеткой логики, отличающими ее от классической, являются максимальная приближенность к отражению реальности и высокий уровень субъективности, вследствие чего могут возникнуть значительные погрешности в результатах вычислений с ее использованием.

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

Ход построения модели можно разделить на три основных этапа:

  1. Определение входных и выходных параметров модели.
  2. Построение базы знаний.
  3. Выбор одного из методов нечеткого логического вывода.

От первого этапа непосредственно зависят два других, и именно он определяет будущее функционирование модели. База знаний или, как по-другому ее называют, база правил - это совокупность нечетких правил вида: "если, то", определяющих взаимосвязь между входами и выходами исследуемого объекта. Количество правил в системе не ограниченно и также определяется экспертом. Обобщенный формат нечетких правил такой:

Если условие (посылка) правила, то заключение правила.

Условие правила характеризует текущее состояние объекта, а заключение - то, как это условие повлияет на объект. Общий вид условий и заключений нельзя выделить, так как они определяются нечетким логическим выводом.

Каждое правило в системе имеет вес - данный параметр характеризует значимость правила в модели. Весовые коэффициенты присваиваются правилу в диапазоне . Во многих примерах нечетких моделей, которые можно встретить в литературе, данные веса не указаны, но это не означает, что их нет, в действительности для каждого правила из базы в таком случае вес фиксирован и равен единице. Условия и заключения для каждого правила могут быть двух видов:

  1. простое - в нем участвует одна нечеткая переменная;
  2. составное - участвуют несколько нечетких переменных.

В зависимости от созданной базы знаний для модели определяется система нечеткого логического вывода. Нечетким логическим выводом называется получение заключения в виде нечеткого множества, соответствующего текущим значениях входов, с использованием нечеткой базы знаний и нечетких операций. Двумя основными типами нечеткого логического вывода являются Мамдани и Сугено.

1.3. Нечеткий логический вывод Мамдани

Нечеткий логический вывод по алгоритму Мамдани выполняется по нечеткой базе знаний:


Значения входных и выходной переменной в ней заданы нечеткими множествами.

v нечеткому терму t.

j-го правила из базы знаний;

где - операция из s-нормы (t-нормы), т.е. из множества реализаций логической операции ИЛИ (И). Наиболее часто используются следующие реализации: для операции ИЛИ - нахождение максимума и для операции И - нахождение минимума.

m

Особенностью этого нечеткого множества является то, что универсальным множеством для него является терм-множество выходной переменной .

Иными словами, используя термины нечеткой логики, произвести импликацию и агрегацию условий. Импликация моделируется двумя методами: нахождением минимума или произведения множеств, агрегация - нахождением максимума или суммы множеств.

После этого мы получим результирующее нечеткое множество, дефаззификация которого и даст нам точный выход системы.

1.4. Нечеткий логический вывод Сугено

Нечеткий логический вывод по алгоритму Сугено выполняется по нечеткой базе знаний:


База знаний Сугено аналогична базе знаний Мамдани за исключением заключений правил , которые задаются не нечеткими термами, а линейной функцией от входов:

Правила в базе знаний Сугено являются своего рода переключателями с одного линейного закона "входы - выход" на другой, тоже линейный. Границы подобластей размытые, следовательно, одновременно могут выполняться несколько линейных законов, но с различными степенями.

Эту базу также можно записать как:

Введем новое обозначение: - функция принадлежности входной или выходной нечеткой переменной v нечеткому терму t.

Степени принадлежности входного вектора нечетким термам из базы знаний рассчитываются следующим образом:

Данная функция будет характеризовать результат работы j-го правила из базы знаний;

где - операция из s-нормы (t-нормы), т.е. из множества реализаций логической операции ИЛИ (И). В нечетком логическом выводе Сугено наиболее часто используются следующие реализации треугольных норм: вероятностное ИЛИ как s-норма и произведение как t-норма.

После нахождения для мы получим m новых функций принадлежности, которые в совокупности будут образовывать новое нечеткое множество, обозначим его , соответствующее входному вектору .

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

2. Библиотека нечеткой логики FuzzyNet

На практике создание и работа даже с очень простой нечеткой моделью - весьма непростая задача, однако имеется множество различных программных средств и библиотек, которые существенно ее упрощают. Рассмотрим на примерах тестовых скриптов из библиотеки FuzzyNet для MQL5 процесс создания и работы с двумя нечеткими моделями.

2.1. Проектирование систем типа Мамдани

Первый пример - скрипт Tips_Sample_Mamdani.mq5 из библиотеки FuzzyNet для MQL5. В нем реализована нечеткая модель для вычисления чаевых, которые посетителю заведения предпочтительнее оставить, опираясь на свою оценку качества обслуживания и еды. Данная система имеет два нечетких логических входа, один выход, базу знаний из трех правил и систему логического вывода типа Мамдани.

Входными параметрами будут нечеткие переменные "еда" (food ) и "сервис" (service ), обе переменные оцениваются по шкале от 0 до 10 - это их минимальные и максимальные значения. Переменная "еда" состоит из двух термов: "невкусная" (rancid ), "вкусная" (delicious ). Переменная "сервис" будет состоять из трех нечетких термов: "плохой" (poor ), "хороший" (good ), "отличный" (excellent ).

На выходе получим нечеткую переменную "чаевые" (tips ). Определим диапазон значений оставляемых чаевых от 5 до 30% процентов от суммы в чеке и заведем для этой переменной три терма: "маленькие" (cheap ), "средние" (average ), "большие" (generous ).

База знаний этой системы будет состоять из трех правил:

  1. Если (сервис плохой) или (еда невкусная), то чаевые маленькие.
  2. Если (сервис хороший), то чаевые средние.
  3. Если (сервис отличный) или (еда вкусная), то чаевые большие.

Теперь, имея общие представления о системе, рассмотрим процесс ее создания:

  1. Подключим файл MamdaniFuzzySystem.mqh из библиотеки FuzzyNet для MQL5:
    #include Данный файл позволяет создавать системы типа Мамдани и работать с ними.
  2. Теперь мы можем создать пустую систему Мамдани и далее ее наполнять:
    MamdaniFuzzySystem *fsTips=new MamdaniFuzzySystem();
  3. Создадим первую входную переменную "сервис". При создании нечетких переменных в качестве параметров для конструктора указывается сначала имя переменной в виде строки, затем ее минимальное и максимальное значение.
    FuzzyVariable *fvService=new FuzzyVariable("service" ,0.0 ,10.0 );
  4. Добавим в нее нечеткие термы. В качестве параметров конструктор нечетких терминов принимает первым параметром имя в виде строки, а вторым - соответствующую ему функцию принадлежности.
    fvService.Terms().Add(new FuzzyTerm("poor" , new TriangularMembershipFunction(-5.0 , 0.0 , 5.0 ))); fvService.Terms().Add(new FuzzyTerm("good" , new TriangularMembershipFunction(0.0 , 5.0 , 10.0 ))); fvService.Terms().Add(new FuzzyTerm("excellent" , new TriangularMembershipFunction(5.0 , 10.0 , 15.0 ))); Функции принадлежности в данном примере для всех термов представлены в виде треугольной функции.
  5. Теперь уже готовую и сформированную нечеткую переменную добавляем в нашу систему:
    fsTips.Input().Add(fvService);
  6. Аналогично реализуем второй вход для системы с переменной "еда", только термины для этой переменной будут иметь трапециевидную функцию принадлежности.
    FuzzyVariable *fvFood=new FuzzyVariable("food" ,0.0 ,10.0 ); fvFood.Terms().Add(new FuzzyTerm("rancid" , new TrapezoidMembershipFunction(0.0 , 0.0 , 1.0 , 3.0 ))); fvFood.Terms().Add(new FuzzyTerm("delicious" , new TrapezoidMembershipFunction(7.0 , 9.0 , 10.0 , 10.0 ))); fsTips.Input().Add(fvFood);
  7. Поскольку система имеет логический вывод Мамдани, ее входные и выходные значения будет определяться одними и теми же способами. Поэтому по аналогии создадим выход:
    FuzzyVariable *fvTips=new FuzzyVariable("tips" ,0.0 ,30.0 ); fvTips.Terms().Add(new FuzzyTerm("cheap" , new TriangularMembershipFunction(0.0 , 5.0 , 10.0 ))); fvTips.Terms().Add(new FuzzyTerm("average" , new TriangularMembershipFunction(10.0 , 15.0 , 20.0 ))); fvTips.Terms().Add(new FuzzyTerm("generous" , new TriangularMembershipFunction(20.0 , 25.0 , 30.0 ))); fsTips.Output().Add(fvTips);
  8. Создадим нечеткие правила, которые в совокупности будут представлять базу знаний нашей системы. Для создания правила необходимо вызвать метод ParseRule от объекта, который представляет нашу систему, и в качестве параметра передать ему простое строковое представление нечеткого правила:
    MamdaniFuzzyRule *rule1 = fsTips.ParseRule("if (service is poor) or (food is rancid) then (tips is cheap)" ); MamdaniFuzzyRule *rule2 = fsTips.ParseRule("if (service is good) then (tips is average)" ); MamdaniFuzzyRule *rule3 = fsTips.ParseRule("if (service is excellent) or (food is delicious) then (tips is generous)" );

    Написание нечетких правил строго типизировано и не допускает использование неключевых слов. Ключевыми словами являются: "if", "then", "is", "and", "or", "not", "(" , ")", "slightly", "somewhat", "very", "extremely". Последние четыре ключевых слова являются лингвистическими квантификаторами. Также к ключевым словам относятся все имена переменных, терминов и функций, имеющихся в вашей системе. Лингвистическими квантификаторами увеличивают или, наоборот, уменьшают значимость нечетких термов или линейных функций Сугено. Реализация лингвистических квантификаторов:

    1. "slightly" - "едва", заменяет результат посылки на ее кубический корень. Сильно уменьшает значимость.
    2. "somewhat" - "отчасти", заменяет результат посылки на ее квадратный корень. Уменьшает значимость.
    3. "very" - "очень", возводит результат посылки во вторую степень. Увеличивает значимость.
    4. "extremely" - "экстремально", возводит результат посылки в третью степень. Сильно увеличивает значимость.
  9. Осталось лишь добавить правила в систему:
    fsTips.Rules().Add(rule1); fsTips.Rules().Add(rule2); fsTips.Rules().Add(rule3);

Теперь мы имеем готовую модель вычисления чаевых на основе системы нечеткого логического вывода Мамдани.

2.2. Проектирование систем типа Сугено

Примером реализации системы типа Сугено будет скрипт для вычисления необходимого управления системой круиз-контроля автомобиля. Этот скрипт описан в файле Cruise_Control_Sample_Sugeno.mq5 библиотеки FuzzyNet для MQL5 и является одним из примеров применения нечетких моделей для решения задач автоматического управления.

Именно для таких одномерных задач в системах автоматического управления (САУ) и нашла наибольшее распространение нечеткая логика. Постановка этих задач звучит примерно так: некий объект в момент времени находится в состоянии "A", необходимо, чтобы за время он пришел в состояние "B". Для решения задач такого типа весь временной участок разбивают на частей, находят шаг по времени, равный , и далее САУ необходимо вырабатывать управление в каждой точке , где i=0,1,2...n .

С данной задачей легко справляются различные ПИД -регуляторы , но у них есть один существенный недостаток - они не могут выработать, скажем так, "плавное" управление. То есть если построить систему круиз-контроля автомобиля на основе ПИД-регулятора, при изменении скорости эта система выведет вас на заданную, но при этом могут быть различные рывки и толчки. Нечеткий регулятор сможет выполнить все гораздо плавнее и комфортнее с точки зрения человека.

Становится очевидным, что на выходе нашего нечеткого регулятора будет необходимое изменение скорости в виде ускорения, а на входе будет ошибка и первая производная по ошибке. Ошибка - отклонение текущего состояния от желаемого. Иными словами, на вход системы будут поступать следующие сведения:

  • разность между скоростью автомобиля в данный момент и скоростью, установленной в системе круиз-контроля;
  • как быстро эта разность уменьшается (увеличивается).

Итак, первый входной параметр "ошибка скорости" (SpeedError ) будет принимать значения от -20 до 20 км/ч и иметь три терма: "уменьшилась" (slower ), "не изменилась" (zero ), "увеличилась" (faster ). Все три терма будут иметь треугольную функцию принадлежности. Второй вход - "производная по ошибке скорости" (SpeedErrorDot ) с диапазоном от -5 до 5 и нечеткими термами "уменьшилась" (slower ), "не изменилась" (zero ), "увеличилась" (faster ) также с треугольной функцией принадлежности.

Поскольку наша модель имеет систему логического вывода Сугено, выходное значение "ускорение" (Accelerate ) не будет иметь максимального и минимального значения, а вместо нечетких терминов будут линейные комбинации входных переменных, которые также будут иметь имена: "не изменять" (zero ), "увеличить" (faster ), "уменьшить" (slower ), "поддерживать" (func ). Распишем все четыре линейные комбинации. Для этого обозначим переменные SpeedError как , SpeedErrorDot как , а Accelerate как , тогда получим уравнения:

База знаний этой системы будет состоять из девяти правил:

  1. Если (ошибка уменьшилась) и (производная по ошибке уменьшилась), то ускорение увеличить.
  2. Если (ошибка уменьшилась) и (производная по ошибке не изменилась), то ускорение увеличить.
  3. Если (ошибка уменьшилась) и (производная по ошибке увеличилась), то ускорение не изменять.
  4. Если (ошибка не изменилась) и (производная по ошибке уменьшилась), то ускорение увеличить.
  5. Если (ошибка не изменилась) и (производная по ошибке не изменилась), то ускорение поддерживать.
  6. Если (ошибка не изменилась) и (производная по ошибке увеличилась), то ускорение уменьшить.
  7. Если (ошибка увеличилась) и (производная по ошибке уменьшилась), то ускорение увеличить.
  8. Если (ошибка увеличилась) и (производная по ошибке не изменилась), то ускорение уменьшить.
  9. Если (ошибка увеличилась) и (производная по ошибке увеличилась), то ускорение уменьшить.

Рассмотрим непосредственно ход создания системы:

  1. Подключим файл SugenoFuzzySystem.mqh из библиотеки FuzzyNet для MQL5:
    #include Данный файл позволяет создавать системы типа Сугено и работать с ними.
  2. Теперь мы можем создать пустую систему Сугено и далее ее наполнять:
    SugenoFuzzySystem *fsCruiseControl=new SugenoFuzzySystem();
  3. Входные переменные для системы Сугено создаются так же, как и для системы типа Мамдани.

    Создадим переменную "ошибка скорости" и добавим ее в систему:

    FuzzyVariable *fvSpeedError=new FuzzyVariable("SpeedError" ,-20.0 ,20.0 ); fvSpeedError.Terms().Add(new FuzzyTerm("slower" ,new TriangularMembershipFunction(-35.0 ,-20.0 ,-5.0 ))); fvSpeedError.Terms().Add(new FuzzyTerm("zero" , new TriangularMembershipFunction(-15.0 , -0.0 , 15.0 ))); fvSpeedError.Terms().Add(new FuzzyTerm("faster" , new TriangularMembershipFunction(5.0 , 20.0 , 35.0 )));

    Создадим переменную "изменение ошибки скорости" и также добавим ее в систему:

    FuzzyVariable *fvSpeedErrorDot=new FuzzyVariable("SpeedErrorDot" ,-5.0 ,5.0 ); fvSpeedErrorDot.Terms().Add(new FuzzyTerm("slower" , new TriangularMembershipFunction(-9.0 , -5.0 , -1.0 ))); fvSpeedErrorDot.Terms().Add(new FuzzyTerm("zero" , new TriangularMembershipFunction(-4.0 , -0.0 , 4.0 ))); fvSpeedErrorDot.Terms().Add(new FuzzyTerm("faster" , new TriangularMembershipFunction(1.0 , 5.0 , 9.0 )));

  4. Создадим нечеткую переменную типа Сугено, которая будет являться выходом системы. При создании нечеткой переменной конструктор принимает лишь один параметр - ее имя. Далее в нее можно добавлять линейные функции, но прежде эти функции нужно определить, а для этого нужен массив коэффициентов типа double .

    Формирование линейной функции осуществляется следующим образом: каждая входная переменная будет являться неизвестной уравнения с коэффициентом, полученным из массива коэффициентов. Таким образом, коэффициенты в массиве должны располагаться в том порядке, в котором заносились входные переменные. Так, при первой входной переменной будет коэффициент с индексом 0, при второй - с индексом 1 и так далее. Поэтому длина массива коэффициентов должна быть больше на единицу или равна количеству входных переменных. Если длины равны, то коэффициент при свободном члене будет равен нулю, иначе его значение будет равно последнему элементу массива.

    В нашей системе две входные переменные, поэтому длины массивов коэффициентов не должны превышать трех. Объявим все четыре массива, на их основе сформируем описанные выше функции и добавим их в нечеткую переменную типа Сугено, а ее, в свою очередь, занесем в систему:
    SugenoVariable *svAccelerate=new SugenoVariable("Accelerate" ); double coeff1={0.0 ,0.0 ,0.0 }; svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("zero" ,coeff1)); double coeff2={0.0 ,0.0 ,1.0 }; svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("faster" ,coeff2)); double coeff3={0.0 ,0.0 ,-1.0 }; svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("slower" ,coeff3)); double coeff4={-0.04 ,-0.1 ,0.0 }; svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("func" ,coeff4)); fsCruiseControl.Output().Add(svAccelerate);

  5. По аналогии с системой Мамдани создадим все девять нечетких правил:
    SugenoFuzzyRule *rule1 = fsCruiseControl.ParseRule("if (SpeedError is slower) and (SpeedErrorDot is slower) then (Accelerate is faster)" ); SugenoFuzzyRule *rule2 = fsCruiseControl.ParseRule("if (SpeedError is slower) and (SpeedErrorDot is zero) then (Accelerate is faster)" ); SugenoFuzzyRule *rule3 = fsCruiseControl.ParseRule("if (SpeedError is slower) and (SpeedErrorDot is faster) then (Accelerate is zero)" ); SugenoFuzzyRule *rule4 = fsCruiseControl.ParseRule("if (SpeedError is zero) and (SpeedErrorDot is slower) then (Accelerate is faster)" ); SugenoFuzzyRule *rule5 = fsCruiseControl.ParseRule("if (SpeedError is zero) and (SpeedErrorDot is zero) then (Accelerate is func)" ); SugenoFuzzyRule *rule6 = fsCruiseControl.ParseRule("if (SpeedError is zero) and (SpeedErrorDot is faster) then (Accelerate is slower)" ); SugenoFuzzyRule *rule7 = fsCruiseControl.ParseRule("if (SpeedError is faster) and (SpeedErrorDot is slower) then (Accelerate is faster)" ); SugenoFuzzyRule *rule8 = fsCruiseControl.ParseRule("if (SpeedError is faster) and (SpeedErrorDot is zero) then (Accelerate is slower)" ); SugenoFuzzyRule *rule9 = fsCruiseControl.ParseRule("if (SpeedError is faster) and (SpeedErrorDot is faster) then (Accelerate is slower)" );
  6. Добавим их в нашу систему:
    fsCruiseControl.Rules().Add(rule1); fsCruiseControl.Rules().Add(rule2); fsCruiseControl.Rules().Add(rule3); fsCruiseControl.Rules().Add(rule4); fsCruiseControl.Rules().Add(rule5); fsCruiseControl.Rules().Add(rule6); fsCruiseControl.Rules().Add(rule7); fsCruiseControl.Rules().Add(rule8); fsCruiseControl.Rules().Add(rule9);

2.3. Расчет систем типа Мамдани и Сугено

На вход нечеткой системы должна подаваться нечеткая переменная и ее значение. Как говорилось выше, нечеткие переменные принимают значения из их терм-множества. Следовательно, результат вычисления системы будет зависть от функций принадлежности, которые соответствуют термам, поданным на вход, при нечетких входных переменных. Однако в большинстве случаев на вход системы посылают нечеткие переменные в виде простых числовых значений и на выходе хотят получить точный результат в таком же виде. В этом случае получается так, что нечеткий терм не имеет явного объявления, а его функция принадлежности представляется как константная функция принадлежности. Именно с этим частным случаем и работают системы, написанные с использованием библиотеки FuzzyNet.

Что же именно нужно подавать на вход системы и в каком виде мы получим результат от нее?

Количество входных переменных для нечетких систем не ограниченно, каждый вход обязательно должен принимать какие-то значения, следовательно, мы должны иметь список, в котором будем хранить значения для каждого входа. Элементами этого списка должен быть сложный объект с двумя полями: первое - нечеткая переменная, а второе - числовое значение типа double . В файле Dictionary.mqh из библиотеки FuzzyNet на MQL5 реализован класс Dictionary_Obj_Double , позволяющий создавать такие объекты.

Сформируем входной список для нашей системы типа Мамдани:

CList *in =new CList; Dictionary_Obj_Double *p_od_Service=new Dictionary_Obj_Double; Dictionary_Obj_Double *p_od_Food=new Dictionary_Obj_Double; p_od_Service.SetAll(fvService, Service); p_od_Food.SetAll(fvFood, Food); in .Add(p_od_Service); in .Add(p_od_Food);

Здесь Service и Food - два входных параметра типа double .

В описанных выше примерах обе системы, как Мамдани так и Сугено, имеют лишь по одному выходу, хотя в общем случае, как и на входы, никаких ограничений на их количество нет. Структура входа и выхода ничем не отличается.

Выход для системы типа Мамдани:

CList *result=new CList; Dictionary_Obj_Double *p_od_Tips=new Dictionary_Obj_Double;

Теперь для каждой системы вызываем функцию Calculate , которая принимает один параметр - список входов, а возвращает список выходов. По индексу 0 из этого списка получим значения выхода системы, который представлен как объект класса Dictionary_Obj_Double. Используя методы Key и Value для данного объекта, можно получить переменную и ее результат соответственно.

Выполним расчет для системы Мамдани и выведем на экран полученное число при нечеткой выходной переменной fvTips :

Result=fsTips.Calculate(in); p_od_Tips=result.GetNodeAtIndex(0 ); Alert ("Tips, %: " ,p_od_Tips.Value());

Проделаем то же самое с системой типа Сугено:

CList *in =new CList; Dictionary_Obj_Double *p_od_Error=new Dictionary_Obj_Double; Dictionary_Obj_Double *p_od_ErrorDot=new Dictionary_Obj_Double; p_od_Error.SetAll(fvSpeedError,Speed_Error); p_od_ErrorDot.SetAll(fvSpeedErrorDot,Speed_ErrorDot); in .Add(p_od_Error); in .Add(p_od_ErrorDot); CList *result=new CList; Dictionary_Obj_Double *p_od_Accelerate=new Dictionary_Obj_Double; result=fsCruiseControl.Calculate(in ); p_od_Accelerate=result.GetNodeAtIndex(0 ); Alert("Accelerate, %: " ,p_od_Accelerate.Value()*100 );

Заключение

Более подробно ознакомиться со скриптами, описанными выше, а также создать свою нечеткую модель вы можете, скачав библиотеку FuzzyNet для MQL5 или MQL4 . Важно понимать, что построение "боевых" нечетких моделей - это довольно непростая работа, даже с использованием каких-либо вспомогательных библиотек, а каждая готовая модель требует обязательной доскональной проверки и настройки.

Более подробное и объемное описание нечетких регуляторов.

  • Осовский С. Нейронные сети для обработки информации .
  • Статья Андрея Масаловича:
  • Классическая логика по определению не может оперировать с нечетко очерченными понятиями, поскольку все высказывания в формальных логических системах могут иметь только два взаимоисключающих состояния: «истина» со значением истинности «1» и «ложь» со значением истинности «0». Одной из попыток уйти от двузначной бинарной логики для описания неопределенности было введение Лукашевичем трехзначной логики с третьим состоянием «возможно» со значением истинности «0,5». Введя в рассмотрение нечеткие множества, Заде предложил обобщить классическую бинарную логику на основе рассмотрения бесконечного множества значений истинности. В предложенном Заде варианте нечеткой логики множество значений истинности высказываний обобщается до интервала 0 ; 1 , т.е. включает как частные случаи классическую бинарную логику и трехзначную логику Лукашевича. Такой подход позволяет рассматривать высказывания с различными значениями истинности и выполнять рассуждения с неопределенностью.

    Нечеткое высказывание – это законченная мысль, об истинности или ложности которой можно судить только с некоторой степенью уверенности 0 ; 1: «возможно истинно», «возможно ложно» и т.п. Чем выше уверенность в истинности высказывания, тем ближе значение степени истинности к 1 . В предельных случаях 0 , если мы абсолютно уверены в ложности высказывания, и 1 , если мы абсолютно уверены в истинности высказывания, что соответствует классической бинарной логике. В нечеткой логике нечеткие высказывания обозначаются так же, как и нечеткие множества: A , B , C … . Введем нечеткое отображение T: Ω → 0 ; 1 , которое действует на множестве нечетких высказываний Ω = A , B , C … . В этом случае значение истинности высказывания A ∈ Ω определяется как T A ∈ 0 ; 1 и является количественной оценкой нечеткости, неопределенности, содержащейся в высказывании A .

    Логическое отрицание нечеткого высказывания A обозначается ¬ A – это унарная (т.е. производимая над одним аргументом) логическая операция, результат которой является нечетким высказыванием «не A », «неверно, что A », значение истинности которого:

    T ¬ A = 1 − T A .

    Помимо приведенного выше исторически принятого основного определения нечеткого логического отрицания (нечеткого «НЕ»), введенного Заде, могут использоваться следующие альтернативные формулы:

    T ¬ A = 1 − T A 1 + λT A , λ > − 1, – нечеткое λ -дополнение по Сугено;

    T ¬ A = 1 − T A p , p > 0, – нечеткое p -дополнение по Ягеру.

    Логическая конъюнкция нечетких высказываний A и B обозначается A ∩ B – это бинарная (т.е. производимая над двумя аргументами) логическая операция, результат которой является нечетким высказыванием « A и B », значение истинности которого:

    T A ∩ B = min T A ; T B .

    Помимо приведенного выше исторически принятого основного определения логической конъюнкции (нечеткого «И»), введенного Заде, могут использоваться следующие альтернативные формулы:

    T A ∩ B = T A T B – в базисе Бандлера-Кохоута;

    T A ∩ B = max T A + T B − 1 ; 0 – в базисе Лукашевича-Гилеса;

    T A ∩ B = T B , при T A = 1 ; T A , при T B = 1 ; 0, в остальных случаях; – в базисе Вебера.

    Логическая дизъюнкция нечетких высказываний A и B обозначается A ∪ B – это бинарная логическая операция, результат которой является нечетким высказыванием « A или B », значение истинности которого:

    T A ∪ B = max T A ; T B .

    Помимо приведенного выше исторически принятого основного определения логической дизъюнкции (нечеткого «ИЛИ»), введенного Заде, могут использоваться следующие альтернативные формулы:

    T A ∪ B = T A + T B − T A T B – в базисе Бандлера-Кохоута;

    T A ∪ B = min T A + T B ; 1 – в базисе Лукашевича-Гилеса;

    T A ∪ B = T B , при T A = 0 ; T A , при T B = 0 ; 1, в остальных случаях; – в базисе Вебера.

    Нечеткая импликация нечетких высказываний A и B обозначается A ⊃ B – это бинарная логическая операция, результат которой является нечетким высказыванием «из A следует B », «если A , то B », значение истинности которого:

    T A ⊃ B = max min T A ; T B ; 1 − T A .

    Помимо приведенного выше исторически принятого основного определения нечеткой импликации, введенного Заде, могут использоваться следующие альтернативные определения нечеткой импликации, предложенные различными исследователями в области теории нечетких множеств:

    T A ⊃ B = max 1 − T A ; T B – Гедель;

    T A ⊃ B = min T A ; T B – Мамдани;

    T A ⊃ B = min 1 ; 1 − T A + T B – Лукашевич;

    T A ⊃ B = min 1 ; T B T A , T A > 0 – Гоген;

    T A ⊃ B = min T A + T B ; 1 – Лукашевич-Гилес;

    T A ⊃ B = T A T B – Бандлер-Кохоут;

    T A ⊃ B = max T A T B ; 1 − T A – Вади;

    T A ⊃ B = 1, T A ≤ T B ; T B , T A > T B ; – Бауэр.

    Общее число введенных определений нечеткой импликации не ограничивается приведенными выше. Большое количество работ по изучению различных вариантов нечеткой импликации обусловлено тем, что понятие нечеткой импликации является ключевым при нечетких выводах и принятии решений в нечетких условиях. Наибольшее применение при решении прикладных задач нечеткого управления находит нечеткая импликация Заде.

    Нечеткая эквивалентность нечетких высказываний A и B обозначается A ≡ B – это бинарная логическая операция, результат которой является нечетким высказыванием « A эквивалентно B », значение истинности которого:

    T A ≡ B = min max T ¬ A ; T B ;max T A ; T ¬ B .

    Так же, как в классической бинарной логике, в нечеткой логике с помощью рассмотренных выше логических связок можно формировать достаточно сложные логические высказывания.

    механизмы мышления, заметили, что в действительности существует не одна логика (например, булева), а столько, сколько мы пожелаем, потому что все определяется выбором соответствующей системы аксиом. Конечно, как только аксиомы выбраны, все утверждения, построенные на их основе, должны быть строго, без противоречий увязаны друг с другом согласно правилам, установленным в этой системе аксиом.

    Человеческое мышление - это совмещение интуиции и строгости, которое, с одной стороны, рассматривает мир в целом или по аналогии, а с другой стороны - логически и последовательно и, значит, представляет собой нечеткий механизм. Законы мышления, которые мы захотели бы включить в программы компьютеров, должны быть обязательно формальными; законы мышления, проявляемые в диалоге человека с человеком - нечеткие. Можем ли мы поэтому утверждать, что нечеткая логика может быть хорошо приспособлена к человеческому диалогу? Да - если математическое обеспечение , разработанное с учетом нечеткой логики , станет операционным и сможет быть технически реализовано, то человеко-машинное общение станет намного более удобным, быстрым и лучше приспособленным к решению проблем.

    Термин " нечеткая логика " используется обычно в двух различных значениях. В узком смысле, нечеткая логика - это логическое исчисление, являющееся расширением многозначной логики. В ее широком смысле, который сегодня является преобладающим в использовании, нечеткая логика равнозначна теории нечетких множеств. С этой точки зрения, нечеткая логика в узком смысле является разделом нечеткой логики в широком смысле.

    Определение . Любая нечеткая переменная характеризуется тройкой

    Где - название переменной, - универсальное множество , - нечеткое подмножество множества , представляющее собой нечеткое ограничение на значение переменной , обусловленное .

    Используя аналогию с саквояжем, нечеткую переменную можно уподобить саквояжу с ярлыком, имеющим "мягкие" стенки. Тогда - надпись на ярлыке (название саквояжа), - список предметов, которые в принципе можно поместить в саквояж, а - часть этого списка, где для каждого предмета указано число , характеризующее степень легкости, с которой предмет можно поместить в саквояж .

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

    Естественным обобщением инволютивных операций отрицания нечеткой логики являются неиволютивные отрицания. Они представляют самостоятельный интерес и рассматриваются в нечеткой и других неклассических логиках. Необходимость исследования подобных операций отрицания вызывается также введением в рассмотрение обобщенных операций конъюнкции и дизъюнкции, связанных друг с другом с помощью операции отрицания .