Программирование на языке Пролог для искусственного интеллекта
Шрифт:
где
задает разрешенные ходы игры:
выбирает из списка позиций-кандидатов
15.3. Альфа-бета алгоритм: эффективная реализация минимаксного принципа
Программа, показанная на рис. 15.3, производит просмотр в глубину дерева поиска, систематически обходя все содержащиеся в нем позиции вплоть до терминальных; она вычисляет статические оценки всех терминальных позиций. Как правило, для того, чтобы получить правильную минимаксную оценку корневой вершины, совсем не обязательно проделывать эту работу полностью. Поэтому алгоритм поиска можно сделать более экономным. Его можно усовершенствовать, используя следующую идею. Предположим, что у нас есть два варианта хода. Как только мы узнали, что один из них явно хуже другого, мы можем принять правильное решение, не выясняя, на сколько в точности он хуже. Давайте используем этот принцип для сокращения дерева поиска рис. 15.2. Процесс поиска протекает следующим образом:
(1) Начинаем с позиции а.
(2) Переходим к b.
(3) Переходим к d.
(4) Берем максимальную из оценок преемников позиции d, получаем V(d) = 4.
(5) Возвращаемся к b и переходим к e.
(6) Рассматриваем первого преемника позиции e с оценкой 5. В этот момент МАКС (который как раз и должен ходить в позиции e) обнаруживает, что ему гарантирована в позиции e оценка не меньшая, чем 5, независимо от оценок других (возможно, более предпочтительных) вариантов хода. Этого вполне достаточно для того, чтобы МИН, даже не зная точной оценки позиции e, понял, что для него в позиции b ход в e хуже, чем ход в d.
На основании приведенного выше рассуждения мы можем пренебречь вторым преемником позиции e и приписать e приближенную оценку 5. Приближенный характер этой оценки не окажет никакого влияния на оценку позиции b, а следовательно, и позиции а.
На этой идее основан знаменитый альфа-бета алгоритм, предназначенный для эффективной реализации минимаксного принципа. На рис. 15.4 показан результат работы альфа-бета алгоритма, примененного к нашему дереву рис. 15.2. Из рис. 15.4 видно, что некоторые из рабочих оценок стали приближенными. Однако этих приближенных оценок оказалось достаточно для того, чтобы определить точную оценку корневой позиции. Сложность поиска уменьшилась до пяти обращений к оценочной функции по сравнению с восемью обращениями (в первоначальном дереве поиска рис. 15.2).
Как уже говорилось раньше, ключевая идея альфа-бета отсечения состоит в том, чтобы найти ход не обязательно лучший, но "достаточно хороший" для того, чтобы принять правильное решение. Эту идею можно формализовать, введя два граничных значения, обычно обозначаемых через Альфа и Бета, между которыми должна заключаться рабочая оценка позиции. Смысл этих граничных значений таков: Альфа — это самое маленькое значение оценки, которое к настоящему моменту уже гарантировано для игрока МАКС; Бета —
V( P, Альфа, Бета) ≤ Альфа если V( P) ≤ Альфа
V( P, Альфа, Бета) = V( P) если Альфа < V( P) < Бета
V( P, Альфа, Бета) ≥ Бета если V( P) ≥ Бета
Рис. 15.4. Дерево рис. 15.2 после применения альфа-бета алгоритма. Пунктиром показаны ветви, отсеченные альфа-бета алгоритмом для экономии времени поиска. В результате некоторые из рабочих оценок стали приближенными (вершины c, e, f; сравните с рис. 15.2). Однако этих приближенных оценок достаточно для вычисления точной оценки корневой вершины и построения основного варианта.
Очевидно, что, умея вычислять "достаточно хорошую" оценку, мы всегда можем вычислить точную оценку корневой позиции P, установив границы интервала следующим образом:
V( P, -бесконечность, +бесконечность) = V( P)
На рис. 15.5 показана реализация альфа-бета алгоритма в виде программы на Прологе. Здесь основное отношение —
где
Процедура
находит достаточно хорошую позицию
Интервал между Альфа и Бета может сужаться (но не расширяться!) по мере углубления поиска, происходящего при рекурсивных обращениях к альфа-бета процедуре. Отношение
определяет новый интервал