Реализовать swarm coordination (10 агентов, без центрального контроля)

ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Реализовать swarm coordination (10 агентов, без центрального контроля)

1. Цель задачи

Разработать симуляцию роя из 10 автономных агентов, которые демонстрируют эмерджентное поведение (например, коллективный сбор ресурсов или согласованное перемещение) без единого центра управления. Агенты принимают решения на основе локальной информации и взаимодействуют только с ближайшими соседями. Ключевой результат: получить работающую симуляцию, где в ходе выполнения командной задачи проявляются такие эмерджентные свойства, как самоорганизация, разделение ролей или синхронизация, при этом ни один агент не выполняет роль лидера или координатора.

2. Исходные данные

Что нужноОткуда взять
Постановка задачи роя (например, «собрать все ресурсы на поле» или «достичь общей цели, избегая препятствий»)Спроектировать самостоятельно на основе известных задач: foraging, clustering, flocking
Параметры агентов: радиус восприятия, скорость, алгоритм принятия решенийОпределить в ходе проектирования (см. Этап 1)
Среда симуляции (2D поле, координаты ресурсов, препятствия)Реализовать программно с помощью выбранного стека
Библиотеки и инструменты для визуализацииУстановить через пакетный менеджер (pip)
Метрики для оценки эмерджентного поведения (например, степень кластеризации, время сбора ресурсов, энтропия распределения)Выбрать после реализации базовой симуляции

Если нет реального инструмента — симулируем:

  1. Установите Python 3.10+ и среду разработки (VS Code, PyCharm или Jupyter).
  2. Создайте виртуальное окружение: python -m venv swarm_env.
  3. Установите необходимые пакеты: pip install numpy matplotlib pygame.
  4. Разработайте простой симулятор на Pygame (для визуализации) или используйте библиотеку Mesa (для агентного моделирования). В данном ТЗ предлагается создать свою минимальную среду на pygame и numpy.

3. Технологический стек

КомпонентИнструментыНазначение
Язык программированияPython 3.10+Основной язык для реализации агентов и среды
Численные расчётыNumPyВекторные операции, расчёт расстояний, случайная генерация
Визуализация в реальном времениPygame 2.xОтображение поля, агентов, ресурсов, отслеживание поведения
Управление параметрамиconfig.py / argparseБыстрая настройка радиуса восприятия, числа агентов, скорости
Логирование и метрикиPython logging, matplotlibСбор статистики по каждому шагу симуляции (количество собранных ресурсов, среднее расстояние до центра, индекс дисперсии)

4. Этапы выполнения

Этап 1: Проектирование модели агента и среды (2 часа)

Действия

  1. Определите пространство симуляции: прямоугольное поле размером 800×600 пикселей с периодическими границами (тороидальная топология) или отражающими.
  2. Спроектируйте агента как класс Agent с атрибутами:
    • position (x, y) – float координаты;
    • velocity (vx, vy) – скорость (норма ≤ max_speed);
    • radius_perception – расстояние, в пределах которого агент «видит» других агентов и ресурсы;
    • state – словарь для внутреннего состояния (например, carrying, target).
  3. Реализуйте правила взаимодействия локально (без глобальной информации):
    • Избегание столкновений (separation) – отталкивание от ближайших соседей внутри радиуса;
    • Выравнивание скорости (alignment) – усреднение направления с соседями;
    • Притяжение к цели (cohesion) – движение к центру масс соседей (только если нет ресурса);
    • Поиск ресурсов – при обнаружении ресурса в радиусе восприятия агент движется к нему.
  4. Определите ресурсы: неподвижные объекты, которые исчезают при касании агентом. Генерируются случайно в начале симуляции (например, 20–30 штук).
  5. Запишите конфигурацию в файл config.py:
    WIDTH, HEIGHT = 800, 600
    AGENT_COUNT = 10
    MAX_SPEED = 3.0
    RADIUS = 80.0
    RESOURCE_COUNT = 25
    SEPARATION_WEIGHT = 1.5
    ALIGNMENT_WEIGHT = 1.0
    COHESION_WEIGHT = 1.0
    TARGET_WEIGHT = 2.0
    

Ожидаемый результат этапа
Классы Agent и Resource, конфигурационный файл, описание правил поведения в комментариях кода. Агенты способны двигаться по полю и реагировать на соседей в радиусе.

Этап 2: Реализация симулятора и визуализации (2 часа)

