Stygmergia v obrazovanii

Материал из Поле цифровой дидактики
Версия от 21:11, 22 мая 2026; CristCas (обсуждение | вклад) (Удаление старой нерабочей модели)

Стигмергия в образовании

 Description
СтигмергияСтигмергия (от др.-греч. στίγμα — знак, метка, и ἔργον — действие, работа) — механизм спонтанного непрямого взаимодействия между индивидами, заключающийся в оставлении индивидами в окружающей среде меток, стимулирующих дальнейшую активность других индивидов. Стигмергия является одной из форм самоорганизации, создающая сложные, казалось бы, интеллектуальные структуры, но без какого-либо планирования, контроля, или даже прямой связи между индивидами. Как таковая, она поддерживает эффективное сотрудничество между чрезвычайно простыми индивидами, у которых нет памяти, интеллекта или даже осведомленности друг о друге. Предположительно, стигмергия является децентрализованным сетевым свойством коллективного взаимодействия термитов.

Аннотация

Рабочие гипотезы

Инструменты и параметры модели

Инструменты

  • Моделирование: 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. Найдя еду, запоминают координаты патча и становятся фиолетовыми (несут еду)
  3. После доставки еды в гнездо цвет меняется в зависимости от количества запомненных мест (жёлтый = 1 место, красный = 2+)
  4. Когда энергия падает ниже порога (`memory-threshold`), муравей с памятью становится синим и идёт к ближайшему запомненному месту
  5. Если запомненное место опустело, муравей ищет еду в радиусе 8 патчей вокруг; если не находит — забывает это место

Участники

Распределение работы

План работы

  1. Настройка экспериментов в BehaviorSpace.
  2. Генерация и выгрузка данных.
  3. Регрессионный анализ и проверка гипотез в R.
  4. Оформление выводов и визуализация (RAWGraphs).

Результаты

(Графики, таблицы и т.д.)

Просмотр кода с пояснениями

Полный код (.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.

Скачать модель (.nlogox)

GitHub: [1]

Модель

Ссылки

(Всё что использовали и что помогло при изучении - сюда)