Stygmergia v obrazovanii: различия между версиями
Материал из Поле цифровой дидактики
CristCas (обсуждение | вклад) м Изменение порядка заголовков статьи |
|||
| (не показана 1 промежуточная версия 1 участника) | |||
| Строка 90: | Строка 90: | ||
=== Полный код (.nlogo) === | === Полный код (.nlogo) === | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="lisp" line> | ||
;; ANTS WITH MEMORY - ФИНАЛ | ;; ANTS WITH MEMORY - ФИНАЛ | ||
;; ============================================ | ;; ============================================ | ||
| Строка 374: | Строка 374: | ||
* [[Участник:Маргарита_Еськова|Маргарита Еськова]] | * [[Участник:Маргарита_Еськова|Маргарита Еськова]] | ||
* [[Участник:CristCas|Анастасия Юдаева]] | * [[Участник:CristCas|Анастасия Юдаева]] | ||
Текущая версия от 20:45, 27 мая 2026
Стигмергия в образовании
| Description | |
|---|---|
| Стигмергия | Стигмергия (от др.-греч. στίγμα — знак, метка, и ἔργον — действие, работа) — механизм спонтанного непрямого взаимодействия между индивидами, заключающийся в оставлении индивидами в окружающей среде меток, стимулирующих дальнейшую активность других индивидов. Стигмергия является одной из форм самоорганизации, создающая сложные, казалось бы, интеллектуальные структуры, но без какого-либо планирования, контроля, или даже прямой связи между индивидами. Как таковая, она поддерживает эффективное сотрудничество между чрезвычайно простыми индивидами, у которых нет памяти, интеллекта или даже осведомленности друг о друге. Предположительно, стигмергия является децентрализованным сетевым свойством коллективного взаимодействия термитов. |
Аннотация
Рабочие гипотезы
Модель
Скачать модель (.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` | Встроенная | Количество живых муравьёв |
| `length my-memory` | Индивидуальная | Размер памяти муравья |
Как это работает
- Муравьи начинают с пустой памятью (зелёные)
- Найдя еду, запоминают координаты патча и становятся фиолетовыми (несут еду)
- После доставки еды в гнездо цвет меняется в зависимости от количества запомненных мест (жёлтый = 1 место, красный = 2+)
- Когда энергия падает ниже порога (`memory-threshold`), муравей с памятью становится синим и идёт к ближайшему запомненному месту
- Если запомненное место опустело, муравей ищет еду в радиусе 8 патчей вокруг; если не находит — забывает это место
План экспериментов
Результаты
(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
- Introduction to Econometrics with R — онлайн-учебник
- Causal Inference: The Mixtape — Cunningham
- Дружелюбная эконометрика — учебник
- NetLogo: netlogo.org
- R: r-project.org
(Всё что использовали и что помогло при изучении - сюда)
