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

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

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

Сама симуляция
Сама симуляция

Средства разработки

Чтобы не усложнять себе жизнь (а потом создать простой и понятный интерфейс), я выбрала Unity как основную платформу разработки. Для простого 2D-проекта – это, пожалуй, одно из лучших решений: здесь не нужно погружаться в детали низкоуровневой реализации, как, например, в случае с C++ или Python + Pygame.

Одно из главных преимуществ Unity – это удобный визуальный редактор сцены, который позволяет быстро настраивать мир, объекты и их поведение. Это экономит массу времени и делает процесс разработки наглядным и гибким.

Так как Unity работает на базе C# / .NET, мы получаем в распоряжение мощный и при этом понятный язык программирования. C# легко читается, содержит массу удобных фич и хорошо подходит как для новичков, так и для продвинутых разработчиков.

В этом проекте я не использую готовые нейросети или ML-библиотеки. Весь искусственный интеллект написан вручную, с нуля. Это дает полную свободу в настройке поведения и лучше помогает понять, как работает базовый ИИ на уровне простых правил и логики.

Как создать простой ИИ?

На самом деле, в данном проекте на нынешнем этапе разработки присутствует только самый базовый и самый простой искусственный интеллект. Но, как мне кажется, тем, кто еще никогда не занимался нейронными сетями (да и вообще ИИ), будет интересен ответ на вопрос: а как такое сделать и что вообще считать "искусственным интеллектом"?

В чем суть?

Этот раздел скорее для тех, кто совсем ничего пока что не понимает в ИИ – и хочет разобраться на примере чего-то очень простого, но работающего.

Главная идея состоит в простой истине: ИИ – это не всегда про сложные нейросети и бигдату. Иногда достаточно написать набор правил, по которым ваше существо будет принимать решения. Так уже можно создать вполне реалистичное поведение.

Представьте, что у нас есть какое-то животное. Оно может голодать или быть сытым, может бояться хищных зверей, а также иногда может захотеть размножаться. А что оно должно делать? Убегать? Или искать еду? А может спать? Самый простой способ смоделировать такое поведение – дать каждой возможной команде так называемый вес. Вес – это число, показывающее насколько сильно сейчас хочется что-то сделать.

Возникает новый вопрос: а как указать, что какое-то действие является правильным? Как в реальности: дать награду. После каждого действия (почти как в дрессировке) животное получает награду, но в нашем случае – это небольшой бонус к «весу» этого действия, а не вкусняшка (хотя вес она тоже прибавляет…). Подобный механизм называют обучением с подкреплением (Reinforcement Learning), но у нас он, конечно, очень упрощен. Такой подход позволяет животным адаптироваться к ситуации. Хищники со временем начнут понимать, что лучше преследовать конкретную цель, а травоядный зверь - осознавать, что от угрозы надо убегать.

А как реализовать?

Нам не понадобятся всем известные TensorFlow или GPU, да даже куча строк код не нужна. Достаточно такой логики:

  1. Ввод: текущее состояние – голод, угроза, энергия и т. д.

  2. Обработка: выбор самого желаемого действия, исходя из весов.

  3. Вывод: выполнение этого действия.

  4. Итог: обучение.

Кажется, что все слишком просто? Но на самом деле такой ИИ даже постепенно эволюционирует и начинает думать все лучше и лучше.

Сама реализация

Для начала, нужно определиться с параметрами животного в симуляции. Тут можно придумать все, что душе угодно, но в основе будут лежать три параметра: голод, энергия и «чувство опасности».

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);
}

По сути, мы просто прибавляем нашу награду к весу, как и обсуждалось выше, после чего нормализуем значение, чтобы оно не вышло за пределы (просто для безопасности и собственного спокойствия).

А логика проста: если наш "питомец" поел и сыт, то растения есть полезно (ну или других животных... речь о хищнике). Если же сбежал от опасности, то надо запомнить, что убегать при угрозе – очень хорошая идея!

Именно так можно создать очень простой, но забавный в своих решениях ИИ, даже без подключения сложной нейросети.

Заключение

Создание ИИ – это необязательно сложный процесс. Немного математики и "дрессировки" создадут вполне неплохую симуляцию реальной жизни. Если вы никогда не работали с ИИ, попробуйте начать с малого. Как показывает практика, это не только полезно, но и очень интересно.

Проект постепенно будет развиваться с помощью добавления "биологии", а также усложнения обучения животных. Но главное, что этот проект дает опыт и, надеюсь, было интересно про него прочитать это небольшую статью!

В будущем я планирую выпустить еще несколько статей по поводу этого проекта, можете ожидать новостей, ну и спасибо за внимание!

Комментарии (0)