Матричные игры

Рассмотрим решение оптимизационных задач, связанных с матричными играми, с использованием R и LibreOffice

Постановка задачи

Удобным способом задания игры двух участников с нулевой суммой является платежная матрица. Отсюда, кстати, происходит еще одно их название — матричные игры. Каждый элемент платежной матрицы aij содержит числовое значение выигрыша игрока I (проигрыша игрока II), если первый применяет стратегию i, а второй —- стратегию j.

Термины выигрыш и проигрыш следует понимать в широком смысле, т. к. они могут принимать отрицательные значения и с житейской точки зрения означать противоположное. Нетривиальность задачи прежде всего заключается в том, что каждый из игроков делает свой выбор, не зная о выборе другого, что существенно осложняет процесс оптимизации выбираемой стратегии.

Пусть в игре участвуют первый и второй игрок, каждый из них может записать цифры 1,2,3. Если разница между цифрами положительна, то выигрывает первый игрок, если отрицательна, то второй. Число выигранных очков равно разности между цифрами.

(mtx<-matrix(c(0,1,2,-1,0,1,-2,1,0),ncol=3))
##      [,1] [,2] [,3]
## [1,]    0   -1   -2
## [2,]    1    0    1
## [3,]    2    1    0

Стратегия первого игрока

Наилучшая стратегия первого игрока. Если игрок выбирает стратегию 1, то в худшем случае он получает выигрыш

min(mtx[1,])
## [1] -2

Если стратегию 2

min(mtx[2,])
## [1] 0

Если стратегию 3

min(mtx[3,])
## [1] 0

Максимизируем свой минимальный выигрыш

max(min(mtx[1,]),min(mtx[2,]),min(mtx[3,]))
## [1] 0

Это величина \(\alpha\) – гарантированный выигрыш игрока A или нижняя цена игры. Сама стратегия называется максиминной.

Стратегия второго игрока

Второй игрок в худшем случае при стратегии 1 получит проигрыш

max(mtx[,1])
## [1] 2

При второй стратегии

max(mtx[,2])
## [1] 1

При третьей стратегии

max(mtx[,3])
## [1] 1

Минимизируем свой максимальный проигрыш/

min(max(mtx[,1]),max(mtx[,2]),max(mtx[,3]))
## [1] 1

Это величина \(\beta\) – гарантированный проигрыш игрока B или верхняя цена игры. Сама стратегия называется минимаксной.

Седловая точка

Для матричных игр справедливо неравенство \(\alpha \le \beta\)

Если \(\alpha=\beta=\nu\), то такая игра называется игрой с седловой точкой. Если платежная матрица не имеет седловой точки, то поиск решения приводит к сложной стратегии, состояшей в случайном применении двух и более стратегий с определенными частотами. такая сложная стратегия называется смешанной.

Упрощение матрицы

##      [,1] [,2] [,3] [,4] [,5]
## [1,]    8    6    4    4    3
## [2,]    5    3    2    2    1
## [3,]    4    7    7    3    5
## [4,]    5    3    2    2    1
## [5,]    1    4    4    2    3

Решение

(a<-apply(mtx,1,min))
## [1] 3 1 3 1 1
max(a)
## [1] 3
(b<-apply(mtx,2,max))
## [1] 8 7 7 4 5
min(b)
## [1] 4

\(3 \le \nu \le 4\)

mtx
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    8    6    4    4    3
## [2,]    5    3    2    2    1
## [3,]    4    7    7    3    5
## [4,]    5    3    2    2    1
## [5,]    1    4    4    2    3

Для первого игрока стратегии 2 и 4 одинаковы, Все эелементы стратегии 2 меньше стратегии 1, значит тоже можно исключить. Все элементы 5 стратегии меньше 3. Исключаем пятую стратегию.

mtx[c(1,3),]
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    8    6    4    4    3
## [2,]    4    7    7    3    5

Для второго игрока сравниваем 1 и 4, исключаем 1. Сравниваем 2 и 5, исключаем 2.

(mtx1<-mtx[c(1,3),c(3,4,5)])
##      [,1] [,2] [,3]
## [1,]    4    4    3
## [2,]    7    3    5
max(apply(mtx1,1,min))
## [1] 3
min(apply(mtx1,2,max))
## [1] 4

Решение матричных игр сведением к линейному программированию

Рассмотрим игру двух лиц с нулевой суммой заданную платежами

\[A = {\left\| {{a_{ij}}} \right\|_{m \times n}}\]

Применение первым игроком оптимальной стратегии должно обеспечить ему при любых действиях второго игрока выигрыш не менее цены игры

\[\sum\limits_{i = 1}^m {{a_{ij}}{x_{i\;\text{опт}}} \ge \nu ,\;j = \overline {1,n} } \]

Рассмотрим задачу отыскания оптимальной стратегии игрока при огрнаничениях

