Вычислительные эксперименты в моделировании волн-убийц
Практическое занятие "Матричные игры"
Цель занятия
Провести вычислительные эксперименты с матричными играми с целью исследования оптимальности смешанных стратегий.
Практическая задача
Рассмотрим матричные игры на примере детской игры "камень-ножницы-бумага". Это игра двух игроков с нулевой суммой. Смысл игры состоит в том, что два игрока одновременно выбирают одну из трех стратегий: камень, ножницы или бумага. Один игрок выигрывает у другого если
- он выбрал камень, а противник - ножницы
- он выбрал ножницы, а противник - бумага
- он выбрал бумага, а противник - камень
Если оба игрока выбрали одинаковую стратегию, то фиксируется ничья.
Теперь мы построим математическую модель данной игры. Множество стратегий состоит из трех стратегий
![S=\{\mbox{камень},\ \mbox{ножницы},\ \mbox{бумага}\}.](/sites/default/files/tex_cache/ccc1d9409127107ee3410ca4c7164b48.png)
![3\times3](/sites/default/files/tex_cache/0354d96c50c762db44e348bf0fe7f48b.png)
![A=\left(%
\begin{array}{ccc}
0 & -1 & 1 \\
1 & 0 & -1 \\
-1 & 1 & 0 \\
\end{array}%
\right)](/sites/default/files/tex_cache/672df637f888aee97c9d1f484f8bbae6.png)
![X=\left(\frac{1}{3},\frac{1}{3},\frac{1}{3}\right),](/sites/default/files/tex_cache/28aab5c253811c25a847292941faf2b4.png)
![Y=\left(\frac{1}{3},\frac{1}{3},\frac{1}{3}\right).](/sites/default/files/tex_cache/de49a6a0eb781dab2b468ec356e5dd50.png)
Для проверки проведем вычислительные эксперименты с нашей игрой. Построим класс который с помощью которого мы будем проводить вычислительные эксперименты.
![\begin{verbatim}
class TGame
{
protected double[,] A;
protected int m = 0, n = 0;
Random rnd;
public TGame()
{
rnd = new Random();
}
public double Calc(double[] X, double[] Y, int Count)
{
double res = 0;
int i, j;
for (int k = 0; k < Count; k++)
{
i = Release(X, m);
j = Release(Y, n);
res += GetAij(i, j);
}
return res / (double)Count;
}
\end{verbatim}](/sites/default/files/tex_cache/30a3121f8e862355eef1cbe3c49386ad.png)
![\begin{verbatim}
public int Release(double[] Z, int N)
{
double p = rnd.NextDouble();
double a = 0;
for (int i = 1; i <= N; i++)
{
a += Z[i];
if (p <= a)
{
return i;
}
}
return N;
}
public double GetAij(int i, int j)
{
return A[i, j];
}
public double GetC(double[] X, double[] Y)
{
double res = 0;
int i, j;
for (i = 1; i <= m; i++)
{
for (j = 1; j <= n; j++)
{
res += A[i, j] * X[i] * Y[j];
}
}
return res;
}
}
\end{verbatim}](/sites/default/files/tex_cache/1270a2ced27d51fed543fd2b9ebb001a.png)
![\begin{verbatim}
class TGame3 : TGame
{
public TGame3()
: base()
{
m = 3;
n = 3;
A = new double[4, 4];
A[1, 1] = 0;
A[1, 2] = -1;
A[1, 3] = 1;
A[2, 1] = 1;
A[2, 2] = 0;
A[2, 3] = -1;
A[3, 1] = -1;
A[3, 2] = 1;
A[3, 3] = 0;
}
}
\end{verbatim}](/sites/default/files/tex_cache/68fe3e5d225885acb6b94ca0975c1bb7.png)
Запускать нашу игру будем следующим образом.
![\begin{verbatim}
double[] X;
double[] Y;
double l3 = 1 / 3;
TGame3 Game3 = new TGame3();
X = new double[4] { 0, l3, l3, l3 };
Y = new double[4] { 0, l3, l3, l3 };
Console.WriteLine("Res = {0}", Game3.Calc(X, Y, 1000000));
\end{verbatim}](/sites/default/files/tex_cache/436ba901a4412bb483d996fabfdf6f93.png)
В данном случае мы используем оптимальные смешанные стратегии для
обоих игроков. Вот результат рассчитанной цены игры и результат
розыгрыша игр.
![Res = 0](/sites/default/files/tex_cache/668bef41b53d3fd99759ba9136b84073.png)