Домой / Видео / Эффективность теории нечеткой логики. Введение в теорию нечеткой логики. Нечеткие логические операции

Эффективность теории нечеткой логики. Введение в теорию нечеткой логики. Нечеткие логические операции

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

  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 (на главной диагонали, естественно, будут единицы). Как степень равенства прямоугольников можно брать отношение площади их пересечения к площади большего из прямоугольников.

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

Классическая логика по определению не может оперировать с нечетко очерченными понятиями, поскольку все высказывания в формальных логических системах могут иметь только два взаимоисключающих состояния: «истина» со значением истинности «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 .

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

Нечеткая логика (fuzzy logic) - это надмножество классической булевой логики. Она расширяет возможности классической логики, позволяя применять концепцию неопределенности в логических выводах. Употребле­ние термина "нечеткий" применительно к математической теории может ввес­ти в заблуждение. Более точно ее суть характеризовало бы название "непре­рывная логика". Аппарат нечеткой логики столь же строг и точен, как и класси­ческий, но вместе со значениями "ложь" и "истина" он позволяет оперировать значениями в промежутке между ними. Говоря образно, нечеткая логика по­зволяет ощущать все оттенки окружающего мира, а не только чистые цвета.

Нечеткая логика как новая область математики была представлена в 60-х го­дах профессором калифорнийского университета Лотфи Заде (Lotfi Zadeh). Пер­воначально она разрабатывалась как средство моделирования неопределенности естественного языка, однако впоследствии круг задач, в которых нечеткая логи­ка нашла применение, значительно расширился. В настоящее время она исполь­зуется для управления линейными и нелинейными системами реального време­ни, при решении задач анализа данных, распознавания, исследования операций.

Часто для иллюстрации связи нечеткой логики с естественными представ­лениями человека об окружающем мире приводят пример о пустыне. Опреде­лим понятие "пустыня" как "бесплодная территория, покрытая песком". Те­перь рассмотрим простейшее высказывание: "Сахара - это пустыня". Нельзя не согласиться с ним, принимая во внимание данное выше определение. Пред­положим, что с поверхности Сахары удалена одна песчинка. Осталась ли Саха­ра пустыней? Скорее всего, да. Продолжая удалять песчинки одну за другой, всякий раз оцениваем справедливость приведенного ранее высказывания. По прошествии определенного промежутка времени песка в Сахаре не останется и высказывание станет ложным. Но после какой именно песчинки его истин­ность меняется? В реальной жизни с удалением одной песчинки пустыня не исчезает. Пример показывает, что традиционная логика не всегда согласуется с представлениями человека. Для оценки степени истинности высказываний ес­тественный язык имеет специальные средства (некоторые наречия и обороты, например: "в некоторой степени", "очень" и др.). С возникновением нечеткой логики они появились и в математике.

Одно из базовых понятий традиционной логики - понятие подмножества. Подобно этому в основе нечеткой логики лежит теория нечетких подмножеств (нечетких множеств). Эта теория занимается рассмотрением множеств, опре­деляемых небинарными отношениями вхождения. Это означает, что принима­ется во внимание не просто то, входит элемент во множество или не входит, но и степень его вхождения, которая может изменяться от 0 до 1.


Пусть S - множество с конечным числом элементов, S ={s 1 , s 2 ,..., s n }, где n - число элементов (мощность) множества S . В классичес­кой теории множеств подмножество U множества S может быть определено как отображение элементов S на множество В = {0, 1}:

U: S => В.

Это отображение может быть представлено множеством упорядоченных пар вида:

{s i ,m ui }, iÎ,

где s i - i-й элемент множества S ; n - мощность множества S ; m Ui - элемент множества В = {0, 1}. Если m Ui = 1, то s i является элементом подмножества U . Элемент "0" множества В используется для обозначения того, что s i не входит в подмножество U . Проверка истинности предиката "s k ÎU " осуществляется пу­тем нахождения пары, в которой s k - первый элемент. Если для этой пары m Uk =l, то значением предиката будет "истина", в противном случае - "ложь".

