Программирование шахматных движков - очень сложная территория, поэтому сразу же я покажу вам вики по программированию шахмат , в которой есть много полезной информации по этой теме.
Фон
Шахматные вычисления (и многие подобные вещи) обычно моделируются и рассматриваются как «деревья игр» или « деревья решений ». В широком смысле это дерево является ориентированным графом с одним узлом наверху (текущая позиция), ведущим к узлу для каждого возможного перемещения, каждый из которых приводит к большему количеству узлов для каждого возможного следующего перемещения и так далее.
В своей самой упрощенной форме грубой силы движки Chess генерируют все позиции на этом дереве до некоторого предела глубины («сгиба»), оценивая каждую результирующую позицию на основе некоторых сложных критериев 1 . Тогда он играет движение, которое, кажется, приводит к лучшему результату. В настоящее время разработано много действительно сложных методов , чтобы ограничить количество позиций, на которые должен смотреть двигатель, но я собираюсь игнорировать их для целей этого ответа, потому что они не меняют реальную проблему в рука.
Математический тангент
Основная причина того, что движкам обычно требуется примерно одинаковое количество времени для рассмотрения каждого хода, заключается в том, что размер дерева решений увеличивается экспоненциально с глубиной ( k
).
Рассмотрим стартовую позицию. Вершина дерева ( k=0
) - это один узел. У белых двадцать возможных первых ходов, поэтому на глубине двадцать узлов k=1
. Кроме того, у черных также есть двадцать доступных ходов для каждого из вариантов белых: таким образом k=2
, есть 20 * 20 = 400
возможные позиции! И это только ухудшается, поскольку игроки развивают свои части!
Например, давайте представим, что для каждого игрока всегда есть двадцать возможных ходов 2 . Вы приказываете компьютеру смотреть вперед пять ходов для каждого игрока (десять сгибов). Давайте посмотрим на размер дерева грубой силы на каждом уровне. Для забавы мы также рассмотрим общее количество позиций в дереве (от вершины до заданного уровня).
Ply | Positions | Total Tree Size
----------------------------------------
0 | 1 | 1
1 | 20 | 21
2 | 400 | 421
3 | 8000 | 8421
4 | 160000 | 168421
5 | 3200000 | 3368421
6 | 64000000 | 67368421
7 | 1280000000 | 1347368421
8 | 25600000000 | 26947368421
9 | 512000000000 | 538947368421
10 | 10240000000000 | 10778947368421
Результатом того, что каждый уровень экспоненциально больше предыдущего уровня, является то, что размер всего дерева определяется нижним уровнем . Рассмотрим пример выше: последний уровень содержит десять триллионов узлов. Весь остаток дерева содержит только пятьсот миллиардов. Десятый слой содержит около 95% узлов во всем дереве (это действительно так на каждом уровне). На практике это означает, что все время поиска тратится на оценку «последнего» хода.
Ответ
Так как это связано с вашим вопросом? Ну, скажем, компьютер настроен на десять слоев, как указано выше, и далее он «запоминает» результаты своих оценок. Он рассчитывает ход, воспроизводит его, а затем вы делаете ход. Теперь были сделаны два хода, поэтому он удаляет все позиции из памяти, относящиеся к шагам, которые не произошли, и остается с деревом, которое опускается на оставшиеся восемь ходов, которые он уже рассчитал: 26,947,368,421 позиций!
Все в порядке! Таким образом, нам нужно только рассчитать два последних слоя! Используя нашу оценку 20 ходов на каждую глубину, общее количество ходов, которое нам нужно здесь рассчитать, все еще превышает десять триллионов. Позиции, которые мы уже рассчитали, составляют всего 2,5% возможностей! Таким образом, даже кэшируя результаты последнего хода, лучшее, на что мы можем надеяться, это увеличение скорости на 2,5%! По сути, именно поэтому, даже если ваша программа кеширует предыдущие результаты, вы обычно не видите значительного ускорения между ходами (за исключением случаев, когда компьютер находит принудительное сопряжение или что-то, конечно!).
Упрощение Отказ от ответственности
В этом вопросе много сложностей, поэтому я связался с вики по программированию в самом верху и попытался объяснить ответ только в общих математических терминах. На самом деле, программы делают как правило , кэш - часть дерева от переезда в движение, есть и другие причины , почему это недостаточное сама по себе - некоторым простым причинам (например , определенная линия может выглядеть хорошее из восьми ходов, но концы с задним -рукий помощник на девятом ходу!) и много очень сложных (обычно связанных с различными умными методами обрезки). Таким образом, компьютер должен продолжать смотреть вперед, пытаясь избежать ошибочных предположений, основанных на глубине отсечения предыдущего хода.
1 Я не буду вдаваться в эвристические функции здесь, потому что это ее собственная невероятно сложная область, но часто здесь есть некоторые преимущества, которые могут быть достигнуты и с помощью схем кэширования позиции.
2 Средний коэффициент ветвления в 20, вероятно, слишком низок .