Анализ игр
11.5. Ретроспективный анализ
Существенно ли описанное в прошлом разделе улучшение алгоритма (переход от полного перебора к -процедуре)? С одной стороны, да: в нашем примере переход от к дает выигрыш в раз, а экспоненциально растет с ростом . С другой стороны, экспонента остается экспонентой, даже если ее показатель уменьшается с до , поэтому надежды полностью проанализировать даже не очень сложную и долгую игру таким способом почти нет.
Поэтому на практике обычно выбирают некоторую оценку позиции - легко вычислимую функцию, которая по мнению практиков как-то отражает преимущество того или иного игрока (скажем, материальный перевес в шахматах). Затем вместо настоящей игры рассматривают ограниченную игру, в которой делается сравнительно небольшое число ходов, а затем результатом игры считается оценка полученной позиции, и в этой игре выполняют перебор (применяя -оптимизацию). Конечно, это ничего не гарантирует в настоящей игре, но что поделаешь.
Бывают, однако, и ситуации, когда удается определить цену данной позиции точно. Это удается сделать для шахматных эндшпилей с небольшим числом фигур - например, можно рассчитать, за какое минимальное число ходов можно поставить мат королем, слоном и конем против одинокого короля в заданных начальных условиях. Заметим, что при этом число ходов может измеряться десятками, а каждый ход имеет десятки вариантов, поэтому о полном переборе (или даже о несколько сокращенном) не может идти и речи.
11.5.1. Придумать другой подход, использующий ограниченность общего числа возможных позиций (скажем, для четырех упомянутых фигур на шахматной доске это "мегапозиций"; с учетом очередности хода будет мегапозиции; массив такого размера помещается в память современных компьютеров без труда).
Решение. Заведем массив, отведя ячейку для каждой позиции. Просмотрим его один раз и отметим все матовые позиции (записав туда число в знак того, что позиция выигрышная и до выигрыша осталось ходов). Затем просмотрим массив еще раз и пометим как проигрышные все позиции, из которых можно пойти лишь в матовые (напишем там в знак того, что можно протянуть лишь еще ход). Затем отметим все позиции, из которых есть ход в позиции с числом , написав там . Затем - позиции, из которых все ходы ведут в позиции или , написав там , и т.п. Так будем делать до тех пор, пока будут появляться новые пометки. Как только это кончится, для каждой позиции будет известно, можно ли в ней выиграть и сколько ходов для этого нужно.
Фактически эта процедура повторяет доказательство теоремы Цермело (но дополнительно мы получаем информацию о том, сколько ходов до выигрыша или проигрыша при наилучшей игре).
11.5.2. Могут ли при этом остаться неотмеченные позиции и чему они соответствуют?
Ответ. Это позиции, в которых оба игрока могут гарантировать сколь угодно длинную игру без проигрыша. Впрочем, правило троекратного повторения позиции в шахматах в этом случае позволяет считать партию ничейной.
А.Л. Брудно заметил, что есть ситуация, в которой такой анализ требует совсем небольших ресурсов и может быть реализован на очень небольшой памяти, хотя для человека соответствующая задача не проста: пусть белые имеют короля на поле c3, которого им запрещено двигать, и ферзя (на каком-то другом поле) и хотят поставить мат одинокому черному королю. Ограничение (неподвижность короля), затрудняющее жизнь человеку-шахматисту, облегчает анализ (уменьшая количество позиций почти что в раза за счет того, что не надо рассматривать разные положения короля!)
Использование таблицы описанного типа можно считать применением метода динамического программирования (мы не вычисляем цену игры для одной и той же позиции снова и снова, обходя дерево, а заполняем таблицу цен систематически).