Если U - подмножество S , то U может быть представлено n-мерным векто­ром (m U 1 , m U 2 ,…, m Un), где i-й элемент вектора равен "1", если соответствую­щий элемент множества S входит и в U , и "0" в противном случае. Таким обра­зом, U может быть однозначно представлено точкой в n-мерном бинарном ги­перкубе В n , В = {0, 1} (рисунок 1).

Рисунок 1 - Графическое представление традиционного множества

Нечеткое подмножество F может быть представлено как отображение эле­ментов множества S на интервал I = . Это отображение определяется мно­жеством упорядоченных пар: {s i ,m F ,(s i)}, iÎ, где s i - i-й элемент множества S ; n - мощность множества S ; m F (s i) Î -степень вхождения элемента s i в множество F . Значение m F (s i), равное 1, озна­чает полное вхождение, m F (s i) = 0 указывает на то, что элемент s i не принадле­жит множеству F . Часто отображение задается функцией m F (x) принадлежнос­ти х нечеткому множеству F . В силу этого термины "нечеткое подмножество" и "функция принадлежности" употребляются как синонимы. Степень истиннос­ти предиката "s k ÎF " определяется путем нахождения парного элементу s k зна­чения m F (s k), определяющего степень вхождения s k в F .

Обобщая геометрическую интерпретацию традиционного подмножества на не­четкий случай, получаем представление F точкой в гиперкубе I n , I = . В отличие от традиционных подмножеств точки, изображающие нечеткие подмножества, мо­гут находиться не только на вершинах гиперкуба, но и внутри него (рисунок 2).

Рисунок 2 - Графическое представление нечеткого множества

Рассмотрим пример определения нечеткого подмножества. Имеется мно­жество всех людей S . Определим нечеткое подмножество Т всех высоких лю­дей этого множества. Введем для каждого человека степень его принадлежно­сти подмножеству Т . Для этого зададим функцию принадлежности m Т (h), оп­ределяющую, в какой степени можно считать высоким человека ростом h сан­тиметров.

(1)

где h - рост конкретного человека в сантиметрах.

График этой функции пред­ставлен на рисунке 3.

Рисунок 3 - График функции принадлежности rn T (h)

Пусть рост Михаила - 163 см, тогда истинность высказывания "Михаил высок" будет равна 0.21. Использованная в данном случае функция принад­лежности тривиальна. При решении большинства реальных задач подобные функции имеют более сложный вид, кроме того, число их аргументов может быть большим.

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

Необходимо осознавать разницу между нечеткой логикой и теорией веро­ятностей. Заключается она в различии понятий вероятности и степени принад­лежности. Вероятность определяет, насколько возможен один из нескольких взаимоисключающих исходов или одно из множества значений. Например, может определяться вероятность того, что утверждение истинно. Утверждение может быть либо истинным, либо ложным. Степень принадлежности показы­вает, насколько то или иное значение принадлежит определенному классу (под­множеству). Например, при определении истинности утверждения ее возмож­ные значения не ограничены "ложью" и "истиной", а могут попадать и в проме­жуток между ними. Еще одно различие выражено в математических свойствах этих понятий. В отличие от вероятности для степени принадлежности не тре­буется выполнение аксиомы аддитивности.

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

  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 (на главной диагонали, естественно, будут единицы). Как степень равенства прямоугольников можно брать отношение площади их пересечения к площади большего из прямоугольников.

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

Эпименид Кносский с острова Крит – полумифический поэт и философ, живший в VI в. до н.э., однажды заявил: «Все критяне – лжецы!». Так как он и сам был критянином, то его помнят как изобре тателя так называемого критского парадокса.


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


И здесь на сцену выходит нечеткая логика, где переменные могут быть частичными членами множеств. Истинность или ложность перестают быть абсолютными – утверждения могут быть частично истинными и частично ложными. Использование подобного подхода позволяет строго математически доказать, что парадокс Эпименида ровно на 50% истинен и на 50% ложен.

