Skip to content

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.