Функция Шпрага-Гранди

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

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

В случае дискретных игр иногда называется нимбером.

Теорема Шпрага-Гранди была независимо сформулирована и доказана Р. Шпрагом (1935) и П. М. Гранди (1939).

Определения[править | править исходный текст]

Определение 1

Функцией Шпрага-Гранди называется такая функция G, определенная для x и принимающая неотрицательные значения, так что:

\!G(x) = \min \{n\geq 0 : n\neq G(y), y \in F(x)\},
где
  • n — любое целое неотрицательное число,
  • y — одна из позиций, в которую можно перейти непосредственно из позиции х за один ход,
  • G(y) — значения Шпрага-Гранди позиций, в которые можно перейти непосредственно из позиции х за один ход,
  • F(x) — список позиций, в которые можно перейти непосредственно из позиции х за один ход.

Таким образом, G(x) — наименьшее неотрицательное целое число, не найденное среди значений Шпрага-Гранди для определенных х.

Определение 2

Функция F определена на множестве всех позиций игры G следующим образом:

F(P) = 0,~ если позиция P — однозначно проигрышная (нельзя сделать ни одного хода)
F(P) = \min ( \Omega\setminus\{F(Q)|Q \in G(P)\} )~ в иных случаях,

где \Omega — множество целых неотрицательных чисел, а G(P) — множество всех допустимых ходов из позиции P.

Основные свойства[править | править исходный текст]

  1. Если х — конечная позиция, то G(x) = 0. Позиции х, для которых G(x) = 0, являются П-позициями (проигрышными для игрока чья очередь делать ход), тогда как все другие позиции соответственно Н-позициями (выигрышными для игрока который только что сделал ход). Выигрышная стратегия заключается в том, чтобы выбирать на каждом шаге ход, в котором значение Шпрага-Гранди равно нулю.
  2. Из позиции х, для которой G(x) = 0, существуют ходы только в позицию у такую, что G(y) ≠ 0.
  3. Из позиции х, для которой G(x) ≠ 0, существует хотя бы один ход в позицию у, для которой G(y) = 0.

Применение[править | править исходный текст]

Одно из полезных свойств функции Шпрага-Гранди заключается в том, что она равна нулю для всех проигрышных позиций и положительна для всех выигрышных позиций. Это даёт метод нахождения выигрышной стратегии:

  1. Найти функцию Шпрага-Гранди, например, строя её рекуррентно, начиная с конечных позиций.
  2. Если в начальной позиции функция Гранди равна нулю, то игра для первого игрока проигрышна.
  3. В противном случае, первый игрок может выиграть, перемещаясь каждым ходом в позицию с нулевым значением функции Гранди.

Сумма игр[править | править исходный текст]

Если у нас имеется n игр G_1, G_2, \dots, G_n, то можно рассмотреть комбинацию этих игр, для которой игровое поле состоит из совокупности игровых полей для игр G_1, G_2, ..., G_n и за один ход игрок может выбрать некоторое i, 1 ≤ in, и сделать ход на игровом поле для игры G_i. Такая комбинация называется суммой игр G_1, G_2, \dots, G_n и обозначается G_1 + G_2 + \dots + G_n. Ситуацию на игровом поле игры G_1 + G_2 + \dots + G_n, когда игровое поле игры Gi находится в позиции P_i, удобно обозначать как (P_1, P_2, \dots, P_n).

Функция Шпрага-Гранди обладает одним удивительным свойством, которое позволяет оптимально играть в сумму игр G_1 + G_2 + ... + G_n, зная функцию Шпрага-Гранди для всех позиций каждой из игр Gi. Формулируется оно следующим образом:

\!F(P_1, P_2, \dots, P_n) = F(P_1)\oplus F(P_2)\oplus \dots \oplus F(P_n),

где \!\oplus — исключающее «или» (он же XOR).

Пример[править | править исходный текст]

Задача

Имеется площадь, состоящая из 10 клеток. Играют два игрока. За один ход разрешается делить площадь на две неравные ненулевые площади так, чтобы единство каждой отдельно взятой клетки не нарушалось (то есть клетку делить нельзя). Проигрывает тот, кто не может сделать ход. Кто выигрывает при условии правильной справедливой игры?

Решение

Задача решается с конца. Рассмотрим варианты деления площади для всех случаев от 1 до 10 клеток и найдем для них значения функции Шпрага-Гранди. Заметим, что для данной игры, в результате деления площади каждый раз на две новые площади, значение функции Шпрага-Гранди находится с помощью Ним-суммы.

Значение Шпрага-Гранди для n = 10 получается равным 0. Следовательно, игрок, делающий ход первым проигрывает. При любом его ходе, второй игрок переходит в позиции 4 + 4 или n = 1/2/7, значение Шпрага-Гранди для которых также равно 0.

Ответ

Выигрывает тот, кто ходит вторым.

См. также[править | править исходный текст]

Ссылки[править | править исходный текст]