Действия

  1. Создайте основной класс SwarmSimulation, который управляет главным циклом:
    • Инициализация Pygame окна;
    • Создание списка агентов и ресурсов (случайные позиции);
    • Игровой цикл: обработка событий, обновление состояния, отрисовка.
  2. Реализуйте метод update():
    • Для каждого агента:
      • Собрать соседей в радиусе radius_perception;
      • Вычислить три силы (separation, alignment, cohesion) с весами;
      • Если рядом есть ресурс – добавить силу притяжения к нему.
      • Нормализовать итоговую скорость и применить к позиции.
    • Проверить столкновение с ресурсами: при касании удалить ресурс, увеличить счёт агента.
  3. Визуализируйте агентов как круги с направлением (линия от центра), ресурсы – маленькие квадраты другого цвета.
  4. Добавьте вывод текущего кадра и статистики (количество оставшихся ресурсов, средняя скорость, число агентов в кластере) в заголовке окна.
  5. Реализуйте управление симуляцией: пауза (пробел), выход (ESC), возможность изменять скорость симуляции (стрелки).

Ожидаемый результат этапа
Запускаемый скрипт swarm.py, который открывает окно и показывает движение 10 агентов. На поле разбросаны ресурсы. Агенты двигаются хаотично, но уже видно влияние локальных правил (избегание, притяжение).

Этап 3: Настройка эмерджентного поведения (2 часа)

Действия

  1. Экспериментально подберите веса правил так, чтобы агенты начали кооперироваться:
    • Если все одновременно бегут к одному ресурсу – это не эмерджентность. Нужно, чтобы они распределялись.
    • Введите «память» – каждый агент запоминает последний посещённый ресурс и избегает возврата к нему в течение некоторого времени.
    • Добавьте простую коммуникацию: при встрече с другим агентом обмениваются информацией о расположении ресурсов (усредняют свои цели). Это можно реализовать как векторное поле, где ресурс, замеченный одним агентом, становится «известен» соседям в радиусе.
  2. Оцените эмерджентное свойство: разделение территории – агенты должны не собираться вместе, а расходиться по разным участкам поля, уменьшая дублирование усилий.
    • Для этого добавьте правило: если два агента находятся близко и оба движутся к одному ресурсу, один из них случайно выбирает другой ресурс (или поворачивает на 90°).
  3. Введите метрику «индекс энтропии распределения»:
    • Разбейте поле на сетку (например, 10×10 клеток).
    • На каждом шаге подсчитывайте, сколько агентов находится в каждой клетке.
    • Энтропия по Шеннону: H = -sum(p_i * log(p_i)), где p_i – доля агентов в i-й клетке.
    • Высокая энтропия → хорошее распределение (равномерное покрытие).
  4. Настройте параметры так, чтобы энтропия росла со временем, а скорость сбора ресурсов была выше, чем при случайном блуждании.

Ожидаемый результат этапа
Симуляция, в которой агенты после некоторого переходного периода равномерно охватывают поле, редко сталкиваются, и ресурсы собираются быстрее. Появляется эмерджентное разделение труда (каждый агент «отвечает» за свою зону).

Этап 4: Анализ и визуализация эмерджентного поведения (1 час)

Действия

  1. Деактивируйте визуализацию Pygame для ускорения и запустите 10 симуляций с одинаковыми начальными условиями, но разными seed.
  2. Для каждого seed запишите временной ряд: доля собранных ресурсов, средняя энтропия, среднее расстояние между агентами.
  3. Постройте графики с помощью matplotlib:
    • График сходимости ресурсов (сколько процентов собрано к моменту t);
    • График энтропии распределения;
    • Гистограмму расстояний между агентами в конце симуляции.
  4. Сравните с контрольным запуском, где агенты двигаются случайно (вес всех правил = 0). Покажите, что ваша система справляется с задачей быстрее и с меньшим дублированием.
  5. Зафиксируйте визуальные примеры эмерджентного поведения: скриншоты, GIF (с помощью pygame.image.save() или средствами ОС).

Ожидаемый результат этапа
Графики, доказывающие повышение эффективности по сравнению со случайным движением; описание эмерджентного эффекта (разделение территории, самоорганизация).

Этап 5: Документация и финальное оформление (1 час)

Действия

  1. Напишите README.md с инструкцией по запуску, описанием модели и ключевых выводов.
  2. Оформите код в соответствии с PEP8, добавьте docstrings.
  3. Подготовьте краткий отчёт (2–3 страницы PDF) или презентацию, включающую:
    • цель задачи;
    • схему взаимодействия агентов;
    • результаты экспериментов (графики);
    • анализ эмерджентных свойств.
  4. Убедитесь, что симуляция воспроизводима: укажите seed, команду запуска.

