|
Скачать 143.85 Kb.
|
Содержание
1.Принятие оптимальных решений в играхНачальное состояние Функция полезности Оптимальные стратегии Минимаксный алгоритм. |
Лекция 17 Поиск в условиях противодействия. Принятие оптимальных решений в играх. Оптимальные стратегии. В мультиагентной среде каждый конкурентный агент вынужден принимать во внимание действия других агентов и устанавливать, как они повлияют на его собственное благополучие. Непредсказуемость действий этих прочих агентов может потребовать в процессе решения задачи учёта многих возможных непредвиденных ситуаций. Различают кооперативные и конкурентные мультиагентные варианты среды. Наличие конкурентных вариантов среды, в которых цели агентов конфликтуют, приводит к возникновению задач поиска в условиях противодействия, часто называемых играми. В математической теории игр, одной из ветвей экономики, любые мультиагентные варианты среды рассматриваются как игры, при условии, что влияние каждого агента на других является «значительным» вне зависимости от того, являются агенты кооперативными или конкурентными. В искусственном интеллекте «играми» обычно называют довольно специфические формы взаимодействия агентов, которые теоретиками игр именуются как детерминированные, поочерёдные, охватывающие двух игроков игры с нулевой суммой и с полной информацией. Для упрощения изложения материала в лекции рассматриваются детерминированные, полностью наблюдаемые варианты среды, в которых имеются два агента, обязанные чередовать свои действия, и в которых значения полезности в конце игры всегда равны и противоположны. Например, если один игрок выигрывает игру в шахматы (+1), другой обязательно проигрывает (-1). В подобной ситуации условия противодействия возникают именно из-за такого противопоставления функций полезности агентов. Ведение игр было одной из первых задач, рассматриваемых в области искусственного интеллекта. Компьютерным вариантом игрой в шахматы, начиная с 1950 года, интересовались: Конрад Цузе - изобретатель первого программируемого компьютера и разработчик первого языка программирования, Клод Шеннон - основоположник теории информации, Норберт Винер - создатель современной теории управления и Алан Тьюринг. С тех пор уровень игры с применением компьютеров неуклонно повышался и достиг того, что компьютеры побеждали чемпионов (но не всегда), а также стали конкурентоспособными во многих других играх. Компьютеры превзошли людей в шашках и игре «Отелло», основным исключением остаётся игра «го», в которой компьютеры пока ещё выступают на любительском уровне. Игры, в отличие от большинства учебных задач, которые рассматривались в предыдущих лекциях, интересны тем, что в них трудно найти решение. Например, шахматы характеризуются в среднем коэффициентом ветвления примерно равным 35, а игра часто продолжается до 50 ходов со стороны каждого игрока, поэтому дерево поиска имеет приблизительно ![]() ![]() ![]() Определим понятия оптимального хода игры и алгоритма его поиска. Затем рассмотрим методы выбора хорошего хода в условиях ограниченного времени. Отсечение позволяет игнорировать те части дерева поиска, которые не оказывают влияния на окончательный выбор, а эвристические функции оценки позволяют приближенно рассчитывать истинную полезность состояния без проведения полного поиска. ^ Рассмотрим игры с двумя игроками, которые будем именовать MAX и MIN по причинам, которые вскоре станут очевидными. Игрок MAX ходит первым, после чего игроки делают ходы по очереди до тех пор, пока игра не закончится. В конце игры игроку-победителю присваиваются очки, а проигравшему начисляется штраф. Формально игру можно считать своего рода задачей поиска с описанными ниже компонентами. ![]() ![]() ![]() ![]() Начальное состояние и допустимые ходы каждой стороны определяют дерево игры для данной игры. На рис.1 показана часть дерева игры в «крестики-нолики». Из начального состояния игрок MAX имеет девять возможных ходов. ![]() ![]() ![]() ![]() M ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() MIN(0) ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() M ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Заключительное c ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Полезность -1 0 +1 Рис.1. Частичное дерево поиска для игры «крестики-нолики». Верхний узел представляет собой начальное состояние, а первым ходит игрок MAX, ставя значок X в пустой клетке. Демонстрируются чередующиеся ходы игроков MIN(значок 0) и MAX(значок X). Ходы чередуются так, что игрок MAX ставит значок X, а игрок MIN ставит значок 0 до тех пор, пока не будут достигнуты листовые узлы, соответствующие терминальным состояниям, когда один игрок поставил три своих значка в один ряд или когда заполняются все клетки. Число под каждым листовым узлом обозначает полезность соответствующего терминального состояния с точки зрения игрока MAX. Высокие значения являются благоприятными для игрока MAX, но не для игрока MIN. Задача игрока MAX состоит в использовании дерева поиска, в частности, данных о полезности терминальных состояний, для определения наилучшего хода. ^ В обычных задачах поиска оптимальное решение для игрока MAX представляет собой последовательность ходов, ведущих к цели – к терминальному состоянию, которое соответствует выигрышу. С другой стороны, в игре участвует также игрок MIN, который имеет другое намерение по этому поводу. Это означает, что игрок MAX должен найти надёжную стратегию, позволяющую определить свой ход в начальном состоянии, затем свои ходы в состояниях, ставших результатом любого возможного ответа игрока MIN, и т.д. В итоге оптимальная стратегия приводит, по меньшей мере, к такому же результату, как и любая другая стратегия в тех условиях, когда противник не допускает ошибок. Рассмотрим, как определить оптимальную стратегию, даже при условиях, когда для игрока MAX будет неосуществимой задача исчерпывающего вычисления этой стратегии в играх, более сложных, чем игра в «крестики-нолики». Даже такая простая игра, как «крестики-нолики», является слишком сложной, чтобы можно было привести в лекции для неё полное дерево игры, перейдём к описанию тривиальной игры, показанной на рис.2. Возможные ходы игрока MAX из корневого узла обозначены как ![]() ![]() ![]() ![]() ![]() В этом определении оптимальной игры для игрока MAX предполагается, что игрок MIN также играет оптимальным образом: он максимизирует результат, соответствующий наихудшему исходу игры для MAX. А что было бы, если игрок MIN не играл оптимальным образом? В таком случае игрок MAX мог добиться ещё большего. Могут существовать другие стратегии игры против соперников, играющих неоптимальным образом, которые позволяют добиться большего, чем минимаксная стратегия; но эти стратегии обязательно действуют хуже ![]() MAX ![]() ![]() ![]() a1 a3 a2 ![]() ![]() ![]() M 3 2 2 IN ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() b1 b3 c1 c3 d1 d3 b2 c2 d2 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 3 12 8 2 4 6 14 5 2 ![]() ![]() против соперников, играющих оптимально. ^ Минимаксный алгоритм вычисляет минимаксное решение из текущего состояния. В нём используется простое рекурсивное вычисление минимаксных значений каждого состояния – преемника. Рекурсия проходит все уровни вплоть до листьев дерева, а затем минимаксные значения резервируются по всему дереву по мере обратного свёртывания рекурсии. В дереве на рис.2 алгоритм вначале выполняет рекурсию с переходом на нижние уровни до трёх нижних левых узлов, применяет к ним функцию полезности и устанавливает значения полезности этих узлов 3, 12 и 8, соответственно. Затем алгоритм определяет минимальное из этих значений 3 и возвращает его в качестве зарезервированного значения узла B. Аналогичный процесс позволяет получить зарезервированные значения 2 для узла C и 2 для узла D. Наконец, берётся максимальное значение из значений 3,2 и 2 для получения зарезервированного значения 3 корневого узла. Этот минимаксный алгоритм выполняет полное исследование дерева игры в глубину. Если максимальная глубина дерева равна ![]() ![]() ![]() ![]() Альфа-бета-отсечение Основная проблема минимаксного поиска состоит в том, что количество состояний игры, которое необходимо исследовать в процессе поиска, зависит экспоненциально от количества ходов. К сожалению, устранить экспоненциальную зависимость невозможно, но имеется возможность сократить её наполовину, поскольку правильное минимаксное решение можно вычислить без проверки каждого узла в дереве игры. Идея метода «альфа-бета-отсечение» в применении к стандартному минимаксному дереву состоит в том, что этот метод возвращает такие же ходы, что и минимаксный метод, но отсекает ветви, которые , по всей вероятности, не способны повлиять на окончательное решение. Снова рассмотрим дерево игры с двумя полуходами (рис.2) и снова проведём поиск оптимального решения, обращая особое внимание на то, что известно на каждом этапе этого процесса. Пояснения к данным этапам вычисления приведены на рис.3. A б) ![]() ![]() a) A ![]() ![]() ![]() ![]() ![]() B ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() B ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 3 3 12 ![]() B) A A Г) ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() B ![]() ![]() [3, 3] B C ![]() ![]() ![]() ![]() [3, 3] ![]() ![]() ![]() 3 12 8 3 12 8 2 Д) А е) А [3, 14] [3, 3] ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() В В ![]() ![]() ![]() С С [3, 3] [2, 2] ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Д Д ![]() [3, 3] ![]() ![]() ![]() 3 12 8 2 14 3 12 8 2 14 5 2 Рис.3. Этапы вычисления оптимального решения для дерева игры, показанного на рис.2. Результат состоит в том, что минимаксное решение можно выявить, даже не приступая к вычислению двух листовых узлов. В каждом листе дерева указаны возможные значения узла: первый лис, расположенный ниже узла B имеет значение 3. Поэтому В, который является узлом игрока MIN, имеет значение 3 (рис3а); второй лист, расположенный ниже узла В, имеет значение 12 (рис.3,б); игрок MIN должен избегать этого хода, поэтому значение В остаётся равным 3; третий лист, расположенный ниже узла В, имеет значение 8. Таким образом, после проверки всех преемников узла B, игрок MAX может сделать единственно правильный выбор со значением В равным 3 (рис.3,В). Первый лист, находящийся ниже узла С, имеет значение 2, но поскольку узел В позволяет достигать значения 3, игрок MAX ни в коем случае не должен выбирать узел С. Это означает, что нет смысла проверять остальных преемников узла С. Это-пример применения «альфа-бета-отсечения» (рис.3,г). Первый лист, находящийся ниже узла Д, имеет значение 14, второй -5, третий-2, т.е. Поскольку ни одно из этих значений не устраивает игрока MAX, он принимает решение сделать ход, ведущий к узлу В, что позволяет ему получить значение 3 (рис.3,е). Этот подход может также рассматриваться, как упрощение формулы для получения минимаксного значения, Допустим, что два преемника узла C на рис.3, ещё не обработанные в процессе вычисления, имеют значения ![]() ![]() ![]() ![]() Иными словами, значение корневого узла, и, следовательно, минимаксное решение не зависит от значений отсечённых листовых узлов ![]() Альфа-бета-отсечение может применяться к деревьям любой глубины; к тому же часто возникает возможность отсекать целые поддеревья, а не просто листья. Общий принцип состоит в следующем: рассмотрим узел ![]() ![]() ![]() ![]() ![]() Таким образом, при минимаксном поиске в глубину в любой момент времени достаточно рассматривать узлы вдоль единственного пути в дереве. Алгоритм «альфа-бета-отсечения» получил своё название по следующим двум параметрам, которые представляют пределы в зарезервированных значениях, присутствующих во всех узлах вдоль этого пути: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Игрок ![]() ![]() ![]() Противник ![]() Игрок ![]() ![]() ![]() Противник Рис.4. Альфа-бета-отсечение, общий случай. Алгоритм «альфа-бета-поиска» в процессе работы обновляет значения ![]() ![]() ![]() ![]() ![]() |