Скачиваний:
34
Добавлен:
01.05.2014
Размер:
207.36 Кб
Скачать

18.2. Игровые деревья поиска

Что происходит, когда мы играем в какую-нибудь игру? Игра начинается, например, с расстановки шахматных фигур, сдачи карт, распределения спичек и т. п. Решив, кто начнет игру, игроки делают ходы по очереди- После каждого хода позиция игры соответственно обновляется.

Превратим это туманное описание в простую базовую программу игры. Предло­жением верхнего уровня будет:

играть (Игра, Результат) 

инициализировать (Игра, Позиция. Игрок),

отобразить (Позиция, Игрок),

играть (Позиция, Игрок, Результат).

Предикат инициализировать(Игра, Позиция, Игрок}определяет начальную позициюПозицияигрыИграи игрокаИгрок,начинающего игру.

Игра представляется последовательностью шагов, каждый из которых состоит в выборе игроком хода, выполнении хода и определении игрока, который должен выполнять следующий ход. Поэтому более точное описание дает процедура играть, имеющая три аргумента: позиция игры, игрок, выполняющий ход, и конечный результат. При этом удобно отделить выбор ходавыбрать_ход/3от его выполненияходить/3.Остальные предикаты в представленном ниже предложении служат для отображения состояния игры и определения игрока, выполняющего следующий ход:

играть(Позиция,Игрок,Результат)

выбрать_ход (Позиция, Игрок, Ход),

ходить (Ход, Позиция, Позиция 1).

отобразить игру (Позиция!, Игрок),

следующий игрок (Игрок, Игрок 1),

!,играть (Позиция 1,Игрок 1,Результат).

Программа.18.8определяет логическую основу игровыхпрограмм. Используя ее для написания программ конкретных игр, следует сосредоточить внимание на

играть(Игра)

Играть игру с именем Игра.

играть(игра) 

инициализировать (Игра, Позиция, Игрок),

отобразить_игру( Позиция. Игрок),

играть(Позиция, Игрок. Результат).

играть (Позиция, Игрок, Результат) 

игра окончена (Позиция. Игрок. Результат),

объявить (Результат).

играть (Позиция, Игрок, Результат) 

выбрать-ход(Позиция, Игрок, Ход),

ходить (Ход. Позиция, Позиция1),

отобразить_игру (Позиция1, Игрок),

другой__игрок (Игрок, Игрок!).

!,играть(Позиция1.Игрок 1,Результат).

Программа 18.8.Базовая программа игры.

важных игровых вопросах: какие структуры данных должны быть использованы для представления позиции игры и какие должны быть выражены стратегии игры. Этот процесс будет продемонстрирован в гл. 20на примерах написания программ для игр в Ним и Калах.

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

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

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

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

Найти все возможные состояния игры, которые могут быть достигнуты за один ход.

Используя оценочную функцию, вычислить оценки состояний.

Выбрать ход, ведущий к позиции с наивысшей оценкой.

Этот алгоритм представлен программой 18.9.В ней предусматривается использова­ние предикатаходить (Ход,Позиция,Позиция1),который для достижения состоянияПозиция1применяет к состояниюПозицияходХод.Связь с базовой программой18.8обеспечивается предложением

выбрать_ход( Позиция, компьютер. Ход)

установигь (М,ход(Позиция,М), Ходы),

оценить_и_выбpaть(Ходы, Позиция, (nil,- 1000),Ход).

оценить_и_выб рать (Ходы, Позиция, Запись, ЛучшийХод)

Выбирает ЛучшийХодиз множества ходовХодыисходя из текущей позицииПозицияи записывает текущий лучший ход.

оценить_и_выбрать ([Ход |Ходы]. Позиция.Запись,ЛучшийХод) 

ходить(Ход, Позиция, Позиция1).

оценка(Познция1, Оценка),

изменить (Ход. Оценка, Запись, Запись1),

оценить_и_выбрать (Ходы, Позиция. Запись1,Лучший Ход). оценить_и_выбрать([ ],Позиция, (Ход, Оценка), Ход).

изменить(Ход, Оценка, (Ход1,Оценка1),(Ход1, Оценка 1)) 

Оценка Оценка1.

изменить (Ход, Оценка, (Ход1, Оценка1).Ход, Оценка))

Оценка >Оценка1.

Программа I8.9.Выбор лучшего хода.

Предикат ход (Позиция, Ход)истинен, если ходХод -возможный ход из текущей позиции.

Базовое отношение программы - оценить_и_выбрить (Ходы, Позиция, Запись, Ход) обеспечивает выбор лучшего ходаХодиз возможных ходовХоды,исходя из данной позицииПозиция.Для каждого возможного хода определяется соответствующая позиция, вычисляется ее оценка и выполняется ход с наивысшей оценкой. ПеременнаяЗаписьиспользуется для записи наилучшего текущего хода. В программе18.9она представлена парой(Ход, Оценка).СтруктураЗаписьдолжна быть частично абстрактной в процедуреизменение/4.Степень абстракции данных - вопрос стиля программирования и обеспечения противоречивых требований наглядности, ком­пактности и эффективности программы.

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

Стандартный метод определения оценки позиции, основанный на просмотре вперед нескольких слоев дерева игры, называется минимаксным алгоритмом. Его идея состоит в следующем.

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

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

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

На рис. 18.2изображено простое дерево игры глубиной в 2слоя. В текущей позиции игрок имеет два хода и его противник-два ответных хода. Оценки на листьях деревьев являются оценками для игрока. Противник хочет минимизировать оценку, поэтому он будет выбирать минимальные значения, оценивая позиции на первом уровне дерева как + 1и - 1.Игрок, желая максимизировать оценку, будет выбирать вершину со значением +1.

