Дмитрий Сахань
Эта статья в основном предназначена разработчикам игрушек с искусственным интеллектом, но также может оказаться полезной другим представителям по созданию разума. Сразу стоило бы сказать, что неудачи интеллекта некоторых современных стратегических игр заключаются в неверном подходе к построению самого интеллекта. Необходимо создать виртуального противника, а не пытаться внедрить разум в каждого игрового персонажа.
Посмотрите, как играет человек. Он сосредоточивается на важных с его точки зрения участках карты, подчас абсолютно игнорируя ее другие участки. Где вы видели, чтобы человек из хода в ход просматривал всю карту, считал все шансы солдат и тому подобное. Уже через несколько ходов у него пропадет желание играть, человек просто устанет. Прибавьте сюда его эмоциональный подход: забыл собрать ресурсы, надоело строить, не обратил внимания. В итоге получите трудно прогнозируемую систему. Человеку же противопоставляют строгую математическую модель, в результате имеем прямолинейную игру и неспособность отойти от такой линии.
Виртуального противника необходимо также учить ошибаться, лениться, сосредоточивать внимание, быть в меру разумным, и всяким разным человеческим штучкам. Разум тянет за собой соответствующие понятия из психологии. Без их реализации игра никогда не будет разумной. При всем пугающем звучании психологических понятий, они относительно несложны по действиям. В большинстве случаев человек просто не представляет, как выразить подобное понятие в виде алгоритмических решений.
Психологическое понятие напрямую связано со средой обитания персонажа, следовательно, алгоритмическая реализация понятия может значительно отличаться зависимо от среды обитания. Например, алгоритм оценки окружающей обстановки вокруг игрового персонажа будет значительно проще, чем такой же алгоритм у человекоподобного робота, потому что среды обитания, а также влияющие на оценку обстановки факторы, у них разные. Универсальных алгоритмов под любые среды обитания создать невозможно. Реально лишь описать общие составляющие психологического понятия, и как они связаны друг с другом. На основе таких описаний строится алгоритм применительно к определенной среде обитания.
Постараюсь объяснить создание скелета только необходимых в игре психических функций разума. Объяснения буду строить на базе пошаговой стратегии. В принципе, похожий скелет также подойдет как для стратегий в реальном времени, так и для многих игр жанра 3D-Action.
Для начала нужно уяснить, что настоящий игровой разум - это система, в которой традиционные математические методы являются лишь подспорьем. Грубо говоря, виртуальный противник оперирует потоком информации о происходящих в игре событиях и их последствиях. Он как бы не опускается до оценки отдельного персонажа, он больше наблюдатель и аналитик, и его выводы похожи на выводы полководца, склонного управлять армией, нежели каждым солдатом в отдельности.
Теперь рассмотрим самые важные психические функции, возлагаемые на виртуального противника. Всего их четыре. Первые две из них наиважнейшие. Это функция афферентного синтеза и функция принятия решений. Функции моделирования программы действия и выполнения самого действия реализуются уже имеющимися и проверенными временем алгоритмами современных игрушек. К сожалению, часто бывает, что за интеллект в игре выдают последние две функции, в то время как первые две функции совсем отсутствуют.
Афферентный синтез представляет собой обобщение потоков информации. Слово "афферентный" обозначает "обобщающий", а в дальнейшем используемое слово "афферентация" обозначает "обобщение". Синтез состоит из обстановочной афферентации, доминирующей мотивации, пусковой афферентации и памяти. Начало такта синтеза всегда начинается с обстановочной афферентации и заканчивается пусковой афферентацией.
Обстановочная афферентация - обобщение текущей обстановки (состояние дел) в сложившейся ситуации. В простом виде процесс обобщения выглядит следующим образом. Сначала на игровой карте отбираются только видимые виртуальному противнику вражеские персонажи (на исследованных областях карты) и, естественно, свои собственные персонажи. Чужие солдаты используются для обобщения состояний по угрожающим факторам, свои же солдаты - для обобщения ситуаций по собственным силам, возможному накоплению денег, сбору артефактов, построению домов и так далее.
Однако нужно заметить, что помимо общих для виртуального противника угрожающих факторов есть еще угрожающие факторы для его каждого солдата. И этот вопрос решается теми же механизмами отбора вражеских персонажей, только применительно к каждому собственному солдату. Соответственно в угрожающие факторы добавляются угрозы каждому собственному персонажу, а в сведения по собственным силам и возможностям накопления - данные с силами и возможностями конкретных солдат.
В дальнейшем эти сведения необходимы функции принятия решений. Если данные по каждому конкретному персонажу необходимы для его эффективного управления, то общие для виртуального противника сведения по угрозам, силам и возможностям нужны для принятия таких решений, как построение новых городов, доукомплектация войск, покупка нового оборудования, технологий и тому подобного.
Операция обобщения сводится к банальному количественному подсчету угрожающих и привлекающих факторов. Другими словами: "Скажи мне в числовом выражении, сколько у меня возможностей поднять золота, напасть на врага, получить от него же тумаков и так далее". Также обращаю ваше внимание на то, что в функции обстановочной афферентации виртуальный противник просто обязан задействовать такое понятие как "внимание".
Внимание - осуществление избирательного отбора нужной информации. То есть внимание играет роль ее фильтра. Оно фокусируется на какой-нибудь центральной точке информации и покрывает в разные стороны от этой точки определенную область, называемую областью внимания. В нашем случае центральной точкой внимания является игровой персонаж, а область внимания ограничивается, например, максимальной длиной движения персонажа за один ход. Таким образом, снижается объем обрабатываемой информации и отсекаются персонажи, особо не влияющие на ситуацию в ближайший 1-2 ход.
Далее хочу наглядно показать, как работает обстановочная афферентация, оперирующая областью внимания. Это отражено на приведенном ниже рисунке. Красным цветом выделены персонажи виртуального противника, синим - вражеские персонажи. Маленькие черные крестики обозначают, например, золото. Черные поля на карте - это еще не исследованные виртуальным противником земли. Зеленым цветом выделена область внимания обстановочной афферентации для каждого персонажа виртуального противника. Как было сказано, размер квадрата области внимания таков, что за один ход персонаж может достигнуть только края этого квадрата. Квадрат взят исключительно для наглядности, хотя в реальной ситуации область внимания должна напоминать круг вокруг персонажа.
Как видно из рисунка, городу не угрожает никакая опасность, а вот персонажу "C" грозит опасность превосходящих сил противника. Персонаж "A" способен взять максимум золота. Кроме того, персонажи "A" и "B" за один ход могут прийти друг другу на помощь. Также существует общая угроза виртуальному противнику, поскольку на карте существует на 1 солдат больше вражеских сил. Думаю, не сложно сделать вывод, что персонаж "A" нужно отправить собрать максимум золота для покупки/строительства нового солдата. Персонаж "B" можно отправить вслед за персонажем "A", чтобы на него не вздумал напасть близко стоящий вражеский солдат. А вот персонажу "C" нужно приказать выходить из зоны опасности, так как его сил не хватит для сражения.
Фактически, виртуальный противник стремится снизить возникшую угрозу и минимальными действиями компенсировать перевес вражеских сил, чтобы уже в следующих ходах достойно встретить нападение. В результате у него начинает появляться умение выжидать подходящего момента.
Еще хотелось бы заметить, что виртуальному противнику для более продвинутого оценивания обстановки можно добавить анализ вражеских персонажей. То есть дать ему возможность взглянуть на свои армии глазами врага. Тогда он сможет дополнительно оценивать слабые стороны вражеских солдат, а значит, будет способен выяснить, какой из них нужно атаковать сейчас, а какой не стоит. Также не помешает, что виртуальный противник сможет оценить, кого предположительно из собственных солдат станет атаковать враг. Но тут необходимо помнить, что у врага своя информация об исследованных участках карты, и этой информацией не владеет виртуальный противник, ведь он видит карту со своей точки зрения.
Продолжим рассматривать оставшиеся части функции афферентного синтеза. Следующей частью идет доминирующая мотивация. В игре она как бы содержит направляющую линию "чего больше всего хочет добиться игрок в данный момент времени". Если реализована доминирующая мотивация, тогда виртуальный противник может иногда менять стратегию своего поведения. Например, сейчас он хочет накопить побольше денег, чтобы создать супер оружие и разом уничтожить всех врагов, но через несколько ходов он видит приближающуюся к его городу армию противника. По расчетам он с ней не справится своими силами, но совместно с силами третьего противника может одержать верх. В этот момент доминирующим мотивом станет выступать подкуп третьего противника, даже в ущерб предыдущему мотиву накопления большого количества денег. В результате видим изменение стратегии поведения, вызванное доминирующей мотивацией.
Доминирующая мотивация просчитывается сразу за обстановочной афферентацией, поскольку в этот момент виртуальному противнику уже количественно известно, что ему угрожает, а что у него хорошо. Сложного здесь ничего нет, просто из хода в ход виртуальный противник ведет отдельную статистику по собственным достижениям и уровню угрозы от каждого врага. Если статистика достижений виртуального противника неуклонно растет, то есть повод решить, что он избрал верную стратегию поведения и доминирующую мотивацию менять не стоит. Также при падении достижений ниже заданного диапазона или при схожем возрастании уровня угроз возникает повод в изменении доминирующей мотивации, то бишь стратегии поведения.
Пусковая афферентация и память. Если с памятью все понятно - это просто набор знаний об игровых персонажах, то пусковая афферентация (или обобщающий пуск) неразрывно связана с механизмами психики. Как только в окружающем мире появляется что-то, способное удовлетворить нашу потребность, включается механизм пусковой афферентации, а она включает наше удовлетворяющее потребность поведение. Чтобы понять окружающий мир, необходимо привлекать психику, а психика в свою очередь состоит из познавательной (когнитивной), регулятивной и коммуникативной функций.
Пусковая афферентация обслуживается следом за доминирующей мотивацией. В этот момент уже сформирован мотив поведения на текущий ход игры, и он передается пусковой афферентации, чтобы она искала в окружающем мире то, что может удовлетворить возникшую потребность. Например, при возникновении в описанном примере мотива подкупа третьего противника пусковая афферентация должна выяснить в своей базе знаний, реально ли его подкупить, хватит ли средств на подкуп и как его выполнять (взятка, бартерный обмен артефактами, городами). Результатом работы пусковой афферентации является сигнал для функции принятия решений о наличии возможности удовлетворить мотив доминирующей мотивации.
Если нет возможности удовлетворить новую потребность, тогда игровой персонаж должен либо простаивать игровой ход, либо должен вернуться к прежнему мотиву поведения. Из этих соображений структура доминирующей мотивации должна напоминать подобие стека. Получили новый мотив поведения, поместили его на вершину стека мотивации. Нет возможности удовлетворить мотив, значит, или выбрасываем его с вершины стека и возвращаемся к прошлому мотиву, или в каждом ходе двигаемся по мотивам от вершины стека вниз, пока не найдем мотив, который можем удовлетворить (потом удаляем этот мотив из стека).
В последнем варианте стека персонаж получает умение оперировать не забытыми, но отсроченными во времени мотивами. К примеру: "Сейчас не смогу подкупить третьего противника, но мне это крайне нужно, поэтому пока отложу мотив в памяти, и буду ждать лучшего времени. А вместо этого займусь сбором золота".
Эта функция должна просто проанализировать результаты работы функции афферентного синтеза. На основе анализа выбирается приемлемое решение. В общем, анализ реализуется не более чем на обычных сравнениях результатов, лишь изредка прибегая к другим действиям. Постараюсь объяснить, какие это могут быть другие действия.
Давайте снова вернемся к рисунку работы обстановочной афферентации и попытаемся решить, что делать с персонажем "C". Понятное дело, его нужно уводить из зоны опасности. Но куда, в какую сторону? Обстановочная афферентация для персонажа была выполнена в пределах области внимания, поэтому неизвестно, как обстоят дела за пределами этой области. Из этого следует, что функция принятия решений должна уметь выполнять для проблемных персонажей своего рода урезанную обстановочную афферентацию с гораздо большей областью внимания.
Почему урезанную? А потому что для данных персонажей ищется путь выхода, а не сколько каждый из них может набрать золота, артефактов и тому подобного. Не исключено, что можно применить и полную афферентацию. Возможно, персонаж может набрать максимум золота в обмен на свою смерть. Для этого область внимания расширяется, например, до максимальной длины движения персонажа за два-три хода. Если за это время ему никто из своих солдат не придет на помощь (в расширенной области внимания продолжают перевешивать вражеские силы), тогда он все равно погибнет. В этом случае лучшим решением будет отправить его в направлении неисследованных областей карты или в сторону накопления золота, чтобы смерть персонажа не была напрасной.
Эти функции реализуется при помощи различных существующих алгоритмов поиска пути и тому подобных. Как вы понимаете, такие алгоритмы имеют множество модификаций и привязаны исключительно к сюжету игры. В Интернете достаточно информации по подобным алгоритмам. Кстати, большинство из них относятся именно к функции моделирования программы действия. Так, например, алгоритм поиска пути только лишь моделирует программу действия: через какие клетки карты персонаж пойдет в требуемое место. А вот только затем движок игры двигает персонаж, выполняя тем самым смоделированное действие.