| 3 | 5 | 2 | 2 | |
| 6 | 1 | 4 | 1 | |
| 2 | 3 | 6 | 2 | |
| 6 | 5 | 6 |
— седловой точки нет.
Проверим другой пример: — нет. Попробуем матрицу, где седловая точка есть.
| 8 | 3 | 5 | 3 | |
| 2 | 7 | 6 | 2 | |
| 4 | 1 | 9 | 1 | |
| 8 | 7 | 9 |
, . Нет седловой точки.
Правило: седловая точка существует, если некоторый элемент является одновременно минимумом в строке и максимумом в столбце.
| 3 | 5 | 6 | 3 | |
| 2 | 1 | 4 | 1 | |
| 7 | 3 | 5 | 3 | |
| 7 | 5 | 6 |
Всё ещё нет. Седловая точка — редкое явление. Если её нет — используем смешанные стратегии.
Смешанная стратегия — вероятностное распределение на множестве чистых стратегий.
Игрок выбирает с вероятностью :
Игрок выбирает с вероятностью :
При смешанных стратегиях и математическое ожидание выигрыша:
Теорема фон Неймана (1928):
Всякая конечная антагонистическая игра имеет решение в смешанных стратегиях:
Теорема: — цена игры в смешанных стратегиях.
Оптимальные смешанные стратегии , и цена — решение игры.
Платёжная матрица:
Игрок выбирает с вероятностью , — с вероятностью .
Ожидаемый выигрыш при ответе :
Принцип: игрок выбирает так, чтобы (уравнивание выигрышей):
Из уравнения :
Цена игры:
Проверим чистые стратегии:
— седловой точки нет. Решаем в смешанных стратегиях.
Ответ: , ,
Если играет : ✓
Если играет : ✓
Если играет : ✓
Если играет : ✓
Независимо от стратегии противника — выигрыш равен цене игры .
Для игры задача поиска оптимальной смешанной стратегии сводится к паре двойственных задач ЛП.
Задача игрока (максимизация):
где .
Задача игрока (минимизация):
где .
По теореме двойственности: .
Пусть , тогда и задача игрока :
Алгоритм:
Все . Задача игрока :
Решение: , .
Стратегия доминирует , если для всех (и хотя бы для одного строго).
Доминируемую стратегию можно исключить — она никогда не войдёт в оптимальную смешанную стратегию.
Пример:
доминирует (строго по ). Исключаем :
import numpy as np
from scipy.optimize import linprog
def solve_game_2x2(matrix):
a = np.array(matrix)
p = (a[1,1] - a[1,0]) / ((a[0,0] - a[0,1]) + (a[1,1] - a[1,0]))
q = (a[1,1] - a[0,1]) / ((a[0,0] - a[1,0]) + (a[1,1] - a[0,1]))
v = p * a[0,0] + (1 - p) * a[1,0]
return {'p': [p, 1-p], 'q': [q, 1-q], 'v': v}
r = solve_game_2x2([[3, 1], [2, 4]])
print(f"p={r['p']}, q={r['q']}, v={r['v']}")
# p=[0.5, 0.5], q=[0.75, 0.25], v=2.5
def solve_game_lp(payoff):
m, n = np.array(payoff).shape
A = np.array(payoff)
if A.min() <= 0:
A = A - A.min() + 1
c = -np.ones(m)
Aub = -A.T
bub = -np.ones(n)
res = linprog(c, A_ub=Aub, b_ub=bub, bounds=(0, None))
v = 1 / res.fun
p = v * res.x
return {'p': p, 'v': v}
r = solve_game_lp([[3, 1, 5], [2, 4, 3], [1, 6, 2]])
print(f"p={r['p']}, v={r['v']}")
Теория игр — математическая модель конфликтных ситуаций
Антагонистическая игра описывается платёжной матрицей
Нижняя цена (максимин) верхняя цена (минимакс)
Седловая точка — частный случай; обычно нужны смешанные стратегии
Теорема фон Неймана: решение всегда существует в смешанных стратегиях
Общая задача сводится к паре двойственных задач ЛП
Основная литература:
Дополнительная литература:
Онлайн-ресурсы:
Кратко пробегитесь по плану: начнём с основных понятий и классификации игр, затем антагонистические игры, стратегии и принципы оптимальности, после — биматричные игры и их связь с ЛП, завершим программной реализацией.
Дайте определение: теория игр изучает принятие решений в условиях конфликта, когда результат зависит от действий нескольких сторон.
Перечислите основные элементы игры.
Классификация игр по различным признакам. Подчеркните: одна и та же игра может быть отнесена к нескольким классам.
Сосредоточьтесь на антагонистических играх — это основа курса.
Введите понятие чистых стратегий и объясните принцип максимина/минимакса.
Решите пример с седловой точкой — покажите, как найти её в матрице.
Подчеркните: седловая точка в чистых стратегиях — исключение, а не правило. Поэтому нужен аппарат смешанных стратегий.
Решите игру 2×2 аналитически — это базовый навык.
Перейдите к общей игре m×n. Объясните, что она сводится к двум задачам ЛП — взаимно двойственным.
Подведите итоги и покажите программную реализацию.