2016-12-28 23:54:51 +01:00
|
|
|
|
\chapter{Game theory}
|
|
|
|
|
|
2017-01-15 19:42:46 +01:00
|
|
|
|
In this chapter, we will focus on games where
|
|
|
|
|
two players make alternate moves and that
|
|
|
|
|
do not contain random elements.
|
|
|
|
|
Our goal is to find a strategy that we can
|
|
|
|
|
follow to win the game
|
|
|
|
|
no matter what the opponent does,
|
|
|
|
|
if such a strategy exists.
|
|
|
|
|
|
|
|
|
|
It turns out that there is a general strategy
|
|
|
|
|
for all such games,
|
|
|
|
|
and we can analyze the games using the \key{nim theory}.
|
|
|
|
|
First, we analyze simple games where
|
|
|
|
|
players remove sticks from heaps,
|
|
|
|
|
and after this, we generalize the strategy
|
|
|
|
|
for those games to all other games.
|
|
|
|
|
|
|
|
|
|
\section{Game states}
|
|
|
|
|
|
|
|
|
|
Let's consider a game where there is initially
|
|
|
|
|
a heap of $n$ sticks.
|
|
|
|
|
Players $A$ and $B$ move alternatively,
|
|
|
|
|
and player $A$ begins.
|
|
|
|
|
On each move, the player has to remove
|
|
|
|
|
1, 2 or 3 sticks from the heap.
|
|
|
|
|
The player who removes the last stick wins.
|
|
|
|
|
|
|
|
|
|
For example, if $n=10$, the game may proceed as follows:
|
2016-12-28 23:54:51 +01:00
|
|
|
|
\begin{enumerate}[noitemsep]
|
2017-01-15 19:42:46 +01:00
|
|
|
|
\item Player $A$ removes 2 sticks (8 sticks left).
|
|
|
|
|
\item Player $B$ removes 3 sticks (5 sticks left).
|
|
|
|
|
\item Player $A$ removes 1 stick (4 sticks left).
|
|
|
|
|
\item Player $B$ removes 2 sticks (2 sticks left).
|
|
|
|
|
\item Player $A$ removes 2 sticks and wins.
|
2016-12-28 23:54:51 +01:00
|
|
|
|
\end{enumerate}
|
2017-01-15 19:42:46 +01:00
|
|
|
|
This game consists of states $0,1,2,\ldots,n$,
|
|
|
|
|
where the number of the state corresponds to
|
|
|
|
|
the number of sticks left.
|
|
|
|
|
The player must always choose how many sticks
|
|
|
|
|
they will remove from the heap.
|
|
|
|
|
|
|
|
|
|
\subsubsection{Winning and losing states}
|
|
|
|
|
|
|
|
|
|
\index{winning state}
|
|
|
|
|
\index{losing state}
|
|
|
|
|
|
|
|
|
|
A \key{winning state} is a state where
|
|
|
|
|
the player wins the game if they
|
|
|
|
|
play optimally.
|
|
|
|
|
Correspondingly, a \key{losing state} is a state
|
|
|
|
|
where the player loses if the
|
|
|
|
|
opponent plays optimally.
|
|
|
|
|
It turns out that we can classify all states
|
|
|
|
|
in a game so that each state is either
|
|
|
|
|
a winning state or a losing state.
|
|
|
|
|
|
|
|
|
|
In the above game, state 0 is clearly a
|
|
|
|
|
losing state, because the player can't make
|
|
|
|
|
any moves.
|
|
|
|
|
States 1, 2 and 3 are winning states,
|
|
|
|
|
because we can remove 1, 2 or 3 sticks
|
|
|
|
|
and win the game.
|
|
|
|
|
State 4, in turn, is a losing state,
|
|
|
|
|
because any move leads to a state that
|
|
|
|
|
is a winning state for the opponent.
|
|
|
|
|
|
|
|
|
|
More generally, if there is a move that leads
|
|
|
|
|
from the current state to a losing state,
|
|
|
|
|
the current state is a winning state,
|
|
|
|
|
and otherwise it is a losing state.
|
|
|
|
|
Using this observation, we can classify all states
|
|
|
|
|
in a game beginning from losing states where
|
|
|
|
|
there are no possible moves.
|
|
|
|
|
|
|
|
|
|
The states $0 \ldots 15$ of the above game
|
|
|
|
|
can be classified as follows
|
|
|
|
|
($W$ means winning state, and $L$ means losing state):
|
2016-12-28 23:54:51 +01:00
|
|
|
|
\begin{center}
|
|
|
|
|
\begin{tikzpicture}[scale=0.7]
|
|
|
|
|
\draw (0,0) grid (16,1);
|
|
|
|
|
|
2017-01-15 19:42:46 +01:00
|
|
|
|
\node at (0.5,0.5) {$L$};
|
|
|
|
|
\node at (1.5,0.5) {$W$};
|
|
|
|
|
\node at (2.5,0.5) {$W$};
|
|
|
|
|
\node at (3.5,0.5) {$W$};
|
|
|
|
|
\node at (4.5,0.5) {$L$};
|
|
|
|
|
\node at (5.5,0.5) {$W$};
|
|
|
|
|
\node at (6.5,0.5) {$W$};
|
|
|
|
|
\node at (7.5,0.5) {$W$};
|
|
|
|
|
\node at (8.5,0.5) {$L$};
|
|
|
|
|
\node at (9.5,0.5) {$W$};
|
|
|
|
|
\node at (10.5,0.5) {$W$};
|
|
|
|
|
\node at (11.5,0.5) {$W$};
|
|
|
|
|
\node at (12.5,0.5) {$L$};
|
|
|
|
|
\node at (13.5,0.5) {$W$};
|
|
|
|
|
\node at (14.5,0.5) {$W$};
|
|
|
|
|
\node at (15.5,0.5) {$W$};
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
|
|
|
|
\footnotesize
|
|
|
|
|
\node at (0.5,1.4) {$0$};
|
|
|
|
|
\node at (1.5,1.4) {$1$};
|
|
|
|
|
\node at (2.5,1.4) {$2$};
|
|
|
|
|
\node at (3.5,1.4) {$3$};
|
|
|
|
|
\node at (4.5,1.4) {$4$};
|
|
|
|
|
\node at (5.5,1.4) {$5$};
|
|
|
|
|
\node at (6.5,1.4) {$6$};
|
|
|
|
|
\node at (7.5,1.4) {$7$};
|
|
|
|
|
\node at (8.5,1.4) {$8$};
|
|
|
|
|
\node at (9.5,1.4) {$9$};
|
|
|
|
|
\node at (10.5,1.4) {$10$};
|
|
|
|
|
\node at (11.5,1.4) {$11$};
|
|
|
|
|
\node at (12.5,1.4) {$12$};
|
|
|
|
|
\node at (13.5,1.4) {$13$};
|
|
|
|
|
\node at (14.5,1.4) {$14$};
|
|
|
|
|
\node at (15.5,1.4) {$15$};
|
|
|
|
|
\end{tikzpicture}
|
|
|
|
|
\end{center}
|
|
|
|
|
|
2017-01-15 19:42:46 +01:00
|
|
|
|
It's easy to analyze this game:
|
|
|
|
|
a state $k$ is a losing state if $k$ is
|
|
|
|
|
divisible by 4, and otherwise it
|
|
|
|
|
is winning state.
|
|
|
|
|
An optimal way to play the game is
|
|
|
|
|
to always choose a move after which
|
|
|
|
|
the number of sticks in the heap
|
|
|
|
|
is divisible by 4.
|
|
|
|
|
Finally, there are no sticks left and
|
|
|
|
|
the opponent has lost.
|
|
|
|
|
|
|
|
|
|
Of course, this strategy requires that
|
|
|
|
|
the number of sticks is \emph{not} divisible by 4
|
|
|
|
|
when it is our move.
|
|
|
|
|
If it is, there is nothing we can do,
|
|
|
|
|
but the opponent will win the game if
|
|
|
|
|
they play optimally.
|
|
|
|
|
|
|
|
|
|
\subsubsection{State graph}
|
|
|
|
|
|
|
|
|
|
Let's now consider another stick game,
|
|
|
|
|
where in state $k$, it is allowed to remove
|
|
|
|
|
any number $x$ of sticks such that $x$
|
|
|
|
|
is smaller than $x$ and divides $x$.
|
|
|
|
|
For example, in state 8 we may remove
|
|
|
|
|
1, 2 or 4 sticks, but in state 7 the only
|
|
|
|
|
allowed move is to remove 1 stick.
|
|
|
|
|
|
|
|
|
|
The following picture shows the states
|
|
|
|
|
$1 \ldots 9$ of the game as a \key{state graph},
|
|
|
|
|
where nodes are states and edges are moves between them:
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
|
|
|
|
\begin{center}
|
|
|
|
|
\begin{tikzpicture}[scale=0.9]
|
|
|
|
|
\node[draw, circle] (1) at (0,0) {$1$};
|
|
|
|
|
\node[draw, circle] (2) at (2,0) {$2$};
|
|
|
|
|
\node[draw, circle] (3) at (3.5,-1) {$3$};
|
|
|
|
|
\node[draw, circle] (4) at (1.5,-2) {$4$};
|
|
|
|
|
\node[draw, circle] (5) at (3,-2.75) {$5$};
|
|
|
|
|
\node[draw, circle] (6) at (2.5,-4.5) {$6$};
|
|
|
|
|
\node[draw, circle] (7) at (0.5,-3.25) {$7$};
|
|
|
|
|
\node[draw, circle] (8) at (-1,-4) {$8$};
|
|
|
|
|
\node[draw, circle] (9) at (1,-5.5) {$9$};
|
|
|
|
|
|
|
|
|
|
\path[draw,thick,->,>=latex] (2) -- (1);
|
|
|
|
|
\path[draw,thick,->,>=latex] (3) edge [bend right=20] (2);
|
|
|
|
|
\path[draw,thick,->,>=latex] (4) edge [bend left=20] (2);
|
|
|
|
|
\path[draw,thick,->,>=latex] (4) edge [bend left=20] (3);
|
|
|
|
|
\path[draw,thick,->,>=latex] (5) edge [bend right=20] (4);
|
|
|
|
|
\path[draw,thick,->,>=latex] (6) edge [bend left=20] (5);
|
|
|
|
|
\path[draw,thick,->,>=latex] (6) edge [bend left=20] (4);
|
|
|
|
|
\path[draw,thick,->,>=latex] (6) edge [bend right=40] (3);
|
|
|
|
|
\path[draw,thick,->,>=latex] (7) edge [bend right=20] (6);
|
|
|
|
|
\path[draw,thick,->,>=latex] (8) edge [bend right=20] (7);
|
|
|
|
|
\path[draw,thick,->,>=latex] (8) edge [bend right=20] (6);
|
|
|
|
|
\path[draw,thick,->,>=latex] (8) edge [bend left=20] (4);
|
|
|
|
|
\path[draw,thick,->,>=latex] (9) edge [bend left=20] (8);
|
|
|
|
|
\path[draw,thick,->,>=latex] (9) edge [bend right=20] (6);
|
|
|
|
|
\end{tikzpicture}
|
|
|
|
|
\end{center}
|
|
|
|
|
|
2017-01-15 19:42:46 +01:00
|
|
|
|
The final state in this game is always state 1,
|
|
|
|
|
which is a losing state, because there are no
|
|
|
|
|
valid moves.
|
|
|
|
|
The classification of states $1 \ldots 9$
|
|
|
|
|
is as follows:
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
|
|
|
|
\begin{center}
|
|
|
|
|
\begin{tikzpicture}[scale=0.7]
|
|
|
|
|
\draw (1,0) grid (10,1);
|
|
|
|
|
|
2017-01-15 19:42:46 +01:00
|
|
|
|
\node at (1.5,0.5) {$L$};
|
|
|
|
|
\node at (2.5,0.5) {$W$};
|
|
|
|
|
\node at (3.5,0.5) {$L$};
|
|
|
|
|
\node at (4.5,0.5) {$W$};
|
|
|
|
|
\node at (5.5,0.5) {$L$};
|
|
|
|
|
\node at (6.5,0.5) {$W$};
|
|
|
|
|
\node at (7.5,0.5) {$L$};
|
|
|
|
|
\node at (8.5,0.5) {$W$};
|
|
|
|
|
\node at (9.5,0.5) {$L$};
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
|
|
|
|
\footnotesize
|
|
|
|
|
\node at (1.5,1.4) {$1$};
|
|
|
|
|
\node at (2.5,1.4) {$2$};
|
|
|
|
|
\node at (3.5,1.4) {$3$};
|
|
|
|
|
\node at (4.5,1.4) {$4$};
|
|
|
|
|
\node at (5.5,1.4) {$5$};
|
|
|
|
|
\node at (6.5,1.4) {$6$};
|
|
|
|
|
\node at (7.5,1.4) {$7$};
|
|
|
|
|
\node at (8.5,1.4) {$8$};
|
|
|
|
|
\node at (9.5,1.4) {$9$};
|
|
|
|
|
\end{tikzpicture}
|
|
|
|
|
\end{center}
|
|
|
|
|
|
2017-01-15 19:42:46 +01:00
|
|
|
|
Surprisingly enough, in this game,
|
|
|
|
|
all even-numbered states are winning states,
|
|
|
|
|
and all odd-numbered states are losing states.
|
|
|
|
|
|
|
|
|
|
\section{Nim game}
|
|
|
|
|
|
|
|
|
|
\index{nim game}
|
|
|
|
|
|
|
|
|
|
The \key{nim game} is a simple game that
|
|
|
|
|
has an important role in game theory,
|
|
|
|
|
because many games can be played using
|
|
|
|
|
the same strategy.
|
|
|
|
|
First, we focus on nim,
|
|
|
|
|
and then we generalize the strategy
|
|
|
|
|
to other games.
|
|
|
|
|
|
|
|
|
|
There are $n$ heaps in nim,
|
|
|
|
|
and each heap contains some number of sticks.
|
|
|
|
|
The players move alternatively,
|
|
|
|
|
and on each turn, the player chooses
|
|
|
|
|
a heap that still contains sticks
|
|
|
|
|
and removes any number of sticks from it.
|
|
|
|
|
The winner is the player who removes the last stick.
|
|
|
|
|
|
|
|
|
|
The states in nim are of the form
|
|
|
|
|
$[x_1,x_2,\ldots,x_n]$,
|
|
|
|
|
where $x_k$ denotes the number of sticks in heap $k$.
|
|
|
|
|
For example, $[10,12,5]$ is a game where
|
|
|
|
|
there are three heaps with 10, 12 and 5 sticks.
|
|
|
|
|
The state $[0,0,\ldots,0]$ is a losing state,
|
|
|
|
|
because it's not possible to remove any sticks,
|
|
|
|
|
and this is always the final state.
|
|
|
|
|
|
|
|
|
|
\subsubsection{Analysis}
|
|
|
|
|
\index{nim sum}
|
|
|
|
|
|
|
|
|
|
It turns out that we can easily find out
|
|
|
|
|
the type of any nim state by calculating
|
|
|
|
|
a \key{nim sum} $x_1 \oplus x_2 \oplus \cdots \oplus x_n$,
|
|
|
|
|
where $\oplus$ is the xor operation.
|
|
|
|
|
The states with nim sum 0 are losing states,
|
|
|
|
|
and all other states are winning states.
|
|
|
|
|
For example, the nim sum for
|
|
|
|
|
$[10,12,5]$ is $10 \oplus 12 \oplus 5 = 3$,
|
|
|
|
|
so the state is a winning state.
|
|
|
|
|
|
|
|
|
|
But how is the nim sum related to the nim game?
|
|
|
|
|
We can explain this by studying how the nim
|
|
|
|
|
sum changes when the nim state changes.
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
|
|
|
|
~\\
|
|
|
|
|
\noindent
|
2017-01-15 19:42:46 +01:00
|
|
|
|
\textit{Losing states:}
|
|
|
|
|
The final state $[0,0,\ldots,0]$ is a losing state,
|
|
|
|
|
and its nim sum is 0, as expected.
|
|
|
|
|
In other losing states, any move leads to
|
|
|
|
|
a winning state, because when a single value $x_k$ changes,
|
|
|
|
|
the nim sum also changes, so the nim sum
|
|
|
|
|
is different from 0 after the move.
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
|
|
|
|
~\\
|
|
|
|
|
\noindent
|
2017-01-15 19:42:46 +01:00
|
|
|
|
\textit{Winning states:}
|
|
|
|
|
We can move to a losing state if
|
|
|
|
|
there is any heap $k$ for which $x_k \oplus s < x_k$.
|
|
|
|
|
In this case, we can remove sticks from
|
|
|
|
|
heap $k$ so that it will contain $x_k \oplus s$ sticks,
|
|
|
|
|
which will lead to a losing state.
|
|
|
|
|
There is always such a heap, where $x_k$
|
|
|
|
|
has a one bit in position of the leftmost
|
|
|
|
|
one bit in $s$.
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
|
|
|
|
~\\
|
|
|
|
|
\noindent
|
2017-01-15 19:42:46 +01:00
|
|
|
|
As an example, let's consider the state $[10,2,5]$.
|
|
|
|
|
This state is a winning state,
|
|
|
|
|
because its nim sum is 3.
|
|
|
|
|
Thus, there has to be a move which
|
|
|
|
|
leads to a losing state.
|
|
|
|
|
Next we will find out such a move.
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
|
|
|
|
\begin{samepage}
|
2017-01-15 19:42:46 +01:00
|
|
|
|
The nim sum of the state is as follows:
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
|
|
|
|
\begin{center}
|
|
|
|
|
\begin{tabular}{r|r}
|
|
|
|
|
10 & \texttt{1010} \\
|
|
|
|
|
12 & \texttt{1100} \\
|
|
|
|
|
5 & \texttt{0101} \\
|
|
|
|
|
\hline
|
|
|
|
|
3 & \texttt{0011} \\
|
|
|
|
|
\end{tabular}
|
|
|
|
|
\end{center}
|
|
|
|
|
\end{samepage}
|
|
|
|
|
|
2017-01-15 19:42:46 +01:00
|
|
|
|
In this case, the heap with 10 sticks
|
|
|
|
|
is the only heap that has a one bit
|
|
|
|
|
in the position of the leftmost
|
|
|
|
|
one bit in the nim sum:
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
|
|
|
|
\begin{center}
|
|
|
|
|
\begin{tabular}{r|r}
|
|
|
|
|
10 & \texttt{10\textcircled{1}0} \\
|
|
|
|
|
12 & \texttt{1100} \\
|
|
|
|
|
5 & \texttt{0101} \\
|
|
|
|
|
\hline
|
|
|
|
|
3 & \texttt{00\textcircled{1}1} \\
|
|
|
|
|
\end{tabular}
|
|
|
|
|
\end{center}
|
|
|
|
|
|
2017-01-15 19:42:46 +01:00
|
|
|
|
The new size of the heap has to be
|
|
|
|
|
$10 \oplus 3 = 9$,
|
|
|
|
|
so we will remove just one stick.
|
|
|
|
|
After this, the state will be $[9,12,5]$,
|
|
|
|
|
which is a losing state:
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
|
|
|
|
\begin{center}
|
|
|
|
|
\begin{tabular}{r|r}
|
|
|
|
|
9 & \texttt{1001} \\
|
|
|
|
|
12 & \texttt{1100} \\
|
|
|
|
|
5 & \texttt{0101} \\
|
|
|
|
|
\hline
|
|
|
|
|
0 & \texttt{0000} \\
|
|
|
|
|
\end{tabular}
|
|
|
|
|
\end{center}
|
|
|
|
|
|
2017-01-15 19:42:46 +01:00
|
|
|
|
\subsubsection{Misère game}
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
2017-01-15 19:42:46 +01:00
|
|
|
|
\index{misère game}
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
2017-01-15 19:42:46 +01:00
|
|
|
|
In a \key{misère game}, the goal is opposite,
|
|
|
|
|
so the player who removes the last stick
|
|
|
|
|
loses the game.
|
|
|
|
|
It turns out that a misère nim game can be
|
|
|
|
|
optimally played almost like the standard nim game.
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
2017-01-15 19:42:46 +01:00
|
|
|
|
The idea is to first play the misère game
|
|
|
|
|
like a standard game, but change the strategy
|
|
|
|
|
at the end of the game.
|
|
|
|
|
The new strategy will be used when after the next move,
|
|
|
|
|
each heap would contain at most one stick.
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
2017-01-15 19:42:46 +01:00
|
|
|
|
In the standard game, we should choose a move
|
|
|
|
|
after which there is an even number of heaps with one stick.
|
|
|
|
|
However, in the misère game, we choose a move so that
|
|
|
|
|
there is an odd number of heaps with one stick.
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
2017-01-15 19:42:46 +01:00
|
|
|
|
This strategy works because the state where the
|
|
|
|
|
strategy changes always appears in a game,
|
|
|
|
|
and this state is a winning state, because
|
|
|
|
|
it contains exactly one heap that has more than one stick,
|
|
|
|
|
so the nim sum is not 0.
|
2016-12-28 23:54:51 +01:00
|
|
|
|
|
|
|
|
|
\section{Sprague–Grundyn lause}
|
|
|
|
|
|
|
|
|
|
\index{Sprague–Grundyn lause}
|
|
|
|
|
|
|
|
|
|
\key{Sprague–Grundyn lause} yleistää nim-pelin strategian
|
|
|
|
|
kaikkiin peleihin, jotka täyttävät
|
|
|
|
|
seuraavat vaatimukset:
|
|
|
|
|
|
|
|
|
|
\begin{itemize}[noitemsep]
|
|
|
|
|
\item Pelissä on kaksi pelaajaa, jotka tekevät vuorotellen siirtoja.
|
|
|
|
|
\item Peli muodostuu tiloista ja mahdolliset siirrot tilasta
|
|
|
|
|
eivät riipu siitä, kumpi pelaaja on vuorossa.
|
|
|
|
|
\item Peli päättyy, kun toinen pelaaja ei voi tehdä siirtoa.
|
|
|
|
|
\item Peli päättyy varmasti ennemmin tai myöhemmin.
|
|
|
|
|
\item Pelaajien saatavilla on kaikki tieto tiloista
|
|
|
|
|
ja siirroista, eikä pelissä ole satunnaisuutta.
|
|
|
|
|
\end{itemize}
|
|
|
|
|
Ideana on laskea kullekin pelin tilalle Grundy-luku,
|
|
|
|
|
joka vastaa tikkujen määrää nim-pelin kasassa.
|
|
|
|
|
Kun kaikkien tilojen Grundy-luvut ovat tiedossa,
|
|
|
|
|
peliä voi pelata aivan kuin se olisi nim-peli.
|
|
|
|
|
|
|
|
|
|
\subsubsection{Grundy-luku}
|
|
|
|
|
|
|
|
|
|
\index{Grundy-luku}
|
|
|
|
|
\index{mex-funktio}
|
|
|
|
|
|
|
|
|
|
Pelin tilan \key{Grundy-luku} määritellään rekursiivisesti
|
|
|
|
|
kaavalla
|
|
|
|
|
\[\textrm{mex}(\{g_1,g_2,\ldots,g_n\}),\]
|
|
|
|
|
jossa $g_1,g_2,\ldots,g_n$ ovat niiden tilojen
|
|
|
|
|
Grundy-luvut, joihin tilasta pääsee yhdellä siirrolla,
|
|
|
|
|
ja funktio mex antaa pienimmän ei-negatiivisen
|
|
|
|
|
luvun, jota ei esiinny joukossa.
|
|
|
|
|
Esimerkiksi $\textrm{mex}(\{0,1,3\})=2$.
|
|
|
|
|
Jos tilasta ei voi tehdä mitään siirtoa,
|
|
|
|
|
sen Grundy-luku on 0, koska $\textrm{mex}(\emptyset)=0$.
|
|
|
|
|
|
|
|
|
|
Esimerkiksi tilaverkossa
|
|
|
|
|
\begin{center}
|
|
|
|
|
\begin{tikzpicture}[scale=0.9]
|
|
|
|
|
\node[draw, circle] (1) at (0,0) {\phantom{0}};
|
|
|
|
|
\node[draw, circle] (2) at (2,0) {\phantom{0}};
|
|
|
|
|
\node[draw, circle] (3) at (4,0) {\phantom{0}};
|
|
|
|
|
\node[draw, circle] (4) at (1,-2) {\phantom{0}};
|
|
|
|
|
\node[draw, circle] (5) at (3,-2) {\phantom{0}};
|
|
|
|
|
\node[draw, circle] (6) at (5,-2) {\phantom{0}};
|
|
|
|
|
|
|
|
|
|
\path[draw,thick,->,>=latex] (2) -- (1);
|
|
|
|
|
\path[draw,thick,->,>=latex] (3) -- (2);
|
|
|
|
|
\path[draw,thick,->,>=latex] (5) -- (4);
|
|
|
|
|
\path[draw,thick,->,>=latex] (6) -- (5);
|
|
|
|
|
\path[draw,thick,->,>=latex] (4) -- (1);
|
|
|
|
|
\path[draw,thick,->,>=latex] (4) -- (2);
|
|
|
|
|
\path[draw,thick,->,>=latex] (5) -- (2);
|
|
|
|
|
\path[draw,thick,->,>=latex] (6) -- (2);
|
|
|
|
|
\end{tikzpicture}
|
|
|
|
|
\end{center}
|
|
|
|
|
Grundy-luvut ovat seuraavat:
|
|
|
|
|
\begin{center}
|
|
|
|
|
\begin{tikzpicture}[scale=0.9]
|
|
|
|
|
\node[draw, circle] (1) at (0,0) {0};
|
|
|
|
|
\node[draw, circle] (2) at (2,0) {1};
|
|
|
|
|
\node[draw, circle] (3) at (4,0) {0};
|
|
|
|
|
\node[draw, circle] (4) at (1,-2) {2};
|
|
|
|
|
\node[draw, circle] (5) at (3,-2) {0};
|
|
|
|
|
\node[draw, circle] (6) at (5,-2) {2};
|
|
|
|
|
|
|
|
|
|
\path[draw,thick,->,>=latex] (2) -- (1);
|
|
|
|
|
\path[draw,thick,->,>=latex] (3) -- (2);
|
|
|
|
|
\path[draw,thick,->,>=latex] (5) -- (4);
|
|
|
|
|
\path[draw,thick,->,>=latex] (6) -- (5);
|
|
|
|
|
\path[draw,thick,->,>=latex] (4) -- (1);
|
|
|
|
|
\path[draw,thick,->,>=latex] (4) -- (2);
|
|
|
|
|
\path[draw,thick,->,>=latex] (5) -- (2);
|
|
|
|
|
\path[draw,thick,->,>=latex] (6) -- (2);
|
|
|
|
|
\end{tikzpicture}
|
|
|
|
|
\end{center}
|
|
|
|
|
Jos tila on häviötila, sen Grundy-luku on 0.
|
|
|
|
|
Jos taas tila on voittotila, sen Grundy-luku
|
|
|
|
|
on jokin positiivinen luku.
|
|
|
|
|
|
|
|
|
|
Grundy-luvun hyötynä on,
|
|
|
|
|
että se vastaa tikkujen määrää nim-kasassa.
|
|
|
|
|
Jos Grundy-luku on 0, niin tilasta pääsee vain tiloihin,
|
|
|
|
|
joiden Grundy-luku ei ole 0.
|
|
|
|
|
Jos taas Grundy-luku on $x>0$, niin tilasta pääsee tiloihin,
|
|
|
|
|
joiden Grundy-luvut kattavat välin $0,1,\ldots,x-1$.
|
|
|
|
|
|
|
|
|
|
~\\
|
|
|
|
|
\noindent
|
|
|
|
|
Tarkastellaan esimerkkinä peliä,
|
|
|
|
|
jossa pelaajat siirtävät vuorotellen
|
|
|
|
|
pelihahmoa sokkelossa.
|
|
|
|
|
Jokainen sokkelon ruutu on lattiaa tai seinää.
|
|
|
|
|
Kullakin siirrolla hahmon tulee liikkua jokin
|
|
|
|
|
määrä askeleita vasemmalle tai jokin
|
|
|
|
|
määrä askeleita ylöspäin.
|
|
|
|
|
Pelin voittaja on se, joka tekee viimeisen siirron.
|
|
|
|
|
|
|
|
|
|
\begin{samepage}
|
|
|
|
|
Esimerkiksi seuraavassa on pelin mahdollinen aloitustilanne,
|
|
|
|
|
jossa @ on pelihahmo ja * merkitsee ruutua, johon hahmo voi siirtyä.
|
|
|
|
|
|
|
|
|
|
\begin{center}
|
|
|
|
|
\begin{tikzpicture}[scale=.65]
|
|
|
|
|
\begin{scope}
|
|
|
|
|
\fill [color=black] (0, 1) rectangle (1, 2);
|
|
|
|
|
\fill [color=black] (0, 3) rectangle (1, 4);
|
|
|
|
|
\fill [color=black] (2, 2) rectangle (3, 3);
|
|
|
|
|
\fill [color=black] (2, 4) rectangle (3, 5);
|
|
|
|
|
\fill [color=black] (4, 3) rectangle (5, 4);
|
|
|
|
|
|
|
|
|
|
\draw (0, 0) grid (5, 5);
|
|
|
|
|
|
|
|
|
|
\node at (4.5,0.5) {@};
|
|
|
|
|
\node at (3.5,0.5) {*};
|
|
|
|
|
\node at (2.5,0.5) {*};
|
|
|
|
|
\node at (1.5,0.5) {*};
|
|
|
|
|
\node at (0.5,0.5) {*};
|
|
|
|
|
\node at (4.5,1.5) {*};
|
|
|
|
|
\node at (4.5,2.5) {*};
|
|
|
|
|
|
|
|
|
|
\end{scope}
|
|
|
|
|
\end{tikzpicture}
|
|
|
|
|
\end{center}
|
|
|
|
|
\end{samepage}
|
|
|
|
|
|
|
|
|
|
Sokkelopelin tiloja ovat kaikki sokkelon
|
|
|
|
|
lattiaruudut. Tässä tapauksessa
|
|
|
|
|
tilojen Grundy-luvut ovat seuraavat:
|
|
|
|
|
|
|
|
|
|
\begin{center}
|
|
|
|
|
\begin{tikzpicture}[scale=.65]
|
|
|
|
|
\begin{scope}
|
|
|
|
|
\fill [color=black] (0, 1) rectangle (1, 2);
|
|
|
|
|
\fill [color=black] (0, 3) rectangle (1, 4);
|
|
|
|
|
\fill [color=black] (2, 2) rectangle (3, 3);
|
|
|
|
|
\fill [color=black] (2, 4) rectangle (3, 5);
|
|
|
|
|
\fill [color=black] (4, 3) rectangle (5, 4);
|
|
|
|
|
|
|
|
|
|
\draw (0, 0) grid (5, 5);
|
|
|
|
|
|
|
|
|
|
\node at (0.5,4.5) {0};
|
|
|
|
|
\node at (1.5,4.5) {1};
|
|
|
|
|
\node at (2.5,4.5) {};
|
|
|
|
|
\node at (3.5,4.5) {0};
|
|
|
|
|
\node at (4.5,4.5) {1};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,3.5) {};
|
|
|
|
|
\node at (1.5,3.5) {0};
|
|
|
|
|
\node at (2.5,3.5) {1};
|
|
|
|
|
\node at (3.5,3.5) {2};
|
|
|
|
|
\node at (4.5,3.5) {};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,2.5) {0};
|
|
|
|
|
\node at (1.5,2.5) {2};
|
|
|
|
|
\node at (2.5,2.5) {};
|
|
|
|
|
\node at (3.5,2.5) {1};
|
|
|
|
|
\node at (4.5,2.5) {0};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,1.5) {};
|
|
|
|
|
\node at (1.5,1.5) {3};
|
|
|
|
|
\node at (2.5,1.5) {0};
|
|
|
|
|
\node at (3.5,1.5) {4};
|
|
|
|
|
\node at (4.5,1.5) {1};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,0.5) {0};
|
|
|
|
|
\node at (1.5,0.5) {4};
|
|
|
|
|
\node at (2.5,0.5) {1};
|
|
|
|
|
\node at (3.5,0.5) {3};
|
|
|
|
|
\node at (4.5,0.5) {2};
|
|
|
|
|
\end{scope}
|
|
|
|
|
\end{tikzpicture}
|
|
|
|
|
\end{center}
|
|
|
|
|
|
|
|
|
|
Tämän seurauksena sokkelopelin
|
|
|
|
|
tila käyttäytyy
|
|
|
|
|
samalla tavalla kuin nim-pelin kasa.
|
|
|
|
|
Esimerkiksi oikean alakulman ruudun
|
|
|
|
|
Grundy-luku on 2,
|
|
|
|
|
joten kyseessä on voittotila.
|
|
|
|
|
Voittoon johtava siirto on joko liikkua neljä
|
|
|
|
|
askelta vasemmalle tai kaksi askelta ylöspäin.
|
|
|
|
|
|
|
|
|
|
Huomaa, että toisin kuin alkuperäisessä nim-pelissä,
|
|
|
|
|
tilasta saattaa päästä toiseen tilaan,
|
|
|
|
|
jonka Grundy-luku on suurempi.
|
|
|
|
|
Vastustaja voi kuitenkin aina peruuttaa
|
|
|
|
|
tällaisen siirron niin,
|
|
|
|
|
että Grundy-luku palautuu samaksi.
|
|
|
|
|
|
|
|
|
|
\subsubsection{Alipelit}
|
|
|
|
|
|
|
|
|
|
Oletetaan seuraavaksi, että peli muodostuu
|
|
|
|
|
alipeleistä ja jokaisella vuorolla
|
|
|
|
|
pelaaja valitsee jonkin alipeleistä ja
|
|
|
|
|
tekee siirron siinä.
|
|
|
|
|
Peli päättyy, kun missään alipelissä ei
|
|
|
|
|
pysty tekemään siirtoa.
|
|
|
|
|
|
|
|
|
|
Nyt pelin tilan Grundy-luku on alipelien
|
|
|
|
|
Grundy-lukujen nim-summa.
|
|
|
|
|
Peliä pystyy pelaamaan nim-pelin
|
|
|
|
|
tapaan selvittämällä kaikkien alipelien Grundy-luvut
|
|
|
|
|
ja laskemalla niiden nim-summa.
|
|
|
|
|
|
|
|
|
|
~\\
|
|
|
|
|
\noindent
|
|
|
|
|
Tarkastellaan esimerkkinä kolmen sokkelon peliä.
|
|
|
|
|
Tässä pelissä pelaaja valitsee joka siirrolla
|
|
|
|
|
yhden sokkeloista ja siirtää siinä olevaa hahmoa.
|
|
|
|
|
Pelin aloitustilanne voi olla seuraavanlainen:
|
|
|
|
|
|
|
|
|
|
\begin{center}
|
|
|
|
|
\begin{tabular}{ccc}
|
|
|
|
|
\begin{tikzpicture}[scale=.55]
|
|
|
|
|
\begin{scope}
|
|
|
|
|
\fill [color=black] (0, 1) rectangle (1, 2);
|
|
|
|
|
\fill [color=black] (0, 3) rectangle (1, 4);
|
|
|
|
|
\fill [color=black] (2, 2) rectangle (3, 3);
|
|
|
|
|
\fill [color=black] (2, 4) rectangle (3, 5);
|
|
|
|
|
\fill [color=black] (4, 3) rectangle (5, 4);
|
|
|
|
|
|
|
|
|
|
\draw (0, 0) grid (5, 5);
|
|
|
|
|
|
|
|
|
|
\node at (4.5,0.5) {@};
|
|
|
|
|
|
|
|
|
|
\end{scope}
|
|
|
|
|
\end{tikzpicture}
|
|
|
|
|
&
|
|
|
|
|
\begin{tikzpicture}[scale=.55]
|
|
|
|
|
\begin{scope}
|
|
|
|
|
\fill [color=black] (1, 1) rectangle (2, 3);
|
|
|
|
|
\fill [color=black] (2, 3) rectangle (3, 4);
|
|
|
|
|
\fill [color=black] (4, 4) rectangle (5, 5);
|
|
|
|
|
|
|
|
|
|
\draw (0, 0) grid (5, 5);
|
|
|
|
|
|
|
|
|
|
\node at (4.5,0.5) {@};
|
|
|
|
|
|
|
|
|
|
\end{scope}
|
|
|
|
|
\end{tikzpicture}
|
|
|
|
|
&
|
|
|
|
|
\begin{tikzpicture}[scale=.55]
|
|
|
|
|
\begin{scope}
|
|
|
|
|
\fill [color=black] (1, 1) rectangle (4, 4);
|
|
|
|
|
|
|
|
|
|
\draw (0, 0) grid (5, 5);
|
|
|
|
|
|
|
|
|
|
\node at (4.5,0.5) {@};
|
|
|
|
|
\end{scope}
|
|
|
|
|
\end{tikzpicture}
|
|
|
|
|
\end{tabular}
|
|
|
|
|
\end{center}
|
|
|
|
|
|
|
|
|
|
Sokkeloiden ruutujen Grundy-luvut ovat:
|
|
|
|
|
|
|
|
|
|
\begin{center}
|
|
|
|
|
\begin{tabular}{ccc}
|
|
|
|
|
\begin{tikzpicture}[scale=.55]
|
|
|
|
|
\begin{scope}
|
|
|
|
|
\fill [color=black] (0, 1) rectangle (1, 2);
|
|
|
|
|
\fill [color=black] (0, 3) rectangle (1, 4);
|
|
|
|
|
\fill [color=black] (2, 2) rectangle (3, 3);
|
|
|
|
|
\fill [color=black] (2, 4) rectangle (3, 5);
|
|
|
|
|
\fill [color=black] (4, 3) rectangle (5, 4);
|
|
|
|
|
|
|
|
|
|
\draw (0, 0) grid (5, 5);
|
|
|
|
|
|
|
|
|
|
\node at (0.5,4.5) {0};
|
|
|
|
|
\node at (1.5,4.5) {1};
|
|
|
|
|
\node at (2.5,4.5) {};
|
|
|
|
|
\node at (3.5,4.5) {0};
|
|
|
|
|
\node at (4.5,4.5) {1};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,3.5) {};
|
|
|
|
|
\node at (1.5,3.5) {0};
|
|
|
|
|
\node at (2.5,3.5) {1};
|
|
|
|
|
\node at (3.5,3.5) {2};
|
|
|
|
|
\node at (4.5,3.5) {};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,2.5) {0};
|
|
|
|
|
\node at (1.5,2.5) {2};
|
|
|
|
|
\node at (2.5,2.5) {};
|
|
|
|
|
\node at (3.5,2.5) {1};
|
|
|
|
|
\node at (4.5,2.5) {0};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,1.5) {};
|
|
|
|
|
\node at (1.5,1.5) {3};
|
|
|
|
|
\node at (2.5,1.5) {0};
|
|
|
|
|
\node at (3.5,1.5) {4};
|
|
|
|
|
\node at (4.5,1.5) {1};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,0.5) {0};
|
|
|
|
|
\node at (1.5,0.5) {4};
|
|
|
|
|
\node at (2.5,0.5) {1};
|
|
|
|
|
\node at (3.5,0.5) {3};
|
|
|
|
|
\node at (4.5,0.5) {2};
|
|
|
|
|
\end{scope}
|
|
|
|
|
\end{tikzpicture}
|
|
|
|
|
&
|
|
|
|
|
\begin{tikzpicture}[scale=.55]
|
|
|
|
|
\begin{scope}
|
|
|
|
|
\fill [color=black] (1, 1) rectangle (2, 3);
|
|
|
|
|
\fill [color=black] (2, 3) rectangle (3, 4);
|
|
|
|
|
\fill [color=black] (4, 4) rectangle (5, 5);
|
|
|
|
|
|
|
|
|
|
\draw (0, 0) grid (5, 5);
|
|
|
|
|
|
|
|
|
|
\node at (0.5,4.5) {0};
|
|
|
|
|
\node at (1.5,4.5) {1};
|
|
|
|
|
\node at (2.5,4.5) {2};
|
|
|
|
|
\node at (3.5,4.5) {3};
|
|
|
|
|
\node at (4.5,4.5) {};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,3.5) {1};
|
|
|
|
|
\node at (1.5,3.5) {0};
|
|
|
|
|
\node at (2.5,3.5) {};
|
|
|
|
|
\node at (3.5,3.5) {0};
|
|
|
|
|
\node at (4.5,3.5) {1};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,2.5) {2};
|
|
|
|
|
\node at (1.5,2.5) {};
|
|
|
|
|
\node at (2.5,2.5) {0};
|
|
|
|
|
\node at (3.5,2.5) {1};
|
|
|
|
|
\node at (4.5,2.5) {2};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,1.5) {3};
|
|
|
|
|
\node at (1.5,1.5) {};
|
|
|
|
|
\node at (2.5,1.5) {1};
|
|
|
|
|
\node at (3.5,1.5) {2};
|
|
|
|
|
\node at (4.5,1.5) {0};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,0.5) {4};
|
|
|
|
|
\node at (1.5,0.5) {0};
|
|
|
|
|
\node at (2.5,0.5) {2};
|
|
|
|
|
\node at (3.5,0.5) {5};
|
|
|
|
|
\node at (4.5,0.5) {3};
|
|
|
|
|
\end{scope}
|
|
|
|
|
\end{tikzpicture}
|
|
|
|
|
&
|
|
|
|
|
\begin{tikzpicture}[scale=.55]
|
|
|
|
|
\begin{scope}
|
|
|
|
|
\fill [color=black] (1, 1) rectangle (4, 4);
|
|
|
|
|
|
|
|
|
|
\draw (0, 0) grid (5, 5);
|
|
|
|
|
|
|
|
|
|
\node at (0.5,4.5) {0};
|
|
|
|
|
\node at (1.5,4.5) {1};
|
|
|
|
|
\node at (2.5,4.5) {2};
|
|
|
|
|
\node at (3.5,4.5) {3};
|
|
|
|
|
\node at (4.5,4.5) {4};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,3.5) {1};
|
|
|
|
|
\node at (1.5,3.5) {};
|
|
|
|
|
\node at (2.5,3.5) {};
|
|
|
|
|
\node at (3.5,3.5) {};
|
|
|
|
|
\node at (4.5,3.5) {0};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,2.5) {2};
|
|
|
|
|
\node at (1.5,2.5) {};
|
|
|
|
|
\node at (2.5,2.5) {};
|
|
|
|
|
\node at (3.5,2.5) {};
|
|
|
|
|
\node at (4.5,2.5) {1};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,1.5) {3};
|
|
|
|
|
\node at (1.5,1.5) {};
|
|
|
|
|
\node at (2.5,1.5) {};
|
|
|
|
|
\node at (3.5,1.5) {};
|
|
|
|
|
\node at (4.5,1.5) {2};
|
|
|
|
|
|
|
|
|
|
\node at (0.5,0.5) {4};
|
|
|
|
|
\node at (1.5,0.5) {0};
|
|
|
|
|
\node at (2.5,0.5) {1};
|
|
|
|
|
\node at (3.5,0.5) {2};
|
|
|
|
|
\node at (4.5,0.5) {3};
|
|
|
|
|
\end{scope}
|
|
|
|
|
\end{tikzpicture}
|
|
|
|
|
\end{tabular}
|
|
|
|
|
\end{center}
|
|
|
|
|
|
|
|
|
|
Aloitustilanteessa Grundy-lukujen nim-summa on
|
|
|
|
|
$2 \oplus 3 \oplus 3 = 2$, joten
|
|
|
|
|
aloittaja pystyy voittamaan pelin.
|
|
|
|
|
Voittoon johtava siirto on liikkua vasemmassa sokkelossa
|
|
|
|
|
2 askelta ylöspäin, jolloin nim-summaksi
|
|
|
|
|
tulee $0 \oplus 3 \oplus 3 = 0$.
|
|
|
|
|
|
|
|
|
|
\subsubsection{Jakautuminen}
|
|
|
|
|
|
|
|
|
|
Joskus siirto pelissä jakaa pelin alipeleihin,
|
|
|
|
|
jotka ovat toisistaan riippumattomia.
|
|
|
|
|
Tällöin pelin Grundy-luku on
|
|
|
|
|
|
|
|
|
|
\[\textrm{mex}(\{g_1, g_2, \ldots, g_n \}),\]
|
|
|
|
|
missä $n$ on siirtojen määrä ja
|
|
|
|
|
\[g_k = a_{k,1} \oplus a_{k,2} \oplus \ldots \oplus a_{k,m},\]
|
|
|
|
|
missä siirron $k$ tuottamien alipelien
|
|
|
|
|
Grundy-luvut ovat $a_{k,1},a_{k,2},\ldots,a_{k,m}$.
|
|
|
|
|
|
|
|
|
|
\index{Grundyn peli@Grundyn peli}
|
|
|
|
|
|
|
|
|
|
Esimerkki tällaisesta pelistä on \key{Grundyn peli}.
|
|
|
|
|
Pelin alkutilanteessa on yksittäinen kasa, jossa on $n$ tikkua.
|
|
|
|
|
Joka vuorolla pelaaja valitsee jonkin kasan
|
|
|
|
|
ja jakaa sen kahdeksi epätyhjäksi kasaksi
|
|
|
|
|
niin, että kasoissa on eri määrä tikkuja.
|
|
|
|
|
Pelin voittaja on se, joka tekee viimeisen jaon.
|
|
|
|
|
|
|
|
|
|
Merkitään $f(n)$ Grundy-lukua kasalle,
|
|
|
|
|
jossa on $n$ tikkua.
|
|
|
|
|
Grundy-luku muodostuu käymällä läpi tavat
|
|
|
|
|
jakaa kasa kahdeksi kasaksi.
|
|
|
|
|
Esimerkiksi tapauksessa $n=8$ mahdolliset jakotavat
|
|
|
|
|
ovat $1+7$, $2+6$ ja $3+5$, joten
|
|
|
|
|
\[f(8)=\textrm{mex}(\{f(1) \oplus f(7), f(2) \oplus f(6), f(3) \oplus f(5)\}).\]
|
|
|
|
|
|
|
|
|
|
Tässä pelissä luvun $f(n)$ laskeminen vaatii lukujen
|
|
|
|
|
$f(1),\ldots,f(n-1)$ laskemista.
|
|
|
|
|
Pohjatapauksina $f(1)=f(2)=0$, koska 1 ja 2 tikun
|
|
|
|
|
kasaa ei ole mahdollista jakaa mitenkään.
|
|
|
|
|
Ensimmäiset Grundy-luvut ovat:
|
|
|
|
|
\[
|
|
|
|
|
\begin{array}{lcl}
|
|
|
|
|
f(1) & = & 0 \\
|
|
|
|
|
f(2) & = & 0 \\
|
|
|
|
|
f(3) & = & 1 \\
|
|
|
|
|
f(4) & = & 0 \\
|
|
|
|
|
f(5) & = & 2 \\
|
|
|
|
|
f(6) & = & 1 \\
|
|
|
|
|
f(7) & = & 0 \\
|
|
|
|
|
f(8) & = & 2 \\
|
|
|
|
|
\end{array}
|
|
|
|
|
\]
|
|
|
|
|
Tapauksen $n=8$ Grundy-luku on 2, joten peli on mahdollista
|
|
|
|
|
voittaa.
|
|
|
|
|
Voittosiirto on muodostaa kasat $1+7$,
|
|
|
|
|
koska $f(1) \oplus f(7) = 0$.
|
|
|
|
|
|