\[\left\{ {\begin{array}{} {{a_{11}}{x_1} + {a_{21}}{x_2} + \ldots + {a_{m1}}{x_m} \ge \nu }\\ {{a_{12}}{x_1} + {a_{22}}{x_2} + \ldots + {a_{m2}}{x_m} \ge \nu }\\ \cdots \\ {{a_{1n}}{x_1} + {a_{2n}}{x_2} + \ldots + {a_{mn}}{x_m} \ge \nu } \end{array}} \right.\]

Величина \(\nu\) неизвестна, однако можно считать что цена игры \(\nu>0\). Последнее условие выполняется всегда, если все элементы платежной матрицы неотрицательны, а это можно достигнуть прибавив ко всем элементам некую константу. Преобразуем ограничения поделив неравентва на \(\nu\).

\[\left\{ {\begin{array}{} {{a_{11}}{t_1} + {a_{21}}{t_2} + \ldots + {a_{m1}}{t_m} \ge 1}\\ {{a_{12}}{t_1} + {a_{22}}{t_2} + \ldots + {a_{m2}}{t_m} \ge 1}\\ \cdots \\ {{a_{1n}}{t_1} + {a_{2n}}{t_2} + \ldots + {a_{mn}}{t_m} \ge 1} \end{array}} \right.\]

где

\[{t_i} = \frac{{{x_i}}}{\nu } \ge 0\]

По условию \(x_1+x_2+\ldots +x_m=1\) (сумма вероятностей). Разделим обе части этого неравенства на \(\nu\).

\[t_1+t_2+\ldots +t_m=\frac{1}{\nu}\]

Оптимальная стратегия игрока A должна максимизировать величину \(\nu\), следовательно, функция:

\[L(\bar t) = \sum\limits_1^m {{t_i} \to \min } \]

Для второго игрока проигрыш не должен превышать цену игры. В результате имеем симметричную пару двойственных задач.

Пример решения в R

Дана матрица игры

##      [,1] [,2] [,3] [,4] [,5]
## [1,]    3    7    1    1    5
## [2,]    4    9    3    6    2
## [3,]    2    3    1    4    7
(a<-max(apply(mtx,1,min)))
## [1] 2
(b<-min(apply(mtx,2,max)))
## [1] 3

Игра не имеет седловой точки. Оптимальное решение следует искать в области смешанных стратегий.

library(lpSolve)
(result<-lp("min",c(1,1,1), t(mtx), rep(">=",5),c(1,1,1,1,1)))
## Success: the objective function is 0.3684211
result$objval
## [1] 0.3684211
result$solution
## [1] 0.00000000 0.31578947 0.05263158
(a<-result$solution/result$objval)
## [1] 0.0000000 0.8571429 0.1428571
(result<-lp("max",c(1,1,1,1,1), mtx, rep("<=",3),c(1,1,1)))
## Success: the objective function is 0.3684211
result$objval
## [1] 0.3684211
result$solution
## [1] 0.0000000 0.0000000 0.2631579 0.0000000 0.1052632
(b<-result$solution/result$objval)
## [1] 0.0000000 0.0000000 0.7142857 0.0000000 0.2857143

Таким образом цена игры равна 2.7142857, оптимальная стратегия A равна (0, 0.8571429, 0.1428571), оптимальная стратегия B равна (0, 0, 0.7142857, 0, 0.2857143).

Построение имитационной модели

Рассмотрим ситуацию, когда игроки не руководствуются стратегией, а действуют случайным образом. Для этого проведем численный эксперимент. Напишем функцию, которая будет случайным образом возвращать индекс стратегии:

# Функция, возвращающая индекс стратегии
get.k<-function(vec){
  cusum=0
  tst=runif(1)
  for(i in 1:length(vec)) {
   if(vec[i]==0) next
   cusum<-cusum+vec[i]
   if(tst>cusum) next
  return(i)
  }
}
set.seed(2015)
test<-c()
for(i in 1:1000) test=c(test,mtx[get.k(a),get.k(b)])

table(test)
## test
##   1   2   3   7 
##  86 221 656  37
summary(test)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.000   3.000   2.755   3.000   7.000

Пусть A выбирает стратегию случайно

test<-c()
for(i in 1:1000) test=c(test,mtx[sample(1:3, 1),get.k(b)])

table(test)
## test
##   1   2   3   5   7 
## 478  79 249  97  97
summary(test)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   2.000   2.547   3.000   7.000

Как видим, результат хуже. Аналогично рассмотрим вариант для B.

test<-c()
for(i in 1:1000) test=c(test,mtx[get.k(a),sample(1:5, 1)])

table(test)
## test
##   1   2   3   4   6   7   9 
##  22 183 211 203 164  22 195
summary(test)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   3.000   4.000   4.726   6.000   9.000

В этом случае, B проигрывает больше.

Решение в LibreOffice

Пример решения приведен в файле matrix.ods.

Решение сводится к решениям прямой и обратной задач линейного программирования с помощью встроенной системы Решатель.

Результаты получаются аналогичными вышеприведенному решению.