Stygmergia v obrazovanii: различия между версиями
| Строка 124: | Строка 124: | ||
* '''Длительность одного прогона:''' 1000 тиков | * '''Длительность одного прогона:''' 1000 тиков | ||
Итого: | Итого: '''12960 прогонов'''. | ||
=== Исходные данные экспериментов (CSV) === | === Исходные данные экспериментов (CSV) === | ||
Текущая версия от 14:36, 29 мая 2026
Стигмергия в образовании
| Description | |
|---|---|
| Стигмергия | Стигмергия (от др.-греч. στίγμα — знак, метка, и ἔργον — действие, работа) — механизм спонтанного непрямого взаимодействия между индивидами, заключающийся в оставлении индивидами в окружающей среде меток, стимулирующих дальнейшую активность других индивидов. Стигмергия является одной из форм самоорганизации, создающая сложные, казалось бы, интеллектуальные структуры, но без какого-либо планирования, контроля, или даже прямой связи между индивидами. Как таковая, она поддерживает эффективное сотрудничество между чрезвычайно простыми индивидами, у которых нет памяти, интеллекта или даже осведомленности друг о друге. Предположительно, стигмергия является децентрализованным сетевым свойством коллективного взаимодействия термитов. Для эконометрики это означает, что у нас есть наблюдаемые микроданные о действиях агентов во времени, а также агрегированные показатели состояния артефакта (качество статьи, метрики студии, сетевые показатели), и мы можем строить модели «следы → дальнейшие действия/результаты |
Аннотация
В данном проекте исследуется механизм стигмергии (коллективного взаимодействия через метки в среде) и его конкуренция/синергия с индивидуальной памятью агентов. На примере модифицированной агентной модели «Муравьи» (NetLogo) сравниваются три стратегии поиска ресурсов:
- только коллективный феромон
- только индивидуальная память
- сочетание (феромон + память)
С помощью полного факторного эксперимента в среде BehaviorSpace (6 комбинаций параметров, 2160 повторений, всего 12 960 прогонов) были собраны данные о эффективности колонии (доставленная еда) и выживаемости муравьёв.
Цель работы
Количественно оценить, даёт ли совместное использование коллективного и индивидуального опыта статистически значимое преимущество по сравнению с каждым из механизмов по отдельности.
Рабочие гипотезы
Гипотеза 1. Сравнение механизмов: феромон, память и их сочетание
- H₀: Не существует статистически значимой разницы в эффективности (количестве доставленной еды `total-food-count`) между тремя сценариями: использованием только коллективного феромона, только индивидуальной памяти и их сочетанием.
- H₁: Сценарий, сочетающий коллективный феромон и индивидуальную память, обеспечивает статистически значимо более высокую эффективность, чем каждый из этих механизмов по отдельности.
Гипотеза 2. Влияние количества источников еды
- H₀: Увеличение количества источников еды (с 3 до 6) не приводит к статистически значимому изменению эффективности колонии (`total-food-count`) и выживаемости муравьёв (`count turtles`).
- H₁: Увеличение количества источников еды приводит к статистически значимому росту эффективности колонии и выживаемости муравьёв, а также может влиять на величину преимущества от использования индивидуальной памяти.
Модель
Скачать модель (.nlogox)
GitHub: [1]
Инструменты и параметры модели
Инструменты
- Моделирование: NetLogo (модель Ants с добавленной памятью)
- Анализ данных: R (библиотеки tidyverse, ggplot2, lmtest)
- Среда реализации: Поле цифровой дидактики (SMW)
Параметры среды
- Размер мира: от -40 до 40 (80×80)
- Гнездо: центр (0,0), радиус 5
- Еда: на радиусе 30 от центра, 3 или 6 кучек
- Феромон: диффузия и испарение управляются ползунками `diffusion-rate` и `evaporation-rate`
Управляющие параметры (настройки модели)
| Переменная | Тип | Диапазон | Описание |
|---|---|---|---|
| `population` | Slider | 0–100 | Количество муравьёв |
| `diffusion-rate` | Slider | 0–50 | Скорость распространения феромона |
| `evaporation-rate` | Slider | 0–20 | Скорость испарения феромона |
| `use-memory?` | Switch | On/Off | Включение/выключение памяти |
| `more-food?` | Switch | On/Off | Дополнительные источники еды (3 → 6) |
| `memory-threshold` | Slider | 50–200 | Порог энергии для использования памяти |
Цветовая индикация муравьёв
| Цвет | Состояние |
|---|---|
| Зелёный | Ищет еду, память пуста |
| Синий | Идёт по памяти к запомненной еде |
| Фиолетовый | Несёт еду в гнездо |
| Жёлтый | Имеет 1 место в памяти (но не использует его в данный момент) |
| Красный | Имеет 2 и более мест в памяти |
Собираемые данные для анализа
| Переменная | Откуда | Описание |
|---|---|---|
| `total-food-count` | Глобальная | Общее количество доставленной еды |
| `count turtles` | Встроенная | Количество живых муравьёв |
Как это работает
- Муравьи начинают с пустой памятью (зелёные)
- Найдя еду, запоминают координаты патча и становятся фиолетовыми (несут еду)
- После доставки еды в гнездо цвет меняется в зависимости от количества запомненных мест (жёлтый = 1 место, красный = 2+)
- Когда энергия падает ниже порога (`memory-threshold`), муравей с памятью становится синим и идёт к ближайшему запомненному месту
- Если запомненное место опустело, муравей ищет еду в радиусе 8 патчей вокруг; если не находит — забывает это место
План экспериментов
Эксперименты проводятся в среде BehaviorSpace (NetLogo). Реализован полный факторный эксперимент для проверки двух гипотез.
Параметры эксперимента
- Независимые переменные (варьируемые):
* `use-memory?` — три сценария:
* `false` — только коллективный феромон (стигмергия)
* `true` при `evaporation-rate = 0`, `diffusion-rate = 0` — только индивидуальная память
* `true` при `evaporation-rate = 10`, `diffusion-rate = 50` — память + феромон
* `more-food?` — два уровня: `false` (3 источника еды) и `true` (6 источников)
- Фиксированные параметры:
* `population = 50` * `memory-threshold = 100`
- Замеряемые показатели (зависимые переменные):
* `total-food-count` — общее количество доставленной в гнездо еды * `count turtles` — количество живых муравьёв (выживаемость)
- Повторений для каждой комбинации параметров: 10
- Длительность одного прогона: 1000 тиков
Итого: 12960 прогонов.
Исходные данные экспериментов (CSV)
CSV-файл с результатами всех прогонов BehaviorSpace:
- GitHub: [2]
Результаты
(R-код, графики, выводы)
Просмотр кода с пояснениями
Полный код (.nlogo)
;; ANTS WITH MEMORY - ФИНАЛ
;; ============================================
;; РАЗМЕР МИРА: от -40 до 40 (80×80)
;; ЕДА: на радиусе 30 от центра
;; ============================================
;; ЦВЕТА МУРАВЬЁВ:
;; ЗЕЛЁНЫЙ - ищет еду (память пуста)
;; СИНИЙ - идёт по памяти к еде
;; ФИОЛЕТОВЫЙ - несёт еду в гнездо
;; ЖЁЛТЫЙ - 1 место в памяти (не использует)
;; КРАСНЫЙ - 2+ места в памяти (не использует)
;; ============================================
globals [
total-food-count ; общее количество еды, доставленной в гнездо
]
patches-own [
chemical ; феромон на патче (коллективный след)
food-here ; наличие еды на патче (0 или 1)
is-nest ; является ли патч гнездом (1 да, 0 нет)
]
turtles-own [
my-food ; есть ли у муравья еда (0 или 1)
my-energy ; текущий запас энергии муравья
my-memory ; список запомненных патчей (места, где была еда)
]
;;;;;;;;;;;;;;;;;;;;;;;;
;;; НАСТРОЙКА МИРА
;;;;;;;;;;;;;;;;;;;;;;;;
to setup
clear-all
set-default-shape turtles "bug"
; ===== СОЗДАЁМ ГНЕЗДО =====
; Все патчи в радиусе 5 от центра становятся гнездом
ask patches [
ifelse (distancexy 0 0) < 5 [
set is-nest 1
set pcolor violet
] [
set is-nest 0
set food-here 0
set chemical 0
]
]
; ===== СОЗДАЁМ ИСТОЧНИКИ ЕДЫ =====
let radius 30 ; расстояние от центра до еды
let sources 3 ; базовое количество источников
if more-food? = true [ set sources 6 ] ; если включён переключатель
; Равномерно распределяем источники по кругу
let angles [] ; список углов
let step 360 / sources ; шаг между источниками
let current 0
repeat sources [
set angles lput current angles
set current current + step
]
; Для каждого угла создаём пятно еды радиусом 5
foreach angles [ angle ->
let xc radius * cos angle
let yc radius * sin angle
ask patches with [ distancexy xc yc < 5 ] [
set food-here 1
; Разные цвета для разных источников
if angle = 0 [ set pcolor cyan ]
if angle = 60 [ set pcolor sky ]
if angle = 120 [ set pcolor blue ]
if angle = 180 [ set pcolor cyan ]
if angle = 240 [ set pcolor sky ]
if angle = 300 [ set pcolor blue ]
]
]
; ===== СОЗДАЁМ МУРАВЬЁВ =====
create-turtles population [
setxy 0 0 ; все муравьи начинают из гнезда
set size 2
set color green ; ЗЕЛЁНЫЙ - ищет еду, память пуста
set my-food 0
set my-energy 200
set my-memory [] ; память пуста
]
set total-food-count 0
reset-ticks
end
;;;;;;;;;;;;;;;;;;;;;
;;; ОСНОВНОЙ ЦИКЛ
;;;;;;;;;;;;;;;;;;;;;
to go
ask turtles [
if who >= ticks [ stop ]
; ===== ТРАТИМ ЭНЕРГИЮ =====
; Каждый шаг отнимает 1 единицу энергии
set my-energy my-energy - 1
if my-energy <= 0 [ die ] ; энергия кончилась - муравей умирает
; ===== СБРОС ЕДЫ В ГНЕЗДЕ =====
; Если муравей в гнезде и несёт еду - выгружает её
if is-nest = 1 and my-food = 1 [
set my-food 0
set my-energy my-energy + 100 ; награда за доставленную еду
set total-food-count total-food-count + 1 ; увеличиваем счётчик
update-color-by-memory ; обновляем цвет в зависимости от памяти
rt 180 ; разворачиваемся
]
; ===== ВОЗВРАЩЕНИЕ С ЕДОЙ =====
; Если муравей несёт еду - идёт прямо в гнездо
if my-food = 1 [
set color violet ; ФИОЛЕТОВЫЙ - несёт еду
set chemical chemical + 60 ; оставляет феромон
facexy 0 0 ; поворачивается к центру (гнезду)
wiggle
fd 1
stop
]
; ===== ПОИСК ЕДЫ =====
; Если муравей не несёт еду - ищет её
look-for-food
wiggle
fd 1
]
; ===== ОБРАБОТКА ФЕРОМОНА =====
; Диффузия: феромон распространяется на соседние патчи
diffuse chemical (diffusion-rate / 100)
ask patches [
; Испарение: феромон постепенно исчезает
set chemical chemical * (100 - evaporation-rate) / 100
if chemical < 0.01 [ set chemical 0 ]
; Визуализация феромона (чем больше феромона, тем ярче зелёный)
if food-here = 0 and is-nest = 0 [
set pcolor scale-color green chemical 0 5
]
]
tick
end
;;;;;;;;;;;;;;;;;;;;;
;;; ПОИСК ЕДЫ С ПАМЯТЬЮ
;;;;;;;;;;;;;;;;;;;;;
to look-for-food
; ===== ПОДБОР ЕДЫ =====
; Если на текущем патче есть еда - подбираем её
if food-here > 0 [
set my-food 1
set food-here food-here - 1 ; еда исчезает с патча
; ЗАПОМИНАЕМ МЕСТО
if use-memory? [
set my-memory lput patch-here my-memory ; добавляем патч в список
if length my-memory > 15 [ set my-memory but-last my-memory ] ; ограничиваем размер
]
rt 180 ; разворачиваемся к гнезду
stop
]
; ===== ИСПОЛЬЗОВАНИЕ ПАМЯТИ =====
; Если память включена, энергии мало и есть запомненные места
if use-memory? and my-energy < memory-threshold and length my-memory > 0 [
let target nobody
let best-dist 999999
; Находим ближайшее запомненное место
foreach my-memory [ mem-patch ->
let d distance mem-patch
if d < best-dist [
set best-dist d
set target mem-patch
]
]
if target != nobody [
; ПРОВЕРЯЕМ, ЕСТЬ ЛИ ЕЩЁ ЕДА НА ЗАПОМНЕННОМ МЕСТЕ
ifelse [food-here] of target > 0 [
set color blue ; СИНИЙ - идёт по памяти к еде
face target
stop
] [
; ЕСЛИ ЕДЫ НЕТ - ИЩЕМ В РАДИУСЕ 8 ПАТЧЕЙ ВОКРУГ
let nearby-food patches with [food-here > 0 and distance target <= 8]
ifelse any? nearby-food [
; нашли еду рядом - идём к ближайшей
let closest-nearby min-one-of nearby-food [distance myself]
; добавляем новое место в память
set my-memory lput closest-nearby my-memory
if length my-memory > 15 [ set my-memory but-last my-memory ]
set color blue ; СИНИЙ - идёт по памяти к еде
face closest-nearby
stop
] [
; НЕТ ЕДЫ В РАДИУСЕ - УДАЛЯЕМ ЭТО МЕСТО ИЗ ПАМЯТИ
set my-memory remove target my-memory
]
]
]
]
; ===== ОБНОВЛЕНИЕ ЦВЕТА =====
update-color-by-memory
; ===== ДВИЖЕНИЕ ПО ФЕРОМОНУ =====
; Если есть феромон - идём по нему
if (chemical >= 0.05) and (chemical < 2) [
uphill-chemical
]
end
;;;;;;;;;;;;;;;;;;;;;
;;; ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ
;;;;;;;;;;;;;;;;;;;;;
to update-color-by-memory
; Обновляет цвет муравья в зависимости от размера его памяти
; (только если муравей не несёт еду и не в режиме синего)
if my-food = 0 and color != blue [
let mem-count length my-memory
if mem-count = 0 [ set color green ] ; ЗЕЛЁНЫЙ - память пуста
if mem-count = 1 [ set color yellow ] ; ЖЁЛТЫЙ - 1 место
if mem-count >= 2 [ set color red ] ; КРАСНЫЙ - 2+ мест
]
end
to uphill-chemical
; Движение вверх по градиенту феромона
; Сравнивает концентрацию феромона спереди, справа и слева
let scent-ahead chemical-scent 0
let scent-right chemical-scent 45
let scent-left chemical-scent -45
if (scent-right > scent-ahead) or (scent-left > scent-ahead) [
ifelse scent-right > scent-left [ rt 45 ] [ lt 45 ]
]
end
to wiggle
; Лёгкое случайное покачивание, чтобы муравьи не застревали
rt random 30
lt random 30
if not can-move? 1 [ rt 180 ]
end
to-report chemical-scent [angle]
; Возвращает количество феромона на патче под указанным углом
let p patch-right-and-ahead angle 1
if p = nobody [ report 0 ]
report [chemical] of p
end
; Copyright 1997 Uri Wilensky.
Ссылки
- Практикум по эконометрике (syllabus)
- An Introduction to Agent-Based Modeling with NetLogo — Wilensky, Rand [3]
- Introduction to Econometrics with R — онлайн-учебник [4]
- Causal Inference: The Mixtape — Cunningham [5]
- Дружелюбная эконометрика — учебник [6]
- NetLogo: netlogo.org
- R: r-project.org
Участники
- Анастасия Юдаева — создание и оформление страницы, разработка и модификация кода модели NetLogo, выгрузка модели на GitHub, описание кода
- Маргарита Еськова — аннотация, формирование гипотез, проведение экспериментов в BehaviorSpace, сбор и выгрузка данных на GitHub, частичное оформление
- Кира Софронова — формулировка статистических гипотез, анализ данных в R, визуализация результатов, интерпретация выводов, частичное оформление
