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

Средства разработки
Чтобы не усложнять себе жизнь (а потом создать простой и понятный интерфейс), я выбрала Unity как основную платформу разработки. Для простого 2D-проекта – это, пожалуй, одно из лучших решений: здесь не нужно погружаться в детали низкоуровневой реализации, как, например, в случае с C++ или Python + Pygame.
Одно из главных преимуществ Unity – это удобный визуальный редактор сцены, который позволяет быстро настраивать мир, объекты и их поведение. Это экономит массу времени и делает процесс разработки наглядным и гибким.
Так как Unity работает на базе C# / .NET, мы получаем в распоряжение мощный и при этом понятный язык программирования. C# легко читается, содержит массу удобных фич и хорошо подходит как для новичков, так и для продвинутых разработчиков.
В этом проекте я не использую готовые нейросети или ML-библиотеки. Весь искусственный интеллект написан вручную, с нуля. Это дает полную свободу в настройке поведения и лучше помогает понять, как работает базовый ИИ на уровне простых правил и логики.
Как создать простой ИИ?
На самом деле, в данном проекте на нынешнем этапе разработки присутствует только самый базовый и самый простой искусственный интеллект. Но, как мне кажется, тем, кто еще никогда не занимался нейронными сетями (да и вообще ИИ), будет интересен ответ на вопрос: а как такое сделать и что вообще считать "искусственным интеллектом"?
В чем суть?
Этот раздел скорее для тех, кто совсем ничего пока что не понимает в ИИ – и хочет разобраться на примере чего-то очень простого, но работающего.
Главная идея состоит в простой истине: ИИ – это не всегда про сложные нейросети и бигдату. Иногда достаточно написать набор правил, по которым ваше существо будет принимать решения. Так уже можно создать вполне реалистичное поведение.
Представьте, что у нас есть какое-то животное. Оно может голодать или быть сытым, может бояться хищных зверей, а также иногда может захотеть размножаться. А что оно должно делать? Убегать? Или искать еду? А может спать? Самый простой способ смоделировать такое поведение – дать каждой возможной команде так называемый вес. Вес – это число, показывающее насколько сильно сейчас хочется что-то сделать.
Возникает новый вопрос: а как указать, что какое-то действие является правильным? Как в реальности: дать награду. После каждого действия (почти как в дрессировке) животное получает награду, но в нашем случае – это небольшой бонус к «весу» этого действия, а не вкусняшка (хотя вес она тоже прибавляет…). Подобный механизм называют обучением с подкреплением (Reinforcement Learning), но у нас он, конечно, очень упрощен. Такой подход позволяет животным адаптироваться к ситуации. Хищники со временем начнут понимать, что лучше преследовать конкретную цель, а травоядный зверь - осознавать, что от угрозы надо убегать.
А как реализовать?
Нам не понадобятся всем известные TensorFlow или GPU, да даже куча строк код не нужна. Достаточно такой логики:
Ввод: текущее состояние – голод, угроза, энергия и т. д.
Обработка: выбор самого желаемого действия, исходя из весов.
Вывод: выполнение этого действия.
Итог: обучение.
Кажется, что все слишком просто? Но на самом деле такой ИИ даже постепенно эволюционирует и начинает думать все лучше и лучше.
Сама реализация
Для начала, нужно определиться с параметрами животного в симуляции. Тут можно придумать все, что душе угодно, но в основе будут лежать три параметра: голод, энергия и «чувство опасности».
public float Hunger { get; set; }
public float Energy { get; set; }
public bool IsThreatNearby { get; set; }
Для простоты реализации - да и для реалистичности - состояния обновляются через интервалы времени. Примерно так:
public void Tick(float deltaTime)
{
Hunger += deltaTime * 5;
Energy -= deltaTime * 3;
}
Также в подобном методе можно обновлять ну вот вообще все о животном! Его возраст, есть ли рядом угроза, его желание размножаться и т.д.
Итак у нас есть текущее состояние животного! Отлично, а теперь надо заставить его делать выбор. Для этого понадобится отдельный метод:
public Action DecideAction()
{
if (IsThreatNearby)
return Action.RunFromThreat;
actionWeights[Action.EatPlant] = Mathf.Lerp(1f, 10f, Mathf.InverseLerp(30f, 150f, Hunger));
actionWeights[Action.Wander] = Mathf.Lerp(1f, 0.1f, Mathf.InverseLerp(30f, 150f, Hunger));
return actionWeights.OrderByDescending(kvp => kvp.Value).First().Key;
}
Проще говоря, если животное голодно, то оно с наибольшей вероятностью захочет также и поесть. А если же оно уже сыто, то начнет блуждать, спать или что-то еще, если вы это прописали. Ну а сам вес действия зависит от текущих параметров.
Каждое действие выполняется, после того как его выбрали. Это можно реализовать на свое усмотрение, но самое главное – отнять показатель голода, энергии или любого другого параметра, который влияет на смену состояния.
Ну и наконец, само обучение! Животное должно запомнить удачные действия, для этого можно прописать простой метод:
public void Learn(Action action, float reward)
{
actionWeights[action] += reward;
actionWeights[action] = Mathf.Clamp(actionWeights[action], 0f, 10f);
}
По сути, мы просто прибавляем нашу награду к весу, как и обсуждалось выше, после чего нормализуем значение, чтобы оно не вышло за пределы (просто для безопасности и собственного спокойствия).
А логика проста: если наш "питомец" поел и сыт, то растения есть полезно (ну или других животных... речь о хищнике). Если же сбежал от опасности, то надо запомнить, что убегать при угрозе – очень хорошая идея!
Именно так можно создать очень простой, но забавный в своих решениях ИИ, даже без подключения сложной нейросети.
Заключение
Создание ИИ – это необязательно сложный процесс. Немного математики и "дрессировки" создадут вполне неплохую симуляцию реальной жизни. Если вы никогда не работали с ИИ, попробуйте начать с малого. Как показывает практика, это не только полезно, но и очень интересно.
Проект постепенно будет развиваться с помощью добавления "биологии", а также усложнения обучения животных. Но главное, что этот проект дает опыт и, надеюсь, было интересно про него прочитать это небольшую статью!
В будущем я планирую выпустить еще несколько статей по поводу этого проекта, можете ожидать новостей, ну и спасибо за внимание!