Параметры и принципы действия различных систем могут быть связаны по выбранному признаку между собой разного рода отношениями. Если, допустим, нас интересует влияние цены услуги на её востребованность, то данная связь может быть описана отношением типа «влияет», «сильно влияет», «слабо влияет», и т.д. В этом случае довольно «дискретных» объектов для описания может не хватить. Для многих прикладных задач теории автоматов, распознавания образов, принятия решений и т.д. имеет смысл обобщить понятие отношения между объектами на нечёткий случай. При этом модель, вполне возможно, будет более адекватно описывать систему, позволяя проводить качественный анализ систем без потери пороговой информации, в связи с появлением новых типов отношений: подобие, сходство, несходство, …
Понятие нечёткого отношения (связи, ассоциации, взаимосвязи, соотношения — синонимы), наряду с понятием нечёткого множества, относится к фундаментальным основам всей теории нечётких множеств. В добавок к тому, что они сами по себе имеют прикладное значение, на их основе определяется целый ряд дополнительных понятий, используемых для построения нечётких моделей более сложных систем.
Нечёткие отношения
(извиняюсь)
Определение
Как и в случае с нечётким множеством (НМ), нечёткое отношение обобщает понятие привычного нам обычного отношения в (наивной) теории множеств. А многие понятия, введённые для отношений далее, будут схожи с соответствующими понятиями для НМ.
Введём понятия нечёткого отношения и рассмотрим его свойства.
Нечётким 2-арным (бинарным) отношением на универсальном множестве называется нечёткое подмножество декартова произведения , которое характеризуется функцией принадлежности . Или другой способ записи:
В общем случае n-арное отношение есть нечёткое подмножество n-арного декартова произведения.
Стоит отметить, что в приложениях теории нечёткого отношения часто оказывается удобным вместо промежутка брать какую-либо общую структуру (множество вещественных чисел, множество лингвистических переменных и т.д.). Мы же в дальнейшем будем использовать именно промежуток . При этом характеризует субъективную степень соответствия пары отношению . Среди важных оговорок также скажу, что свойства и теоремы для бинарных отношений легко экстраполируются на n-арные случаи.
Существует несколько способов задания отношений.
- Словесное;
- Непосредственное перечисление всех пар и соответствующих им ;
- Матрицей ;
- С помощью графа , где — множество вершин, а
Характеристики
Далее будет подразумеваться
Носителем нечёткого отношения
Первая проекция (просто проекция) нечёткого бинарного отношения определяется функцией принадлежности:
Вторая проекция определяется как:
Глобальная проекция нечёткого множества
Отношение нормально, если
Дополнением нечёткого отношения
Чётким отношением, близким к нечёткому
Операции
Объединение и пересечение:
. Множество всех нечётких отношений образует дистрибутивную решётку по отношению к операциям объединения и пересечения; и из выполнения тождеств идемпотенции, коммутативности, ассоциативности, поглощения и дистрибутивности для решётки
В логике, основанной на теории обычных множеств, высказывание вроде «числа x и y очень близкие или/и очень различные» должно быть сокращено до «числа x и y очень близкие или очень различные». Однако в теории нечётких множеств первое высказывание вполне логично; оно выражает тот факт, что связка «и» интерпретируема при очень малых значениях функции принадлежности, когда об x и y нельзя сказать ни что они очень близки, ни что они очень отличаются друг от друга. Этот пример хорошо иллюстрирует гибкость высказываний, присущую настоящей логике.
Алгебраическое произведение:
Как и в случае нечётких множеств, нечёткое отношение можно декомпозировать на специальным образом устроенную систему обычных отношений и наоборот. Такая декомпозиция и синтез производится с помощью подмножеств
С этим связано одно очень важное утверждение (формально теорема) о декомпозиции. Любое отношение
Композиция отношений
Важное значение в теории нечётких множеств имеет композиция нечётких отношений. Как и в случае с действиями с НМ, композицию можно определить многими способами. Одним из наиболее общих способов является (Max-*)-композиция. Однако, здесь я рассмотрю лишь 3 наиболее употребляемые.
- max-min композиция (максиминная композиция):
. Наиболее часто используется. - min-max композиция (минимаксная композиция):
. - max-• композиция (максимультипликативная композиция):
.
Пусть имеются два отношения
Тогда композиции этих отношений быдут соответственно:
; ; .
Свойства
Среди множества отношений выделяют особые классы. Классы множеств демаркируют свойствами:
Рефлексивность:
Слабая рефлексивность:
Сильная рефлексивность:
Антиреflexxивность:
Симметричность:
Антисимметричность:
Совершенная антисимметричность:
… На самом деле эти и остальная куча классов нужны для вывода специфичных для конкретного класса теорем. Не вижу смысла рассматривать их подробно здесь.
Пробный пример
Пусть в гипотетической игре имеются 2 NPC-квестодателя, назовём их
По условиям задачи, игроку из разговоров местных жителей также известны некоторые понятия, используемые в стратегиях:
«Мало волчьих хвостов»
«Малая вероятность»
«Большая вероятность»
Игрок в инвентаре персонажа после долгого гринда имеет не очень мало волчьих хвостов. Вопрос: у какого из двух NPC большая вероятность закрыть квест?
Решение
Для начала определим вспомогательные функции, которые могут понадобиться в связи с условием:
def very(arr: List[set]):
return [(elem[0]**2, elem[1]) for elem in arr]
def no(arr: List[set]):
return [(1 - elem[0], elem[1]) for elem in arr]
def attitude(a: List[set], b: List[set], func = lambda x, y: min(x, y)):
return [[func(i[0], j[0]) for j in b] for i in a]
def attitude_unite(a: List[List], b: List[List]):
return [[max(a[i][j], b[i][j]) for j in range(len(a[i]))] for i in range(len(a))]
def composition(a: List[List], b: List[List]):
result = [[0 for j in range(len(b[0]))] for i in range(len(a))]
for x in range(len(a)):
for z in range(len(b[0])):
maximum = min(a[x][0], b[0][z])
for y in range(0, len(a[0])):
if maximum < min(a[x][y], b[y][z]):
maximum = min(a[x][y], b[y][z])
result[x][z] = maximum
return result
def index_plus(a: List[List]):
maximum = max([elem[1] for elem in a])
result = 0
for i in range(len(a)):
result += a[i][0] * (a[i][1] + maximum) / 2
return result
def ranking_index(a: List[List], b: List[List]):
return index_plus(a) - index_plus(b)
В качестве нечётких множеств используются списки кортежей, в качестве матриц — списки строк-списков. Все функции должны быть понятны и знакомы, за исключением, вполне вероятно, index_plus и ranking_index. Эти две функции реализуют индекс ранжирования для двух нечётких множеств. В общем виде этот индекс ранжирования (используемый в данной статье; на самом деле индекс ранжирования нечётких множеств может быть определён иначе, это отдельная тема для статей и исследований) выглядит так:
A = [(0.8, 3), (0.4, 15), (0.3, 30)]
B = [(0.1, 0.9), (0.5, 0.5), (0.8, 0.1)]
C = [(0.8, 0.9), (0.5, 0.5), (0.3, 0.2)]
Пусть
x = no(very(A))
x = [[elem[0] for elem in x]]
Обозначим общую стратегию NPC
AonB = attitude(A, B)
notAonnotB = attitude(no(A), no(B))
R1 = attitude_unite(AonB, notAonnotB)
В итоге рассчитаем вектор
y1 = composition(x, R1)
print('y1 = ', y1)
# >> y1 = [[0.63, 0.3599999999999999, 0.3599999999999999]]
Те же процедуры соответственно выполним для второго квестодателя:
notAonC = attitude(no(A), C)
AonnotC = attitude(A, no(C))
R2 = attitude_unite(notAonC, AonnotC)
y2 = composition(x, R2)
print('y2 = ', y2)
# >> y2 = [[0.5599999999999999, 0.3599999999999999, 0.3599999999999999]]
Восстановим из полученных векторов
y1 = [(y1[0][i], B[i][1]) for i in range(len(y1[0]))]
y2 = [(y2[0][i], C[i][1]) for i in range(len(y2[0]))]
Теперь у нас есть возможность посчитать индекс ранжирования для этих двух векторов и узнать приоритетного для сдачи игроком квеста NPC:
print('index = ', ranking_index(y1, y2))
# >> index = -0.020000000000000018
Малое отрицательное значение указывает на то, что
А на сегодня всё.