Блок задач

8. Чёрные ящики

Темы
Сложность 4

Задача «FuzzyBool»

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

Описание

Если обычная булева переменная может иметь лишь одно из двух значений (ИСТИНА или ЛОЖЬ), то её нечёткий аналог вместо этого оперирует целым множеством значений с разной степенью принадлежности.

Например, можно задать три разновидности истины:

истинно = 0/0 + 0/0.2 + 0.25/0.4 + 0.5/0.6 + 0.9/0.8 + 1/1.

более-менее истинно = 0/0 + 0/0.2 + 0.5/0.4 + 0.7/0.6 + 0.95/0.8 + 1/1.

почти истинно = 0/0 + 0.05/0.2 + 0.4/0.4 + 0.7/0.6 + 1/0.8 + 0.8/1.

Подобная запись означает, что величина, истинная с вероятностью p=0.6, принадлежит нечёткому множеству «истинно» со степенью принадлежности 0.5, «более-менее истинно» — 0.7 и «почти истинно» — также 0.7 (соответствующие члены выделены курсивом выше).

Для булевых переменных, заданных на нечётком множестве, можно определить различные операции.

Операция И: взять минимум функции принадлежности в интервале [0,1].

Операция ИЛИ: взять максимум функции принадлежности в интервале [0,1].

Операция НЕ: вычесть из единицы значение функции принадлежности на интервале [0,1].

Перейти к чёткому представлению: вычислить «центр масс», просуммировав вероятности с соответствующими весами. Например, для «более-менее истинно» это значение будет равно

(0 * 0 + 0 * 0.2 + 0.5 * 0.4 + 0.7 * 0.6 + 0.95 * 0.8 + 1 * 1) / (0 + 0 + 0.5 + 0.7 + 0.95 + 1)=0.75

Аппроксимация: подобрать для результата операции наиболее близкий вариант из множества заданных. Например, при вычислении «почти истинно» ИЛИ «истинно» получим следующее нечёткое множество:

0/0 + 0.05/0.2 + 0.4/0.4 + 0.7/0.6 + 1/0.8 + 1/1. Оно почти совпадает с «более-менее истинно».

Требования

Необходимо создать класс, который бы инкапсулировал нечёткое множество так, как описано выше, и реализовывал бы все перечисленные операции.

Обратите внимание, что множество интервалов значений вероятности у разных переменных может отличаться. В приведенных выше примерах оно было фиксировано: { 0, 0.2, 0.4, 0.6, 0.8, 1 }, но в общем случае это может быть не так и потребуется дополнительное разделение интервалов.