Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # ============================================================
- # Исходные данные
- # ============================================================
- # E1: ЕСЛИ (X проживает в Y) И (X является членом партии Z)
- # ТО X будет голосовать за кандидата B
- e1_conditions = [
- {"name": "X проживает в Y", "MD": 0.80, "MND": 0.30, "op": None},
- {"name": "X является членом партии Z","MD": 0.75, "MND": 0.25, "op": "AND"},
- ]
- # E2: ЕСЛИ (X имеет возраст T) ИЛИ (X является ИП)
- # ТО X будет голосовать за кандидата B
- e2_conditions = [
- {"name": "X имеет возраст T", "MD": 0.40, "MND": 0.50, "op": None},
- {"name": "X является ИП", "MD": 0.85, "MND": 0.20, "op": "OR"},
- ]
- hypothesis = "X будет голосовать за кандидата B"
- # ============================================================
- # Операторы нечёткой логики
- # ============================================================
- def fuzzy_and(md_a, mnd_a, md_b, mnd_b):
- """AND: MIN по MD, MAX по MND."""
- return min(md_a, md_b), max(mnd_a, mnd_b)
- def fuzzy_or(md_a, mnd_a, md_b, mnd_b):
- """OR: MAX по MD, MIN по MND."""
- return max(md_a, md_b), min(mnd_a, mnd_b)
- def fuzzy_not(md, mnd):
- """NOT: инвертируем обе меры."""
- return 1 - md, 1 - mnd
- # ============================================================
- # Вычисление MD и MND для одного предположения
- # (цепочка условий, связанных AND / OR)
- # ============================================================
- def evaluate_conditions(conditions, label):
- print(f"\n Вычисляем {label}:")
- print(f" {'─'*50}")
- # Начинаем с первого условия
- cur_md = conditions[0]["MD"]
- cur_mnd = conditions[0]["MND"]
- print(f" Условие 1: «{conditions[0]['name']}»")
- print(f" MD = {cur_md}")
- print(f" MND = {cur_mnd}")
- for cond in conditions[1:]:
- op = cond["op"]
- md_b = cond["MD"]
- mnd_b = cond["MND"]
- print(f"\n Оператор: {op}")
- print(f" Условие: «{cond['name']}»")
- print(f" MD = {md_b}")
- print(f" MND = {mnd_b}")
- if op == "AND":
- new_md, new_mnd = fuzzy_and(cur_md, cur_mnd, md_b, mnd_b)
- print(f"\n MD ({label}) = MIN({cur_md}, {md_b}) = {new_md}")
- print(f" MND({label}) = MAX({cur_mnd}, {mnd_b}) = {new_mnd}")
- elif op == "OR":
- new_md, new_mnd = fuzzy_or(cur_md, cur_mnd, md_b, mnd_b)
- print(f"\n MD ({label}) = MAX({cur_md}, {md_b}) = {new_md}")
- print(f" MND({label}) = MIN({cur_mnd}, {mnd_b}) = {new_mnd}")
- else:
- raise ValueError(f"Неизвестный оператор: {op}")
- cur_md, cur_mnd = new_md, new_mnd
- print(f"\n Итог {label}: MD = {cur_md}, MND = {cur_mnd}")
- return cur_md, cur_mnd
- # ============================================================
- # Комбинирование двух предположений
- # ============================================================
- def combine(md_e1, mnd_e1, md_e2, mnd_e2):
- """
- MD[H: E1,E2] = MD[H:E1] + MD[H:E2] × (1 - MD[H:E1])
- MND[H: E1,E2] = MND[H:E1] + MND[H:E2] × (1 - MND[H:E1])
- """
- md_combined = md_e1 + md_e2 * (1 - md_e1)
- mnd_combined = mnd_e1 + mnd_e2 * (1 - mnd_e1)
- return md_combined, mnd_combined
- # ============================================================
- # Коэффициент уверенности Шортлиффа
- # ============================================================
- def certainty_factor(md, mnd):
- """KU = MD - MND ∈ [-1, +1]"""
- return md - mnd
- def interpret_ku(ku):
- if ku > 0.8:
- return "очень высокая уверенность — гипотеза почти наверняка верна"
- elif ku > 0.5:
- return "высокая уверенность — гипотеза скорее верна"
- elif ku > 0.2:
- return "умеренная уверенность — гипотеза вероятно верна"
- elif ku > 0:
- return "слабая уверенность — гипотеза чуть вероятнее верна"
- elif ku == 0:
- return "нейтрально — ничего нельзя утверждать"
- elif ku > -0.2:
- return "слабое сомнение — гипотеза чуть вероятнее ложна"
- elif ku > -0.5:
- return "умеренное сомнение — гипотеза скорее ложна"
- else:
- return "высокое сомнение — гипотеза почти наверняка ложна"
- # ============================================================
- # Главная программа
- # ============================================================
- print("=" * 60)
- print(" НЕЧЁТКАЯ ЛОГИКА И КОЭФФИЦИЕНТ УВЕРЕННОСТИ (ШОРТЛИФФ)")
- print("=" * 60)
- print(f"\n Гипотеза H: «{hypothesis}»")
- # --- Шаг 1: вычислить MD и MND для E1 ---
- print("\n" + "=" * 60)
- print(" ШАГ 1. Вычисление MD и MND для предположения E1")
- print("=" * 60)
- print(" E1: ЕСЛИ", end="")
- for i, c in enumerate(e1_conditions):
- if i == 0:
- print(f" «{c['name']}»")
- else:
- print(f" {c['op']} «{c['name']}»")
- print(" ТО «" + hypothesis + "»")
- md_e1, mnd_e1 = evaluate_conditions(e1_conditions, "E1")
- ku_e1 = certainty_factor(md_e1, mnd_e1)
- print(f"\n KU[H:E1] = MD - MND = {md_e1} - {mnd_e1} = {ku_e1:.4f}")
- print(f" Интерпретация: {interpret_ku(ku_e1)}")
- # --- Шаг 2: вычислить MD и MND для E2 ---
- print("\n" + "=" * 60)
- print(" ШАГ 2. Вычисление MD и MND для предположения E2")
- print("=" * 60)
- print(" E2: ЕСЛИ", end="")
- for i, c in enumerate(e2_conditions):
- if i == 0:
- print(f" «{c['name']}»")
- else:
- print(f" {c['op']} «{c['name']}»")
- print(" ТО «" + hypothesis + "»")
- md_e2, mnd_e2 = evaluate_conditions(e2_conditions, "E2")
- ku_e2 = certainty_factor(md_e2, mnd_e2)
- print(f"\n KU[H:E2] = MD - MND = {md_e2} - {mnd_e2} = {ku_e2:.4f}")
- print(f" Интерпретация: {interpret_ku(ku_e2)}")
- # --- Шаг 3: комбинировать E1 и E2 ---
- print("\n" + "=" * 60)
- print(" ШАГ 3. Комбинирование E1 и E2")
- print("=" * 60)
- print(" Формулы:")
- print(" MD[H:E1,E2] = MD[H:E1] + MD[H:E2] × (1 - MD[H:E1])")
- print(" MND[H:E1,E2] = MND[H:E1] + MND[H:E2] × (1 - MND[H:E1])")
- print()
- md_combined, mnd_combined = combine(md_e1, mnd_e1, md_e2, mnd_e2)
- print(f" MD[H:E1,E2] = {md_e1} + {md_e2} × (1 - {md_e1})")
- print(f" = {md_e1} + {md_e2} × {1 - md_e1}")
- print(f" = {md_e1} + {md_e2 * (1 - md_e1):.4f}")
- print(f" = {md_combined:.4f}")
- print()
- print(f" MND[H:E1,E2] = {mnd_e1} + {mnd_e2} × (1 - {mnd_e1})")
- print(f" = {mnd_e1} + {mnd_e2} × {1 - mnd_e1:.4f}")
- print(f" = {mnd_e1} + {mnd_e2 * (1 - mnd_e1):.4f}")
- print(f" = {mnd_combined:.4f}")
- # --- Шаг 4: итоговый KU ---
- print("\n" + "=" * 60)
- print(" ШАГ 4. Итоговый коэффициент уверенности (Шортлифф)")
- print("=" * 60)
- ku_final = certainty_factor(md_combined, mnd_combined)
- print(f"\n KU[H:E1,E2] = MD[H:E1,E2] - MND[H:E1,E2]")
- print(f" = {md_combined:.4f} - {mnd_combined:.4f}")
- print(f" = {ku_final:.4f}")
- print()
- print(f" Диапазон KU: [-1, +1]")
- print(f" Интерпретация: {interpret_ku(ku_final)}")
- # --- Итоговая таблица ---
- print("\n" + "=" * 60)
- print(" ИТОГОВАЯ ТАБЛИЦА")
- print("=" * 60)
- col = 12
- print(f" {'':20} {'MD':>{col}} {'MND':>{col}} {'KU':>{col}}")
- print(f" {'─'*56}")
- print(f" {'E1':20} {md_e1:>{col}.4f} {mnd_e1:>{col}.4f} {ku_e1:>{col}.4f}")
- print(f" {'E2':20} {md_e2:>{col}.4f} {mnd_e2:>{col}.4f} {ku_e2:>{col}.4f}")
- print(f" {'─'*56}")
- print(f" {'E1 + E2 (итог)':20} {md_combined:>{col}.4f} {mnd_combined:>{col}.4f} {ku_final:>{col}.4f}")
- print()
- print(f" Вывод: гипотеза «{hypothesis}»")
- print(f" {interpret_ku(ku_final).upper()}")
Advertisement
Comments
-
- В БД хранятся правила вида:
- ЕСЛИ <условие> ТО <гипотеза>
- Каждое условие имеет:
- MD — мера доверия [0, 1]
- MND — мера недоверия [0, 1]
- Операторы нечёткой логики:
- AND → MD(A and B) = MIN(MD_A, MD_B)
- MND(A and B) = MAX(MND_A, MND_B)
- OR → MD(A or B) = MAX(MD_A, MD_B)
- MND(A or B) = MIN(MND_A, MND_B)
- NOT → MD(not A) = 1 - MD_A
- MND(not A) = 1 - MND_A
- Комбинирование двух предположений E1, E2:
- MD[H: E1,E2] = MD[H:E1] + MD[H:E2] × (1 - MD[H:E1])
- MND[H: E1,E2] = MND[H:E1] + MND[H:E2] × (1 - MND[H:E1])
- Коэффициент уверенности (Шортлифф):
- KU[H:E] = MD[H:E] - MND[H:E] ∈ [-1, +1]
Add Comment
Please, Sign In to add comment