оценить .и выиграть (Ходы,. Позиция, Глубина, При -шик, Запись ,ЛучшийХод)

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

оценить_и,выбрать([Ход| Ходы],Позиция,D,МаксМин.Запись, ЛучшийХод) 

ходить (Ход, Позиция,Позиция1),

минимакс(0,Позиция1,МаксМин,ХодХ,Оценка).

изменить(Ход,Оценка,Запись,Запись1).

оценить_и_выбрать(Ходы,Позиция.О.МаксМин,Запись1,ЛучшийХод).

оценить и _выбрать([ ],Позиция,0,МаксМин,Запись,Запись).

минимакс(0, Позиция, Макс Мин, Ход, Оцснка) 

оценка(Позиция,V),

оценка : = V *МаксМин.

минимакс(0,Позиция,МаксМин.Ход. Оценка) 

D>0,

set_of(М, ход(Позиция, М),Ходы),

DI: = D - 1,

МинМакс: = -МаксМин,

оценить_и_выбрать(Ходы, Позиция, D1,МинМакс,(ni1,-1000),(Ход,Оценка)).

изменить(Ход,Оценка,Запись,Запись1)См. программу 18.9.

Программа 18,10.Выбор лучшего хода с использованием минимаксного алгоритма.

Минимаксный алгоритм реализуется программой 18.10.Основное отношение программыминимакс (D,Позиция, МаксМин, Хм),Оценка)истинно, еслиХод - ход с наивысшей оценкойОценкапозицииПозиция,полученной в результате поиска на слое Dдерева игры. ПризнакМаксМинуказывает, что производится - максимизация(1)или минимизация (-1).Обобщение программы 18.9используется для выбора хода из множества ходов. В предикатоценить_и_выбратьдолжны быть введены два дополнительных аргумента: число слоев Dи признакМаксМин.Последний аргумент(ЛучшийХод)предиката используется для записи не только хода, но и оценки. Процедураминимакспроизводит необходимые вычисления, а также изменение числа просмотренных вперед ходов и признака. Исходное значение записиЗапись устанавливается равным (nil, -1000),где nilпредставляет произвольный ход, а–1000 - это оценка, меньшая любого возможного значения оценочной функции.

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

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

В программе 18.11,представляющей собой модификацию программы 18.10, реализована альфа-бета-процедура. В программе появилась новая реляционная схемаальфа_беma(Глубина,Позиция,Альфа,Бета,Ход.Оценка),в которой в отличие от реляционной схемымини.микгвместо признакаМаксМинпомещены переменныеАльфаиБета.Аналогичное изменение претерпела и схема отношенияоценить_и_выбрать.

oценить_u_ выбрать( Ходы,Позиция,Глубина,Альфа,Бета,Ход1,ЛучшийХод)

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

АльфаиБета-параметры алгоритма. ПараметрХод1используется для регистрации текущего лучшего хода.

оценить_и_выбрать([Ход |Ходы], Позиция,D,Альфа,Бета.Ход1.ЛучшийХод) 

ходить(Ход,Позиция, Позиция1),

альфа_бета(0,Позиция1,Альфа, Бета,ХодХ, Оценка),

Оценка1: = -Оценка.

отсечение(Ход,Оценка1,D,Альфа,Бета,Ходы, Позиция, Ход1,ЛучшийХод).

оценить_и_выбрать([ ],Позиция, Альфа, Бета, Ход, (Ход. Альфа)).

альфа бета(0,Позиция. Альфа. Бета, Ход, Оценки) 

оценка(Позиция,Оценка).

альфа_бета(0,Позиция,Альфа.Бета,Ход,Оценка) 

set_оf(М,ход(Позиция,М),Ходы),

Альфа1: = -Бета,

Бета!: = -Альфа.

D1 := D - 1,

оценить_и_выбрать(Ходы,Позиция,D1,Альфа1,Бета1,nil,(Ход,Оценка)).

отсечение(Ход,Оценка,D,Альфа,Бета,Ходы,Позиция,Ход1,(Ход,Оценка)) 

Оценка Бета.

отсечение(Ход,Оценка,0,Альфа, Бета, Позиция, Ход1,ЛучшийХод) 

Альфа <Оценка,0ценка <Бета,

оценить_и_выбрать(Ходы, Позиция,D,0ценка, Бета, Ход, ЛучшийХод). отсечение(Ход,Оценка,0,Альфа,Бета,Ходы.Позиция,Ход 1,ЛучшийХод) 

Оценка Альфа,

оценить_и_выбрать(Ходы,Позиция,D,Альфа,Бста.Ход1,ЛучшийХод).

Программа 18.11.Выбор хода с использованием минимаксного алгоритма с альфа-бета-отсечением.

В отличие от программы 18.10процедураоценить_и_выбратьв программе 18.11 не должна просматривать все возможности. Это достигается введением предикатаотсечение,который либо останавливает поиск по текущей ветви, либо продолжает поиск, обновляя значение альфа (альфа-оценку) и соответственно изменяя лучший текущий ход.

Например, в дереве игры, изображенном на рис. 18.2,не надо рассматривать последнюю вершину. Как только обнаруживается ход с оценкой -1,которая меньше, чем оценка +1,игрок может быть уверен, что нет других вершин, которые могли бы повлиять на конечную оценку.

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

Рис. 18.2.Простое дерево игры-

18.3. Дополнительные сведения

Методы поиска для проектирования и игр обсуждаются в учебниках по искусственному интеллекту. Более подробные описания стратегий поиска или минимаксного алгоритма и его расширения альфа-бета-отсечением можно найти, например, у Нильсона (Nilsson, 1971)или у Уинстона (Winston, 1977).

Уолтер Уилсон первым реализовал на Прологе альфа-бета-алгоритм.

Соседние файлы в папке prolog14_end