Введение

Кэш ранее встреченных позиций и соответствующих оценок в игровом дереве.

Таблица транспозиций – это кэш ранее встреченных позиций и соответствующих оценок, в игровом дереве, генерируемом программой для игры в компьютерные игры. Если позиция возникает повторно через другую последовательность ходов, значение этой позиции извлекается из таблицы, что позволяет избежать повторного поиска в игровом дереве ниже этой позиции. Таблицы транспозиций наиболее полезны в играх с полной информацией (где полное состояние игры известно всем игрокам в любой момент времени). Использование таблиц транспозиций по сути является мемоизацией, применяемой к поиску по дереву, и представляет собой форму динамического программирования. Таблицы транспозиций обычно реализуются в виде хеш-таблиц, кодирующих текущую позицию на доске в качестве хеш-индекса. Количество возможных позиций, которые могут возникнуть в игровом дереве, является экспоненциальной функцией от глубины поиска и может достигать тысяч, миллионов или даже больше. Поэтому таблицы транспозиций могут потреблять большую часть доступной системной памяти и обычно составляют основную часть объема памяти, используемого игровыми программами.

Функциональность

Программы для игры работают, анализируя миллионы позиций, которые могут возникнуть в следующих нескольких ходах игры. Как правило, эти программы используют стратегии, напоминающие поиск в глубину, что означает, что они не отслеживают все проанализированные до сих пор позиции. Во многих играх можно достичь заданной позиции несколькими способами. Это называется транспозициями. В шахматах, например, последовательность ходов 1. d4 Nf6 2. c4 g6 (см. алгебраическую шахматную нотацию) имеет 4 возможных транспозиции, поскольку любой игрок может изменить порядок ходов. В общем случае, после n ходов верхняя граница возможных транспозиций равна (n!)². Хотя многие из них являются незаконными последовательностями ходов, вполне вероятно, что программа в конечном итоге будет анализировать одну и ту же позицию несколько раз. Чтобы избежать этой проблемы, используются таблицы транспозиций. Такая таблица представляет собой хэш-таблицу, содержащую информацию о каждой из проанализированных позиций до определенной глубины. При обнаружении новой позиции программа проверяет таблицу, чтобы узнать, была ли эта позиция уже проанализирована; это можно сделать быстро, в амортизированном постоянном времени. Если да, то в таблице содержится значение, которое ранее было присвоено этой позиции; это значение используется напрямую. Если нет, то значение вычисляется, и новая позиция добавляется в хэш-таблицу. Количество позиций, которые просматривает компьютер, часто значительно превышает ограничения памяти системы, на которой он работает; таким образом, не все позиции могут быть сохранены. Когда таблица заполняется, менее используемые позиции удаляются, чтобы освободить место для новых; это делает таблицу транспозиций своего рода кэшем. Экономия вычислений при поиске в таблице транспозиций заключается не только в оценке одной позиции. Вместо этого избегается оценка целого поддерева. Таким образом, записи таблицы транспозиций для узлов на меньшей глубине в игровом дереве более ценны (поскольку размер поддерева, укорененного в таком узле, больше), и поэтому им придается большее значение при заполнении таблицы и необходимости отбрасывания некоторых записей. Хэш-таблица, реализующая таблицу транспозиций, может использоваться не только для поиска транспозиций. При альфа-бета отсечении поиск выполняется быстрее всего (фактически, оптимально), когда первым рассматривается дочерний узел, соответствующий наилучшему ходу. Конечно, заранее узнать наилучший ход невозможно, но при использовании итеративного углубления ход, который был признан наилучшим при более мелком поиске, является хорошим приближением. Поэтому этот ход пробуется первым. Для хранения наилучшего дочернего узла используется запись, соответствующая этому узлу в таблице транспозиций. Использование таблицы транспозиций может привести к неверным результатам, если не избегать проблемы взаимодействия истории графов. Эта проблема возникает в некоторых играх, поскольку история позиции может быть важна. Например, в шахматах игрок не может сделать рокировку, если король или ладья, с которой он делает рокировку, переместились в ходе игры. Распространенным решением этой проблемы является добавление права на рокировку в качестве части хеш-ключа Цобериста. Другой пример – ничья повторением: для заданной позиции может быть невозможно определить, встречалась ли она уже ранее. Решением общей проблемы является хранение исторической информации в каждом узле таблицы транспозиций, но это неэффективно и редко делается на практике.

Стратегии замещения

Таблица транспозиции — это кэш, максимальный размер которого ограничен доступной системной памятью и может переполняться в любой момент. Фактически, переполнение ожидается, и количество кэшируемых позиций в любой момент времени может составлять лишь небольшую долю (даже на порядки величины меньше), чем количество узлов в игровом дереве. Подавляющее большинство узлов не являются узлами транспозиции, то есть позициями, которые повторяются, поэтому эффективные стратегии замены, сохраняющие потенциальные узлы транспозиции и заменяющие другие узлы, могут значительно уменьшить размер дерева. Замена обычно основывается на глубине дерева и возрасте узлов: предпочтение отдается узлам, расположенным выше в дереве (ближе к корню), поскольку поддеревья под ними больше и обеспечивают большую экономию; а также более новым узлам, поскольку старые узлы уже не соответствуют текущей позиции, и, следовательно, транспозиции к ним менее вероятны. Другие стратегии включают сохранение узлов в главной вариации, узлов с большими поддеревьями независимо от глубины в дереве и узлов, вызвавших отсечения.

Размер и производительность

Хотя доля узлов, которые окажутся транспозициями, невелика, дерево игры имеет экспоненциальную структуру, поэтому кэширование даже небольшого количества таких узлов может существенно повлиять на результат. В шахматах сообщалось о сокращении времени поиска на 0–50% в сложных позициях середины игры и до пятикратном сокращении в эндшпиле.

Связанные методы

Аналогичные методы могут быть использованы для кэширования оценок определенных характеристик позиции. Например, пешечная хэш-таблица может использоваться для хранения оценки пешечной структуры в позиции. Поскольку количество рассматриваемых пешечных позиций, как правило, намного меньше общего числа просмотренных позиций, пешечная хэш-таблица имеет очень высокий процент попаданий, что позволяет программе тратить больше времени на детальную оценку пешек, поскольку она многократно используется повторно. Таблица опровержений может использоваться для хранения последовательностей ходов от корневого узла до конечных узлов. Это включает в себя главный вариант и ответы на другие варианты, демонстрирующие их невыгодность. В ранние годы компьютерных шахмат таблицы опровержений иногда использовались вместо таблиц транспозиции, когда объём памяти был ограничен. Некоторые современные шахматные программы используют таблицы опровержений в дополнение к таблицам транспозиции для упорядочивания ходов. Статические битовые карты возможных ходов каждого типа фигуры на каждой клетке доски могут быть кэшированы при инициализации программы, чтобы допустимые ходы фигуры (или вместе – все допустимые ходы для генерации ходов) можно было получить с помощью одной загрузки из памяти, вместо последовательного перечисления. Они обычно используются в реализациях с использованием битбордов.