Подробное руководство по этому увлекательному проекту с использованием мультиагентной системы

Введение

О многоагентной системе

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

Как видите, создание многоагентной системы — это разумный способ эмулировать и понимать сложные системы с очень небольшим количеством параметров. Каждый агент должен быть автономным, локально осведомленным о своей среде и не иметь власти над другими агентами. Вы можете найти такую ​​систему в онлайн-торговле, реагировании на стихийные бедствия, наблюдении, моделировании структур и видеоиграх, таких как Sim City.

Цель

Основная цель этой статьи — ознакомиться с многоагентными системами и поэкспериментировать с Flutter Flame. Для этого я решил смоделировать стаю птиц. Во-первых, на это очень приятно смотреть, а во-вторых, мы можем настроить такие параметры, как способность к полету или поле зрения, и посмотреть, как это повлияет на их воспринимаемое поведение.

Подробнее об этом читайте в этой газете.

TL;DR

Получите полный проект на моем GitHub. Поиграйте с ним или увидьте его вживую.





Обзор

Прежде чем поиграть (немного) с Flame, нам нужно определить наши модели. Ему нужны 2D-координаты, скорость, азимут, поле зрения, расстояние обзора и ограничения, чтобы ограничить его маневренность. Все это будет выражено в Международной системе единиц.

И используя эти способности, он должен уметь следовать трем правилам:

  • Двигайтесь к центру стаи, чтобы избежать хищников.
  • Отойдите от других птиц, чтобы избежать столкновения.
  • Летите в том же направлении, что и ближайшие птицы в поле его зрения.

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

Давайте приступим к этому

Обычно мне нравится создавать environment данные, которые будут переданы agents во время моделирования. В этом случае нам не нужно много.

Чтобы добавить пикантности, мы создадим два типа Agent, представляющих два разных вида птиц. Каждая птица летит со своим видом.

Во время каждого вычисления рендеринга птица будет выполнять action, имитируя свое поведение, а updatePositionInToricSpace будет обрабатывать торические ограничения нашей среды.

Ключевой метод, на который стоит обратить внимание, это action . Когда мы доберемся до фактической реализации, это то, где будет находиться поведение. dt — это дельта времени, прошедшее между двумя действиями, выраженное в секундах.

Наша симуляция будет иметь дело с pigeon и sparrow . У них есть некоторые общие летные характеристики, но мы будем считать, что воробьи быстрее и проворнее голубей.

Вспомогательные методы

Всякий раз, когда птица пытается превысить свою максимальную скорость, мы корректируем ее вектор скорости.

Методы поведения должны учитывать только агентов в fieldOfView и distanceView текущего. Ведь ты же не видишь, что у тебя за головой.

Методы поведения

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

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

Третье правило, усредняйте скорость соседей и применяйте коэффициент выравнивания, чтобы справиться с тем, насколько быстро мы меняем скорость.

В конце концов

Все это приводит к поведению, описанному в методе action ниже. Двигайтесь к центру стаи себе подобных, избегайте столкновений со всеми птицами и летите в том же направлении/скорости своего вида. То же самое касается Sparrow класса.

Наконец, нам нужно создать Component для каждого типа птиц. Это классы, которые Flame будет использовать для рендеринга наших птиц.

action переопределяется только для обновления вектора position, предоставленного PositionComponent, а dt — это просто разница во времени между двумя кадрами, и мы все знаем, что distance = speed * time.

Тогда нам просто нужно случайным образом заполнить наш мир птицами, и все готово!

Заключение

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

Ваше воображение - это предел!