maxim_shlyahtin

idz4

Jan 28th, 2024
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.73 KB | None | 0 0
  1. from random import *
  2. import numpy as np
  3.  
  4. num_games = 100
  5.  
  6. source_matrix = [[2, -3],
  7.                  [-1, 2]]
  8.  
  9. result_of_players_choice = {(0, 0): 2, (0, 1): -3, (1, 0): -1, (1, 1): 2}  # результаты выбора
  10.  
  11. sensor = lambda p: 0 if random() < p else 1
  12.  
  13.  
  14. def stats_list(stats_matrix):
  15.     games = [(sensor(prob_a), sensor(prob_b)) for _ in range(num_games)]  # генерируем вектор пар (0, 1)
  16.     return [stats_matrix[game] for game in games]
  17.  
  18.  
  19. ave_ = lambda stats: np.mean(stats) # находим средний выигрыш
  20.  
  21.  
  22. def math_exp(matrix, probe_A, probe_B): # находим матожидание
  23.     return matrix[0][0] * probe_A * probe_B + matrix[0][1] * probe_A * (1 - probe_B) + \
  24.         matrix[1][0] * (1 - probe_A) * probe_B + matrix[1][1] * (1 - probe_A) * (1 - probe_B)
  25.  
  26.  
  27. def variance_f(expected_stats, probe_A, prob_b): # находим дисперсию
  28.     sqr = lambda x, y: (x - y) ** 2
  29.     variance = (sqr(result_of_players_choice[(0, 0)], expected_stats)) * probe_A * prob_b + \
  30.                (sqr(result_of_players_choice[(0, 1)], expected_stats)) * probe_A * (1 - prob_b) + \
  31.                (sqr(result_of_players_choice[(1, 0)], expected_stats)) * (1 - probe_A) * prob_b + \
  32.                (sqr(result_of_players_choice[(1, 1)], expected_stats)) * (1 - probe_A) * (1 - prob_b)
  33.     return variance
  34.  
  35.  
  36. def run_games(probe_A, probe_B):
  37.     stats = stats_list(result_of_players_choice)
  38.     average_stats = ave_(stats)
  39.     math_exp_stats = math_exp(source_matrix, probe_A, probe_B)
  40.     std_deviation = np.std(stats)
  41.     variance = variance_f(math_exp_stats, probe_A, probe_B)
  42.     theoretical_std_deviation = np.std(list(result_of_players_choice.values()))
  43.     print(f"Средний выигрыш/проигрыш игрока {average_stats}")
  44.     print(f"Матожидание: {math_exp_stats}")
  45.     print(f"Среднеквадратичное отклонение: {std_deviation}")
  46.     print(f"Дисперсия: {variance}")
  47.     print(f"Cреднеквадратичное отклонение (теоретическое): {theoretical_std_deviation}")
  48.  
  49.  
  50. def reinforcement_learning(num_games=100):
  51.     red, blue = 10, 10
  52.     probe_A = red / (red + blue)
  53.     probe_B = 0.25
  54.     for _ in range(num_games):
  55.         choice_A = sensor(probe_A)
  56.         choice_B = sensor(probe_B)
  57.         gain = source_matrix[choice_A][choice_B]
  58.         if gain >= 0:
  59.             if choice_A == 0:
  60.                 red += gain
  61.             else:
  62.                 blue += gain
  63.         probe_A = red / (red + blue)
  64.     print(f"Вероятность выбора первой строки игроком А после обучения: {1 - probe_A}.")
  65.     run_games(probe_A, probe_B)
  66.  
  67.  
  68. def learning_with_punishment(num_games=100):
  69.     red, blue = 100, 100
  70.     probe_A = red / (red + blue)
  71.     probe_B = 0.25
  72.  
  73.     for _ in range(num_games):
  74.         choice_A = sensor(probe_A)
  75.         choice_B = sensor(probe_B)
  76.         gain = source_matrix[choice_A][choice_B]
  77.         if choice_A == 0:
  78.             red += gain
  79.         else:
  80.             blue += gain
  81.     probe_A = red / (red + blue)
  82.     print(f"Вероятность выбора первой строки игроком А после обучения: {1 - probe_A}.")
  83.     run_games(probe_A, probe_B)
  84.  
  85.  
  86. def reinforcement_learning_2(num_games=100):
  87.     red_A, blue_A = 10, 10
  88.     red_B, blue_B = 10, 10
  89.  
  90.     probe_A = red_A / (red_A + blue_A)
  91.     probe_B = red_B / (red_B + blue_B)
  92.  
  93.     for i in range(num_games):
  94.         choice_A = sensor(probe_A)
  95.         choice_B = sensor(probe_B)
  96.         gain = source_matrix[choice_A][choice_B]
  97.         if gain >= 0:
  98.             if choice_A == 0:
  99.                 red_A += gain
  100.             else:
  101.                 blue_A += gain
  102.         else:
  103.             if choice_B == 0:
  104.                 red_B += -gain
  105.             else:
  106.                 blue_B += -gain
  107.     probe_A = red_A / (red_A + blue_A)
  108.     probe_B = red_B / (red_B + blue_B)
  109.  
  110.     print(f"Вероятность выбора первой строки игроком А после обучения: {1 - probe_A}.")
  111.     print(f"Вероятность выбора первой строки игроком B после обучения: {1 - probe_B}.")
  112.     run_games(probe_A, probe_B)
  113.  
  114.  
  115. print("\nЗадание 2\n")
  116. prob_a = 0.5
  117. prob_b = 0.5
  118. run_games(prob_a, prob_b)
  119.  
  120. print("\nЗадание 3\n")
  121. prob_a = 0.5
  122. prob_b = 0.25
  123. run_games(prob_a, prob_b)
  124.  
  125. print("\nОбучение с подкреплением:\n")
  126. reinforcement_learning()
  127. print("\n")
  128. print("Обучение с наказанием:\n")
  129. learning_with_punishment()
  130. print("\n")
  131. print("Обучение с подкреплением 2:\n")
  132. reinforcement_learning_2()
  133.  
Add Comment
Please, Sign In to add comment