04 — Функції належності¶
🇬🇧 English | 🇺🇦 Українська
Функція належності визначає значення μ(x) у межах [0,1]. Параметри кожної форми редагуються іменованими полями, тому порядок анонімного масиву запам’ятовувати не потрібно.
Вбудовані форми¶
| Форма | Параметри | Застосування |
|---|---|---|
| Triangle | Left, Peak, Right |
Універсальна множина з одним максимумом. Край можна сумістити з піком для вертикального боку. |
| Trapezoid | LeftFoot, LeftShoulder, RightShoulder, RightFoot |
Плато повної належності; зручне для понять «нормальний діапазон». |
| Gaussian | Center, Sigma |
Гладка симетрична форма без зламів. Sigma керує шириною. |
| Bell | Center, Width, Slope |
Узагальнений дзвін із керованою пласкістю вершини та крутістю країв. |
| Sigmoid | Center, Slope |
Плавний перехід від 0 до 1. Від’ємний Slope дзеркально розвертає форму. |
| Ramp | Foot, Shoulder |
Лінійне зростання або спадання з насиченням на краях. |
| JShape | Threshold, Steepness |
Нуль до порога, потім плавне зростання від самого нуля. |
| Singleton | Value, Tolerance |
Вузька імпульсна множина для дискретного або майже дискретного результату. |
| Constant | Level |
Однаковий ступінь належності в усьому діапазоні. |
Інверсія¶
Кожна форма має прапорець Inverted. Він замінює ступінь на 1 - μ(x). Так з однієї форми можна отримати спадний J-профіль, виріз у Bell або протилежний Ramp.
NOT у правилі також доповнює ступінь. Відмінність у місці авторингу: Inverted змінює саму множину всюди, а NOT — лише конкретне твердження правила.
Як вибирати форму¶
- Починайте з
TriangleіTrapezoid: їх легко читати та налаштовувати. - Використовуйте
RampабоSigmoidдля понять «чим більше, тим сильніше». - Обирайте
GaussianабоBell, якщо похідна має бути гладкою. Singletonнайкраще поєднується зWeighted Averageдля швидких майже Sugeno-подібних систем.Constantкорисний для постійної передумови або фіксованого альфа-зрізу.
Перекриття й покриття¶
Сусідні множини зазвичай мають перекриватися. Перетин поблизу ступеня 0.5 часто дає передбачуване плавне змішування. Точне значення залежить від задачі.
Якщо між множинами залишається проміжок, жодне правило може не спрацювати. Якщо всі множини надто широкі, рішення стає нечутливим. Перевіряйте форми на вкладках Variables та Inference.
Власна форма на C++¶
Створіть USTRUCT, успадкований від FFuzzyMembershipFunction, і реалізуйте EvaluateRaw:
USTRUCT(BlueprintType, DisplayName = "Cosine Lobe")
struct FMyMF_CosineLobe : public FFuzzyMembershipFunction
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Fuzzy Logic")
float Center = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Fuzzy Logic")
float HalfWidth = 1.0f;
virtual float EvaluateRaw(float X) const override
{
const float T = (X - Center) / FMath::Max(HalfWidth, UE_KINDA_SMALL_NUMBER);
return FMath::Abs(T) >= 1.0f ? 0.0f
: 0.5f * (1.0f + FMath::Cos(T * UE_PI));
}
};
Редактор, JSON-серіалізація, реєстр типів і засоби малювання знаходять похідну структуру через рефлексію. За потреби перевизначте GetSupport, GetRepresentativeValue, Validate та ToDisplayString.