Таким образом, нечеткая логика в самой своей основе несовместима с аристотелевой логикой, особенно в отношении закона Tertium non datur («Третьего не дано» – лат.), который также называют законом исключения среднего1 . Если сформулировать его кратко, то звучит он так: если утверждение не является истинным, то оно является ложным. Эти постулаты настолько базовые, что их часто просто принимают на веру.


Более банальный пример пользы нечеткой логики можно привести в контексте концепции холода. Большинство людей способно ответить на вопрос: «Холодно ли вам сейчас?». В большинстве случаев (если вы разговариваете не с аспирантом-физиком) люди понимают, что речь не идет об абсолютной температуре по шкале Кельвина. Хотя температуру в 0 K можно, без сомнения, назвать холодом, но температуру в +15 C многие холодом считать не будут.


Но машины не способны проводить такую тонкую градацию. Если стандартом определения холода будет «температура ниже +15 C», то +14,99 C будет расцениваться как холод, а +15 C – не будет.

Теория нечетких множеств

Рассмотрим рис. 1. На нем представлен график, помогающий понять то, как человек воспринимает температуру. Температуру в +60 F (+12 C) человек воспринимает как холод, а температуру в +80 F (+27 C) – как жару. Температура в +65 F (+15 C) одним кажется низкой, другим – достаточно комфортной. Мы называем эту группу определений функцией принадлежности к множествам,описывающим субъективное восприятие температуры человеком.

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


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

Нечеткие операторы

Чтобы применить алгебру для работы с нечеткими значениями, нужно определить используемых операторов. Обычно в булевой логике используется лишь ограниченный набор операторов, с помощью которых и производится выполнение других операций: NOT (оператор «НЕ»), AND (оператор «И») и OR (оператор «ИЛИ»).

Можно дать множество определений для этих трех базовых операторов, три из которых приведены в таблице. Кстати, все определения одинаково справедливы для булевой логики (для проверки просто подставьте в них 0 и 1). В булевой логике значение FALSE («ЛОЖЬ») эквивалентно значению «0», а значение TRUE («ИСТИНА») эквивалентно значению «1». Аналогичным образом в нечеткой логике степень истинности может меняться в диапазоне от 0 до 1, поэтому значение «Холод» верно в степени 0,1, а операция NOT(«Холод») даст значение 0,9.


Вы можете вернуться к парадоксу Эпименида и постараться его решить (математически он выражается как A = NOT(A), где A – это степень истинности соответствующего утверждения). Если же вы хотите более сложную задачу, то попробуйте решить вопрос о звуке хлопка, производимого одной рукой…

Решение задач методами нечеткой логики

Лишь немногие клапаны способны открываться «чуть-чуть». При работе оборудования обычно используются четкие значения (например, в случае бимодального сигнала 0-10 В), которые можно получить, используя так называемое «решение задач методами нечеткой логики». Подобный подход позволяет преобразовать семантические знания, содержащиеся в нечеткой системе, в реализуемую стратегию управления2.


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


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

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


«Клапан частично закрыт»: 0,2

«Клапан частично открыт»: 0,7

«Клапан открыт»: 0,3

Если мы используем метод height defuzzification для определения степени открытости клапана, то получим результат:

«Клапан закрыт»: 0,1

(0,1*0% + 0,2*25% + 0,7*75% + 0,3*100%)/ /(0,1 + 0,2 + 0,7 + 0,3) =

= (0% + 5% + 52,5% + 30%)/(1,3) = = 87,5/1,3 = = 67,3%,

т.е. клапан необходимо открыть на 67,3%.

Практическое применение нечеткой логики

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


– Устройства для автоматического поддержания скорости движения автомобиля и увеличения эффективности/стабильности работы автомобильный двигателей (компании Nissan, Subaru).