ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ И ТЕЛЕКОММУНИКАЦИИ
УДК 004.832.28
А.И. Безруков, В.Д. Голубев, И.Д. Зилов, В.В. Лавринова, Е.В. Хворостухина
ПРИМЕНЕНИЕ ИГРОВОГО ИСКУССТВЕННОГО ИНТЕЛЛЕКТА ДЛЯ РАЗРАБОТКИ СИМУЛЯТОРА ЭКОСФЕРЫ
Аннотация. Данная статья описывает процесс разработки компонентов компьютерной игры с использованием игрового искусственного интеллекта. В статье рассматриваются различные аспекты разработки, включая выбор платформы, проектирование приложения, создание игровых механик и алгоритмов игрового искусственного интеллекта. Рассматриваются основные подходы, используемые в игровом искусственном интеллекте, такие как алгоритм на основе системы полезностей, конечные автоматы, нейронные сети и эволюционные алгоритмы. Описывается процесс создания и применения игрового искусственного интеллекта на основе алгоритма функции полезности и процедурная генерация интерфейса и ландшафта, а также возможности развития разрабатываемой платформы.
Ключевые слова: игровой искусственный интеллект, Unity 3D, разработка игровых приложений, функция полезности, конечные автоматы, нейронные сети, эволюционные алгоритмы, симулятор экосферы, процедурная генерация
A.I. Bezrukov, V.D. Golubev, I.D. Zilov, V.V. Lavrinova, E.V. Khvorostukhina
APPLICATION OF GAME-BASED ARTIFICIAL
INTELLIGENCE TO DEVELOP AN ECOSPHERE SIMULATOR
Abstract. This paper describes the process of developing components to a computer game using game-based artificial intelligence. The paper covers various aspects of the design, including platform selection, application design, creation of game mechanics, and game-based artificial intelligence algorithms. The main approaches used in the game-based artificial intelligence are considered. They are the utility-based algorithm, finite
state machines, neural networks, and evolutionary algorithms. In this paper, we describe the process of creating and applying game-based artificial intelligence using the utility function algorithm. We also use procedural interface and landscape generation techniques, as well as development of our applications.
Keywords: game-based artificial intelligence, Unity 3D, game application development, utility function, finite state machines, neural networks, evolutionary algorithms, ecosystem simulator, procedural generation
Введение
Игровой искусственный интеллект (AI) является одной из наиболее востребованных и быстрорастущих областей развития искусственного интеллекта [1-2]. Современные игры стали интерактивными и весьма реалистичными, причем последнее относится не только к их визуальному представлению, но и к поведению персонажей игры. Это, в свою очередь, ведет к необходимости совершенствования интеллекта и адаптивных возможностей игровых персонажей (противников для игроков). Кроме того, игровой AI также может использоваться для автоматизации создания уровней сложности, принятия персонажами решений и формирования игровых стратегий, позволяющих игрокам улучшить игровой опыт.
В настоящее время существуют различные методы и подходы для реализации игрового искусственного интеллекта. Некоторые из них включают использование алгоритмов поиска и планирования, машинного обучения, нейронных сетей, эволюционных алгоритмов и др.
В данной статье рассматриваются основные подходы и инструменты, которые авторы использовали для создания симулятора экосферы - игрового приложения, имитирующего поведение животных в реальной среде обитания, а также описана роль игрового AI в различных жанрах игр и рассмотрены некоторые проблемы и перспективы развития этой области.
1. Классификация подходов
к созданию игрового искусственного интеллекта
В современном мире видеоигр и компьютерных игр искусственный интеллект (AI) играет ключевую роль в создании реалистичных и захватывающих игровых опытов. Существует множество подходов к созданию игрового AI, каждый из которых имеет свои преимущества и ограничения. В этой статье мы рассмотрим несколько популярных подходов к построению игрового AI [1].
1.1. Алгоритмы на основе системы полезностей
Алгоритмы на основе системы полезностей (Utility-based AI) - это подход к созданию AI, который основан на принципе максимизации функции полезности. Рассмотрим ряд параметров, которые влияют на принятие решений AI, например
здоровье персонажа, расстояние до цели, количество боеприпасов и т. д. AI использует их для вычисления функции полезности каждого действия, возможного в данных условиях, для конкретного персонажа.
Данный подход применяется в таких играх как RPG (Role-Playing Game) и стратегии в реальном времени, где AI, управляющий персонажем и сценарием игры, должен принимать множество решений на основе различных факторов, а сценарий игры не предусматривает мгновенной реакции персонажей (т. е. у AI есть время на выбор решения).
Однако этот подход будет менее эффективен в таких играх, где персонаж должен быстро принимать решения (например, в играх типа «стрелялки от первого лица»). В табл. 1 приведены примеры правил применения функции полезности для различных действий персонажа.
Таблица 1
Правила применения функции полезности для различных действий
Действие персонажа Условия
Поиск помощи Если видим противника и здоровье ниже среднего значения
Бегство Если здоровье близко к нулю и не видим союзника
Атака Если видим противника и здоровье равно максимуму
Патрулирование Если противник не виден
1.2. Конечные автоматы
Конечные автоматы (Finite State Machines) - это подход к созданию AI, может использоваться в играх, эволюцию которых можно рассматривать как последовательность переходов между определенным (конечным) количеством состояний. Каждое состояние автомата соответствует конкретному действию персонажа, а переходы между состояниями определяются текущими условиями игры.
Например, если персонаж видит врага, то AI переводит его в состояние «атаки», а если здоровье персонажа упало до определенного уровня, то AI переводит персонажа в состояние «побега». При этом могут быть использованы модели недетерминированного или вероятностного автомата, что добавит в игру элемент неожиданности и сделает ее более реалистичной.
Данный подход применяется в играх, где AI должен принимать решения на основе небольшого количества переменных, а время на принятие решения сильно ограничено. Он может быть особенно эффективен в играх с простой механикой, таких как платформеры и аркады. На рис. 1 приведены примеры некоторых правил перехода персонажа из одного состояния в другое в зависимости от обстоятельств.
Ожидание 10 сек
патрулирование^
Враг видим и здоровья много
Завершен маршрут патрулирования ] L.
Враг видим и враг слишком силен
V
Ожидание
Л
Врага не видно
\/
Враг видим и слишком силен
Поиск помощи
Враг видим и здоровья мало
Л
Друг видим
Врага не ввдно
_ Здоровья мало
Бегство -
<-
Враг видим ,i ¿Z jDCbz^ '.'-:г:
Рис. 1. Пример конечного автомата
1.3. Нейронные сети
Нейронные сети (Artificial Neural Networks) - это перспективный подход к созданию AI, который имитирует работу человеческого мозга, способного анализировать свой опыт и учиться. В играх нейронные сети могут использоваться для обучения AI, чтобы он мог улучшать свои навыки и стратегии на основе собственного опыта.
Так, например, игровой ИИ может проанализировать предыдущие атаки игрока и адаптировать свое поведение, блокируя комбинации, которые повторяет игрок. Это заставит игрока действовать более разнообразно и придумывать что-то новое. Например, в известной игре Mortal Combat (симулятор боев) если игрок использует один и тот же боевой приём несколько раз, то компьютер начинает его блокировать и контратаковать.
Однако нейронные сети имеют ряд недостатков, которые могут затруднить их использование для реализации игрового искусственного интеллекта. Один из них - это высокие требования к вычислительным ресурсам.
Нейронные сети требуют мощных аппаратных компонентов, таких как центральные процессоры или специализированные ускорители ИИ, больших объемов долговременной и оперативной памяти и определенной архитектуры аппаратного обеспечения. Кроме того, нейронные сети являются «черным ящиком», что может повлечь неожиданное поведение персонажей игры. Перед использованием нейронные сети должны быть обучены, что также накладывает дополнительные требования на разработку программы. Таким образом, нейронные сети - это мощный
и перспективный инструмент при создании игрового А1, однако в некоторых ситуациях их возможности являются избыточными.
1.4. Эволюционные алгоритмы
Эволюционные алгоритмы - направление в ИИ, в котором при поиске наилучшего решения А1 моделирует процессы биологической эволюции. Эти алгоритмы зачастую используются в задачах оптимизации, когда область допустимых решений имеет сложную структуру, поэтому классические методы оптимизации в таких случаях неприменимы. К этому классу алгоритмов, в частности, относится генетический алгоритм.
Суть метода выбора оптимальной стратегии поведения А1 основана на использовании методов естественной эволюции (наследование, мутация, отбор и кроссинговер). Этот подход заключается в создании популяции решений с различными стратегиями и поведениями и оценке их эффективности на основе выбранных разработчиком критериев.
Лучшие решения отбираются, и на их основе создаются новые популяции, наследующие комбинацию признаков лидеров с некоторыми изменениями (мутациями). Процесс повторяется до тех пор, пока не будет достигнута стратегия А1, близкая к оптимальной. Этот подход применяется в играх, где А1 должен адаптироваться к сложным и изменяющимся условиям, таким как стратегии в реальном времени и симуляторы. Он может быть особенно полезен в играх, где трудно определить оптимальную стратегию другими методами. В реальных играх, как правило, используются различные комбинации описанных подходов. Далее мы рассмотрим возможности применения метода вычисления функции полезности для создания А1, управляющего персонажами симулятора экосферы.
2. Разработка симулятора экосферы
Покажем пример реализации игрового А1 на примере симулятора экосферы, который представляет собой модель природной среды, в которой проживают и взаимодействуют два вида животных (волки и овцы) и произрастают растения. Перечислим основные функциональные требования к приложению:
- в игре должны быть два типа персонажей, управляемых А1;
- игра должна эмулировать поведение и взаимодействие животных в реальной
среде;
- пользователь имеет инструменты для влияния на данную экосферу, но и сама экосфера развивается по своим правилам;
- игра должна быть с 3Б-графикой;
- камера игры должна поддерживать масштабирование, повороты и движение;
- в начале игры Карта местности должна создаваться алгоритмом процедурной генерации.
2.1. Инструментальные средства
Существует множество инструментальных средств, которые можно использовать для реализации игрового AI. Перечислим наиболее популярные из них.
Unity - это один из самых популярных игровых движков, который включает инструменты для создания игрового AI.
Например, в Unity есть инструменты для создания искусственного интеллекта, такие как MLAgents [2-3], которые в своей основе используют технологию machine learning [4, 5], управляющую поведением персонажей, а также предоставляют возможности для создания и обучения нейронных сетей.
Unreal Engine - это другой популярный игровой движок, который имеет инструменты для создания игрового AI. Unreal Engine включает функции для реализации простых и сложных поведений AI, включая поддержку нейронных сетей.
Это лишь некоторые примеры инструментальных средств, которые можно использовать для реализации игрового AI. В зависимости от конкретной игры и ее требований могут потребоваться другие инструменты и технологии.
В качестве инструментального средства для решения рассматриваемой задачи был выбран движок Unity, так как он прост в использовании, а также предоставляет все необходимые ресурсы для создания игры разработчику. Для разработки используется универсальный язык программирования С#.
2.2. Программная реализация
В качестве подхода для реализации игрового AI был выбран алгоритм функции полезности. Приведем основные правила, которые в нём используются (табл. 2).
Таблица 2
Правила, используемые для реализации алгоритма полезности
Действие Условие полезности
Есть (питаться) Уровень голода достигает 3; видима еда
Убегать Видим противник
Искать еду Уровень голода больше 0; еда невидима
Исследовать местность Уровень голода равен 0
Размножаться Уровень голода равен 0, есть такая же особь в пределах видимости
Для реализации симулятора экосферы, а именно игрового приложения, моделирующего взаимоотношения животных в реальном мире, необходимо построить
диаграмму классов, которая будет описывать основные характеристики и действия животных (см. рис. 2).
Для реализации алгоритма полезности в симуляторе экосферы необходимо выполнить следующие шаги.
1. Определить список возможных действий, которые может совершить животное в экосфере, например поиск еды, поиск воды, охота, размножение и т. д.
2. Определить критерии, на основе которых будет оцениваться полезность каждого действия. В качестве критериев будем использовать следующие факторы: количество получаемых ресурсов, время, затрачиваемое на выполнение действия, риск потери здоровья или жизни персонажа и т. д.
3. Задать вес каждого критерия для всех животных, в каждой ситуации и для каждого действия, чтобы определить относительную важность данного фактора при выборе действия. В процессе использования приложения веса могут уточняться.
4. Программно реализовать функцию, которая будет вычислять полезность каждого действия на основе заданных критериев и их весов. Полезность будем считать равной сумме произведений входных весов для конкретных сущностей и коэффициентов, зависящих от внутренних модификаторов действия (сложившихся обстоятельств). Действие с наибольшей полезностью будет выбрано для выполнения.
На рис. 3 представлена структура классов, реализующих алгоритм полезности. Сначала создается класс Action, который содержит значения для каждого критерия (ресурсы, время, риск) и метод GetUtility, вычисляющий полезность действия на основе весов каждого критерия.
Возможны различные варианты реализации классов, наследуемых от класса Action. В нашем случае класс EatAction наследует Action и имеет свои дополнительные поля, которые характеризуют конкретное действие. Метод GetUtility переопределен в каждом классе, чтобы учитывать дополнительные поля при вычислении полезности. Например, EatAction имеет два дополнительных поля: hungerSatisfaction и healthBenefit, которые отображают удовлетворение голода и пользу для здоровья соответственно. По аналогии описываются другие компоненты функции полезности.
__Abstract Животное_
#Уровень голода (init) #Уровень жажды (int) #Пороговые уровни голода (intQ) #Пороговые уровни жажды0пЩ) +Возраст (int) -Граница возраста (int) +Здоровье (int) +Тип еды (enum) +Тип опасностей (enum) #Скорость перемещения (float) #Радиус обзора (float) #Скорость увеличения голода (int) #Скорость увеличения жажды (int)
-Поиск/ходьба IN(Vector текущие координаты) OUT (Vector новые координаты)
-Пить воду IN(Vector текущие координаты, int уровень жажды) OUT (void)
-Есть еду IN(Vector текущие координаты, int уровень голода) OUT (void)
-Убегать от опасности IN(Vector текущие координаты, Vector координаты опасности) OUT (void)
__Травоядное_
-Следовать за стадом
1М(Уес1ог текущие координаты. УейогП координаты особей своего вида) ОиТ(Уес1ог новые координаты)
_I _
®_Хищник_
-Помогать стае
1М(Уе^ог текущие координаты.
УейогП координаты особей своего вида. УесЬ)гП координаты еды) ОиТЛ/ейог новые координаты)
Рис. 2. Основные характеристики и действия животных
Рис. 3. Структура классов алгоритма полезности
Каждый класс имеет конструктор, который инициализирует все поля, включая унаследованные из класса Action. В методе GetUtility значение каждого поля действия умножается на соответствующий ему весовой коэффициент. Сумма этих произведений является общей полезностью.
Весовые коэффициенты задаются внешним кодом (в меню редактирования выбираем нужный тип животного, в котором уже заданы веса каждого действия) в каждый момент игры.
Довольно часто в игровых приложениях применяют алгоритмы процедурной генерации [5,6]. Их использование позволяет значительно сократить ресурсы, которые это приложение будет затрачивать, а также увеличивает возможности игрового приложения.
Процедурная генерация - это метод динамического создания контента с помощью алгоритмов, использующих математические методы и случайные числа для создания разнообразного и уникального контента [7].
В игровой индустрии она применяется для создания уровней, предметов, персонажей и других игровых элементов. Этот метод позволяет создавать большое количество контента за короткий промежуток времени.
Генерация происходит в реальном времени, поэтому разработчикам не требуется ничего заранее подготавливать или компилировать - изменения сразу перестраивают созданный мир. В нашем примере алгоритмы процедурной генерации используются для создания интерфейса.
Сформулируем требования к интерфейсу разрабатываемого приложения.
Требования к главному меню:
- должно иметь кнопку «перейти в меню животные»;
- должно иметь кнопку «выйти из меню» в виде крестика;
- обеспечить возможность появления других функций.
Требования к меню создания животных:
- должно иметь кнопку «вернуться в главное меню»;
- должно иметь кнопки для создания разных видов животных (необходимо учесть, что с развитием приложения в игре могут появиться новые виды животных);
- приложение должно быть гибким и развиваемым. Должна быть возможность появления новых функций (возможностей).
Перед началом работы над алгоритмом генерации интерфейса было необходимо подготовить базовые компоненты, схему которых можно увидеть на рис. 4.
▼ 0 AnimalMenu ▼ 0 Panel
▼ ® Scrollbar
▼ 0 Sliding Area © Handle
▼ © ViewPort
© ButtonContext
Рис. 4. Схема компонентов
Далее была реализована функция Start, генерирующая меню животных. Если меню животных больше размера панели, то появляется Scroll Bar (полоса прокрутки) и Sliding Area (перемещаемая область), которые позволяет пользователю
перемещаться по списку животных. Компонент Panel содержит кнопки: View Port, вызывающие список типов животных.
Функция Start срабатывает при запуске игры и создает кнопки с заданными настройками, количество кнопок зависит от количества видов сущностей, все они задаются заранее в исходных кодах приложения. При создании кнопки указывается обработчик событий onClick, чтобы при нажатии на эту кнопку вызывался метод Initial Position скрипта Animal Creation Service. Скрипт привязывается к объекту сцены Animal Menu и задает ему необходимые параметры.
В процессе разработки появлялись новые функции и требования к интерфейсу, которые без труда добавлялись в меню. Так, например, были добавлены кнопки для создания новых видов животных и кнопка в виде круговой диаграммы, при нажатии на которую появляется статистика по видам животных - количество особей каждого вида. На данный момент интерфейс имеет следующий вид (см. рис. 5, 6).
Рис. 6. Меню животные На рис. 7 показан пример работы симулятора экосферы, а именно
взаимодействие животных друг с другом. Здесь видно, как волки отделяют от стада
овцу, которая пытается убежать от волков. Волки пытаются её окружить, чтобы ей не
удалось убежать. Данный пример показывает, как локальный ИИ каждого волка взаимодействует с глобальной ИИ стаи.
Рис. 7. Охота волков на овцу
На рис. 8 представлен процесс генерации ландшафта процедурным способом в программе World Machine. Здесь можно настроить размер карты, сид мира (уникальный параметр генерации), параметры холмистости, эрозии почвы, рек и другие свойства. Выбирая различные комбинации параметров, разработчик может динамически создавать ландшафт в соответствии с идеей игры. Так, используя эту простую систему настроек, можно реализовать гористую местность, устье реки, лесную зону, луг и т. д.
(4с Ш Wedd C«nm»ndi Сс.х« Сетлмл* »«wen Paramt« Ос.««-. HdpfcWrt
jiidi i.* и ш ?• а а а а о о a
у. Tools • favorites и Mocios J Generator .J Output J Combiner Ц Filler _J Natural Л Selector 3 Converter S Parameter D Flow Control
Рис. 8. Генерация карты в World Machine
Заключение
В настоящей работе описано игровое приложение, разработанное на платформе Unity 3D и реализующее один из подходов создания AI - метод функции полезности.
Использование алгоритма полезности позволило реализовать поведение персонажей-животных, весьма похожее на поведение реальных животных. Например, задавая количество хищников и травоядных, пользователь может видеть, как при изменении количества животных одного вида меняется популяция другого вида.
В частности, если пользователь добавит очень много волков, то они съедят всю популяцию овец, что впоследствии приведет к вымиранию самих волков. С другой стороны, слишком малая популяция волков позволит овцам размножаться до тех пор, что им не хватит корма. Овцы начнут голодать, и их популяция будет постепенно сокращаться.
Данное приложение является демонстрационным примером реализации игрового AI, может применяться в качестве учебного-методического материала при изучении дисциплин, связанных с разработкой игр, а также оно может быть использовано в качестве развлекательного и обучающего приложения для детей младшего школьного возраста как иллюстрация необходимости бережного отношения к природным экосистемам.
Список источников
1. Питер Норвиг, Стюарт Рассел. Искусственный интеллект: современный подход. 2-е изд.: пер. с англ.Москва: ООО «Изд. дом Вильямс», 2016.
2. Curtis Bennett, Dan Violet Sagmiller. Unity AI Programming Essentials.Packt Publishing, 2014.
3. Джозеф Хокинг. Unity в действии. Мультиплатформенная разработка на C#. 2-е междунар. изд. 2018.
4. Бонд Джереми Гибсон. Unity и C#. Геймдев от идеи до реализации.Санкт-Петербург: Piter, 2020.
5. Runevision. Rune Skovbo Johansen. Procedural world potentials: The simulation, functional and planning approaches.URL: https://blog.runevision.com/2015/08/procedural-world-potentials-simulation.html (дата обращения: 03.06.2022).
6. Шорт Тани и Адамс Тарна. Процедурная генерация в гейм-дизайне. Москва: ДМК Пресс, 2020.
7. Документация Unity. URL: https://docs.unity3d.com/Manual/index.html (дата обращения: 06.06.2022).
Сведения об авторах
Безруков Алексей Иосифович -
кандидат экономических наук, доцент кафедры «Информационно-коммуникационные системы и программная инженерия» Саратовского государственного технического университета имени Гагарина Ю.А.
Голубев Владислав Дмитриевич —
бакалавр кафедры «Информационно-коммуникационные системы и программная инженерия» Саратовского государственного технического университета имени Гагарина Ю.А.
Зилов Иван Дмитриевич —
бакалавр кафедры «Информационно-коммуникационные системы и программная инженерия» Саратовского государственного технического университета имени Гагарина Ю.А.
Лавринова Валентина Васильевна —
бакалавр кафедры «Информационно-коммуникационные системы и программная инженерия» Саратовского государственного технического университета имени Гагарина Ю.А. Хворостухина Екатерина Владимировна — кандидат физико-математических наук, доцент кафедры «Информационно-коммуникационные системы и программная инженерия» Саратовского государственного технического университета имени Гагарина Ю.А.
Aleksey I. Bezrukov -
PhD (Economics),
Associate Professor,
Department of Information
and Communication Systems
and Software Engineering, Yuri Gagarin
State Technical University of Saratov
Vladislav D. Golubev -
Undergraduate student,
Department of Information
and Communication Systems
and Software Engineering, Yuri Gagarin
State Technical University of Saratov
Ivan D. Zilov -
Undergraduate student, Department of Information and Communication Systems and Software Engineering, Yuri Gagarin State Technical University of Saratov
Valentina V. Lavrinova -
Undergraduate student,
Department of Information
and Communication Systems
and Software Engineering, Yuri Gagarin
State Technical University of Saratov
Ekaterina V. Khvorostukhina -
PhD (Physics and Mathematics)
Associate Professor,
Department of Information
and Communication Systems
and Software Engineering, Yuri Gagarin
State Technical University of Saratov