Solingen

lab6.py

Apr 9th, 2026
66
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.67 KB | None | 0 0
  1. # ============================================================
  2. # Исходные данные
  3. # ============================================================
  4.  
  5. # E1: ЕСЛИ (X проживает в Y) И (X является членом партии Z)
  6. #     ТО X будет голосовать за кандидата B
  7.  
  8. e1_conditions = [
  9.     {"name": "X проживает в Y",          "MD": 0.80, "MND": 0.30, "op": None},
  10.     {"name": "X является членом партии Z","MD": 0.75, "MND": 0.25, "op": "AND"},
  11. ]
  12.  
  13. # E2: ЕСЛИ (X имеет возраст T) ИЛИ (X является ИП)
  14. #     ТО X будет голосовать за кандидата B
  15.  
  16. e2_conditions = [
  17.     {"name": "X имеет возраст T", "MD": 0.40, "MND": 0.50, "op": None},
  18.     {"name": "X является ИП",     "MD": 0.85, "MND": 0.20, "op": "OR"},
  19. ]
  20.  
  21. hypothesis = "X будет голосовать за кандидата B"
  22.  
  23. # ============================================================
  24. # Операторы нечёткой логики
  25. # ============================================================
  26.  
  27. def fuzzy_and(md_a, mnd_a, md_b, mnd_b):
  28.     """AND: MIN по MD, MAX по MND."""
  29.     return min(md_a, md_b), max(mnd_a, mnd_b)
  30.  
  31. def fuzzy_or(md_a, mnd_a, md_b, mnd_b):
  32.     """OR: MAX по MD, MIN по MND."""
  33.     return max(md_a, md_b), min(mnd_a, mnd_b)
  34.  
  35. def fuzzy_not(md, mnd):
  36.     """NOT: инвертируем обе меры."""
  37.     return 1 - md, 1 - mnd
  38.  
  39. # ============================================================
  40. # Вычисление MD и MND для одного предположения
  41. # (цепочка условий, связанных AND / OR)
  42. # ============================================================
  43.  
  44. def evaluate_conditions(conditions, label):
  45.     print(f"\n  Вычисляем {label}:")
  46.     print(f"  {'─'*50}")
  47.  
  48.     # Начинаем с первого условия
  49.     cur_md  = conditions[0]["MD"]
  50.     cur_mnd = conditions[0]["MND"]
  51.     print(f"    Условие 1: «{conditions[0]['name']}»")
  52.     print(f"      MD  = {cur_md}")
  53.     print(f"      MND = {cur_mnd}")
  54.  
  55.     for cond in conditions[1:]:
  56.         op     = cond["op"]
  57.         md_b   = cond["MD"]
  58.         mnd_b  = cond["MND"]
  59.  
  60.         print(f"\n    Оператор: {op}")
  61.         print(f"    Условие:  «{cond['name']}»")
  62.         print(f"      MD  = {md_b}")
  63.         print(f"      MND = {mnd_b}")
  64.  
  65.         if op == "AND":
  66.             new_md, new_mnd = fuzzy_and(cur_md, cur_mnd, md_b, mnd_b)
  67.             print(f"\n      MD ({label})  = MIN({cur_md}, {md_b})  = {new_md}")
  68.             print(f"      MND({label}) = MAX({cur_mnd}, {mnd_b}) = {new_mnd}")
  69.         elif op == "OR":
  70.             new_md, new_mnd = fuzzy_or(cur_md, cur_mnd, md_b, mnd_b)
  71.             print(f"\n      MD ({label})  = MAX({cur_md}, {md_b})  = {new_md}")
  72.             print(f"      MND({label}) = MIN({cur_mnd}, {mnd_b}) = {new_mnd}")
  73.         else:
  74.             raise ValueError(f"Неизвестный оператор: {op}")
  75.  
  76.         cur_md, cur_mnd = new_md, new_mnd
  77.  
  78.     print(f"\n  Итог {label}: MD = {cur_md},  MND = {cur_mnd}")
  79.     return cur_md, cur_mnd
  80.  
  81. # ============================================================
  82. # Комбинирование двух предположений
  83. # ============================================================
  84.  
  85. def combine(md_e1, mnd_e1, md_e2, mnd_e2):
  86.     """
  87.    MD[H: E1,E2]  = MD[H:E1]  + MD[H:E2]  × (1 - MD[H:E1])
  88.    MND[H: E1,E2] = MND[H:E1] + MND[H:E2] × (1 - MND[H:E1])
  89.    """
  90.     md_combined  = md_e1  + md_e2  * (1 - md_e1)
  91.     mnd_combined = mnd_e1 + mnd_e2 * (1 - mnd_e1)
  92.     return md_combined, mnd_combined
  93.  
  94. # ============================================================
  95. # Коэффициент уверенности Шортлиффа
  96. # ============================================================
  97.  
  98. def certainty_factor(md, mnd):
  99.     """KU = MD - MND ∈ [-1, +1]"""
  100.     return md - mnd
  101.  
  102. def interpret_ku(ku):
  103.     if ku > 0.8:
  104.         return "очень высокая уверенность — гипотеза почти наверняка верна"
  105.     elif ku > 0.5:
  106.         return "высокая уверенность — гипотеза скорее верна"
  107.     elif ku > 0.2:
  108.         return "умеренная уверенность — гипотеза вероятно верна"
  109.     elif ku > 0:
  110.         return "слабая уверенность — гипотеза чуть вероятнее верна"
  111.     elif ku == 0:
  112.         return "нейтрально — ничего нельзя утверждать"
  113.     elif ku > -0.2:
  114.         return "слабое сомнение — гипотеза чуть вероятнее ложна"
  115.     elif ku > -0.5:
  116.         return "умеренное сомнение — гипотеза скорее ложна"
  117.     else:
  118.         return "высокое сомнение — гипотеза почти наверняка ложна"
  119.  
  120. # ============================================================
  121. # Главная программа
  122. # ============================================================
  123.  
  124. print("=" * 60)
  125. print("  НЕЧЁТКАЯ ЛОГИКА И КОЭФФИЦИЕНТ УВЕРЕННОСТИ (ШОРТЛИФФ)")
  126. print("=" * 60)
  127. print(f"\n  Гипотеза H: «{hypothesis}»")
  128.  
  129. # --- Шаг 1: вычислить MD и MND для E1 ---
  130. print("\n" + "=" * 60)
  131. print("  ШАГ 1. Вычисление MD и MND для предположения E1")
  132. print("=" * 60)
  133. print("  E1: ЕСЛИ", end="")
  134. for i, c in enumerate(e1_conditions):
  135.     if i == 0:
  136.         print(f" «{c['name']}»")
  137.     else:
  138.         print(f"       {c['op']} «{c['name']}»")
  139. print("       ТО «" + hypothesis + "»")
  140.  
  141. md_e1, mnd_e1 = evaluate_conditions(e1_conditions, "E1")
  142.  
  143. ku_e1 = certainty_factor(md_e1, mnd_e1)
  144. print(f"\n  KU[H:E1] = MD - MND = {md_e1} - {mnd_e1} = {ku_e1:.4f}")
  145. print(f"  Интерпретация: {interpret_ku(ku_e1)}")
  146.  
  147. # --- Шаг 2: вычислить MD и MND для E2 ---
  148. print("\n" + "=" * 60)
  149. print("  ШАГ 2. Вычисление MD и MND для предположения E2")
  150. print("=" * 60)
  151. print("  E2: ЕСЛИ", end="")
  152. for i, c in enumerate(e2_conditions):
  153.     if i == 0:
  154.         print(f" «{c['name']}»")
  155.     else:
  156.         print(f"       {c['op']} «{c['name']}»")
  157. print("       ТО «" + hypothesis + "»")
  158.  
  159. md_e2, mnd_e2 = evaluate_conditions(e2_conditions, "E2")
  160.  
  161. ku_e2 = certainty_factor(md_e2, mnd_e2)
  162. print(f"\n  KU[H:E2] = MD - MND = {md_e2} - {mnd_e2} = {ku_e2:.4f}")
  163. print(f"  Интерпретация: {interpret_ku(ku_e2)}")
  164.  
  165. # --- Шаг 3: комбинировать E1 и E2 ---
  166. print("\n" + "=" * 60)
  167. print("  ШАГ 3. Комбинирование E1 и E2")
  168. print("=" * 60)
  169. print("  Формулы:")
  170. print("    MD[H:E1,E2]  = MD[H:E1]  + MD[H:E2]  × (1 - MD[H:E1])")
  171. print("    MND[H:E1,E2] = MND[H:E1] + MND[H:E2] × (1 - MND[H:E1])")
  172. print()
  173.  
  174. md_combined, mnd_combined = combine(md_e1, mnd_e1, md_e2, mnd_e2)
  175.  
  176. print(f"    MD[H:E1,E2]  = {md_e1} + {md_e2} × (1 - {md_e1})")
  177. print(f"                 = {md_e1} + {md_e2} × {1 - md_e1}")
  178. print(f"                 = {md_e1} + {md_e2 * (1 - md_e1):.4f}")
  179. print(f"                 = {md_combined:.4f}")
  180. print()
  181. print(f"    MND[H:E1,E2] = {mnd_e1} + {mnd_e2} × (1 - {mnd_e1})")
  182. print(f"                 = {mnd_e1} + {mnd_e2} × {1 - mnd_e1:.4f}")
  183. print(f"                 = {mnd_e1} + {mnd_e2 * (1 - mnd_e1):.4f}")
  184. print(f"                 = {mnd_combined:.4f}")
  185.  
  186. # --- Шаг 4: итоговый KU ---
  187. print("\n" + "=" * 60)
  188. print("  ШАГ 4. Итоговый коэффициент уверенности (Шортлифф)")
  189. print("=" * 60)
  190.  
  191. ku_final = certainty_factor(md_combined, mnd_combined)
  192.  
  193. print(f"\n  KU[H:E1,E2] = MD[H:E1,E2] - MND[H:E1,E2]")
  194. print(f"              = {md_combined:.4f} - {mnd_combined:.4f}")
  195. print(f"              = {ku_final:.4f}")
  196. print()
  197. print(f"  Диапазон KU: [-1, +1]")
  198. print(f"  Интерпретация: {interpret_ku(ku_final)}")
  199.  
  200. # --- Итоговая таблица ---
  201. print("\n" + "=" * 60)
  202. print("  ИТОГОВАЯ ТАБЛИЦА")
  203. print("=" * 60)
  204. col = 12
  205. print(f"  {'':20} {'MD':>{col}} {'MND':>{col}} {'KU':>{col}}")
  206. print(f"  {'─'*56}")
  207. print(f"  {'E1':20} {md_e1:>{col}.4f} {mnd_e1:>{col}.4f} {ku_e1:>{col}.4f}")
  208. print(f"  {'E2':20} {md_e2:>{col}.4f} {mnd_e2:>{col}.4f} {ku_e2:>{col}.4f}")
  209. print(f"  {'─'*56}")
  210. print(f"  {'E1 + E2 (итог)':20} {md_combined:>{col}.4f} {mnd_combined:>{col}.4f} {ku_final:>{col}.4f}")
  211. print()
  212. print(f"  Вывод: гипотеза «{hypothesis}»")
  213. print(f"         {interpret_ku(ku_final).upper()}")
Advertisement
Comments
  • Solingen
    111 days
    # text 0.83 KB | 0 0
    1. В БД хранятся правила вида:
    2. ЕСЛИ <условие> ТО <гипотеза>
    3.  
    4. Каждое условие имеет:
    5. MD — мера доверия [0, 1]
    6. MND — мера недоверия [0, 1]
    7.  
    8. Операторы нечёткой логики:
    9. AND → MD(A and B) = MIN(MD_A, MD_B)
    10. MND(A and B) = MAX(MND_A, MND_B)
    11. OR → MD(A or B) = MAX(MD_A, MD_B)
    12. MND(A or B) = MIN(MND_A, MND_B)
    13. NOT → MD(not A) = 1 - MD_A
    14. MND(not A) = 1 - MND_A
    15.  
    16. Комбинирование двух предположений E1, E2:
    17. MD[H: E1,E2] = MD[H:E1] + MD[H:E2] × (1 - MD[H:E1])
    18. MND[H: E1,E2] = MND[H:E1] + MND[H:E2] × (1 - MND[H:E1])
    19.  
    20. Коэффициент уверенности (Шортлифф):
    21. KU[H:E] = MD[H:E] - MND[H:E] ∈ [-1, +1]
Add Comment
Please, Sign In to add comment