Ожидаемый результат этапа
Репозиторий с кодом, отчёт, графики, README.

5. Критерии приемки (Definition of Done)

  • Симуляция запускается одной командой, отображает поле 800×600, 10 агентов, ресурсы.
  • Агенты действуют без центрального контроля – ни один агент не имеет глобальной информации.
  • Агенты обмениваются данными только с соседями в радиусе восприятия (локальная коммуникация).
  • В симуляции наблюдается эмерджентное поведение: например, агенты равномерно распределяются по полю, не образуют постоянный кластер, или собирают ресурсы эффективнее случайного поиска (количественно).
  • Реализовано не менее трёх правил: separation, alignment, cohesion (или их аналоги).
  • Присутствует хотя бы один количественный показатель эмерджентности (энтропия распределения, время сбора всех ресурсов, коэффициент перекрытия зон).
  • Проведено сравнение с базовым сценарием (случайное блуждание), результаты представлены в виде графиков.
  • Код читаемый, есть README, инструкция, конфигурационный файл.
  • Симуляция поддерживает паузу, регулировку скорости, выход по ESC.

6. Ожидаемый результат

Основной артефакт
Папка проекта swarm_coordination/, содержащая:

  • swarm.py – основной скрипт симуляции с GUI;
  • config.py – параметры;
  • agent.py – класс агента;
  • simulation.py – класс симуляции (логика обновления);
  • analysis/ – папка с графиками и данными экспериментов;
  • README.md – документация.

Содержимое README.md

  • Описание задачи и модели.
  • Команда запуска: python swarm.py.
  • Список зависимостей (requirements.txt).
  • Краткое описание эмерджентного поведения и результаты сравнения.

Опциональные дополнительные результаты

  • GIF-анимация симуляции (output.gif);
  • PDF-отчёт с анализом.

7. Возможные сложности и их решение

СложностьРешение
Агенты застревают друг в друге или выходят за границыВвести отталкивание с жёстким ограничением: если расстояние меньше суммарного радиуса, добавить сильное отталкивание. Для границ – отражение или телепортация на противоположную сторону (тороидальные границы).
Эмерджентное поведение не проявляется (агенты просто толпятся)Снизить вес cohesion, увеличить separation и добавить правило «избегания повторного посещения». Также можно ввести случайный компонент скорости.
Производительность низкая (большое количество расчётов расстояний)Использовать пространственное хэширование (деление поля на ячейки) или K-d дерево. Для 10 агентов это не критично, но можно реализовать для масштабирования.
Визуализация и обновление идут с разной скоростьюОтделить логику симуляции от рисования: фиксированный шаг по времени (например, 30 FPS обновление состояния, 60 FPS отрисовка).
Метрики эмерджентности неочевидныИспользовать энтропию распределения по сетке, среднее расстояние между агентами, количество пересечений путей (если агенты обмениваются информацией).

8. Бюджет времени (оценка)

ЭтапВремя
1. Проектирование модели2 часа
2. Реализация симулятора2 часа
3. Настройка эмерджентного поведения2 часа
4. Анализ и визуализация1 час
5. Документация1 час
Итого8 часов

Примечание: Для первого выполнения рекомендуется заложить до 10 часов с учётом отладки и экспериментов с параметрами.

9. Связанные вопросы из базы знаний

ВопросТема
125Алгоритмы роевого интеллекта (PSO, ACO)
142Эмерджентное поведение в многоагентных системах
210Локальные правила и глобальные паттерны
267Самоорганизация в распределённых системах
339Алгоритмы коллективного принятия решений
401Графовые представления взаимодействия агентов
558Симуляции на основе агентов (ABM)
662Метрики оценки разнообразия и энтропии
774Применение RL в multi-agent coordination
889Устойчивость роя к отказам отдельных агентов

10. Чек-лист самопроверки

  • Я реализовал симуляцию, в которой 10 агентов взаимодействуют только локально.
  • Я убедился, что ни один агент не имеет доступа к глобальной информации (например, позициям всех агентов или всем ресурсам).
  • Я провёл эксперимент со случайным блужданием (веса правил = 0) и сравнил результаты.
  • Я записал метрику (например, энтропию) и построил график, показывающий улучшение по сравнению со случайным поведением.
  • Я оформил README, указал seed для воспроизводимости, приложил хотя бы один скриншот или GIF.