Как фронтендеры пишут шахматный ИИ (2)

искусственный интеллект
Как фронтендеры пишут шахматный ИИ (2)

Код для этой статьи:GitHub.com/parade to/eat…

Демонстрационный адрес:woo woo woo.parade to.com/v UE-китайский…

существуетПредыдущийВ конце статьи упоминается, что максимальный и минимальный алгоритмы имеют место для дальнейшей оптимизации, а затем продолжаются.

альфа-бета обрезка

В конце прошлой статьи упоминалось, что при увеличении глубины поиска алгоритма максимума и минимума резко возрастет его вычислительная сложность. Если есть способ удалить какие-то ветки, то эффективность алгоритма будет выше, а это очередь альфа-бета-обрезки. Но не будем пока обсуждать алгоритм, а снова сыграем в игру из предыдущей статьи.

Есть два больших мешка, и в каждом большом мешке есть два маленьких мешочка внутри, и в каждом маленьком мешочке находится разное количество золотых монет.

Во-первых, после того, как мы пройдем через сумку слева, максимальный доход, который вы можете получить в настоящее время, составляет три золотых монеты:

Затем, когда мы пройдем к первому мешочку справа, так как количество золотых монет меньше, чем ваша текущая максимальная прибыль, ваш противник уже не сможет пройти через другие мешки, потому что текущего мешочка достаточно, чтобы вы сдали выбор Большой мешок справа теперь есть, поэтому в результате противник может выбрать маленький мешок с 2 золотыми монетами:

Наконец, вы выбираете сумку слева:

Вышеупомянутый процесс на самом деле представляет собой алгоритм максимального и минимального количества плюс сокращение альфа-бета. Практика прекращения обхода оставшихся мешков, когда противник пересекает большой мешок справа, отражает идею сокращения альфа-бета.

Давайте поговорим об альфа-бета сокращении, В алгоритме альфа-бета сокращения мы определяем:

  • альфа записывается как максимальный балл, который узел максимального слоя может получить в данный момент.
  • бета записывается как минимальный балл, который узел минимального слоя может получить в данный момент.

Когда бета узла в минимальном слое меньше альфа, поиск остальных дочерних узлов можно остановить. Когда альфа узла в максимальном слое больше бета, поиск остальных дочерних узлов можно остановить.

Это определенно непонятно, поэтому давайте воспользуемся следующим примером, чтобы попрактиковаться.

  1. Инициализируйте корневой узел альфа значением -∞ и бета значением +∞, затем пройдите путь до левого узла в предпоследней строке.

  1. Пройдите первый дочерний узел, обновите альфа-канал до 4 и обновите значение текущего узла до 4. Определите, требуется ли сокращение (сравните альфа и бета текущего узла и найдите, что 4 меньше +∞ и не может быть сокращено).

  1. Пройдите второй дочерний узел, обновите альфа-канал до 6 и обновите значение текущего узла до 6. Определите, требуется ли сокращение (сравните альфа и бета текущего узла и найдите, что 6 меньше +∞ и не может быть сокращено).

  1. Верните 6 на предыдущий уровень, обновите бета-версию первого узла слева от минимального слоя до 6 и обновите текущий узел до 6. Определите, требуется ли сокращение (сравните бета и альфа текущего узла и найдите, что 6 больше -∞ и не может быть сокращено).

  1. Передайте alpha=-∞, beta=6 дочернему узлу справа, продолжайте обход узла, где находится 7, обновите alpha до 7, и значение равно 7. Определите, требуется ли сокращение (сравните бета и альфа текущего узла и найдите, что 6 меньше 7, что удовлетворяет условиям сокращения.

  1. Верните 7 на предыдущий уровень, обновление не требуется.

Далее я не буду вдаваться в детали по порядку, остальное читатели могут попробовать доделать сами, окончательный результат таков:

комбинироватькодСм. для лучшего понимания:

function alphabeta(node, depth, α, β, maximizingPlayer) is
    if depth = 0 or node is a terminal node then
        return the heuristic value of node
    if maximizingPlayer then
        value := −∞
        for each child of node do
            value := max(value, alphabeta(child, depth − 1, α, β, FALSE))
            α := max(α, value)
            if α ≥ β then
                break (* β cut-off *)
        return value
    else
        value := +∞
        for each child of node do
            value := min(value, alphabeta(child, depth − 1, α, β, TRUE))
            β := min(β, value)
            if α ≥ β then
                break (* α cut-off *)
        return value

Выше приведены правила альфа-бета-обрезки. Не смотрите на это, просто вычтите несколько ветвей, а не вычисляйте. Если каждый узел каждого слоя может исключить несколько ветвей, оптимизация скорости все равно очень очевидна.

параллельный поиск

Другой идеей оптимизации являются параллельные вычисления, которые делят сгенерированные ходы на несколько задач для параллельной обработки, и каждая параллельная задача генерирует локальное оптимальное решение и, наконец, суммирует глобальное оптимальное решение. Каждому ходу быстрее всего соответствует подзадача, но если это так для каждого слоя, то количество финальных подзадач будет очень большим, будь то многопроцессорная или многопоточная реализация очень нереальна, поэтому необходимо ограничить глубину параллельной обработки. Даже если параллельные вычисления включить только на первом слое, теоретически это может ускорить вычисления в 30 раз (при условии, что каждый слой производит в среднем 30 ходов).

Суммировать

Используя алгоритмы min-max и альфа-бета, простойПрограмма шахматного ИИ, но шахматной силы ИИ хватит только для игроков начального уровня. Одна из причин заключается в том, что, хотя метод оптимизации, упомянутый выше, принят, на практике обнаруживается, что, когда глубина поиска достигает 5, время расчета алгоритма становится неприемлемо медленным, и глубина поиска не может быть дополнительно улучшена; другая причина заключается в том, что метод оценки ситуации немного отличается.Очевидно, что это просто, вы можете рассмотреть возможность добавления некоторых специфичных для шахмат «процедур» для повышения точности оценки ситуации. Мы оптимизируем эти проблемы позже.

Ссылаться на

  1. Альфа-бета обрезка

Добро пожаловать в публичный аккаунт, спасибо!