Stygmergia v obrazovanii: различия между версиями
Материал из Поле цифровой дидактики
CristCas (обсуждение | вклад) м Просмотр кода, проверка оформления |
CristCas (обсуждение | вклад) Открытый код |
||
| Строка 47: | Строка 47: | ||
=== Просмотр кода с пояснениями(.nlogo) === | === Просмотр кода с пояснениями(.nlogo) === | ||
<syntaxhighlight lang="netlogo" line> | <syntaxhighlight lang="netlogo" line> | ||
... | Модель реализована в NetLogo. Ниже представлен полный код с подробными комментариями, объясняющими логику памяти муравьёв и визуализацию их состояний. | ||
=== Параметры среды === | |||
* '''Размер мира:''' от -40 до 40 (80×80) | |||
* '''Еда:''' на радиусе 30 от центра (3 или 6 кучек) | |||
* '''Феромон:''' диффузия и испарение управляются ползунками `diffusion-rate` и `evaporation-rate` | |||
=== Цветовая индикация муравьёв === | |||
{| class="wikitable" | |||
! Цвет !! Состояние | |||
|- | |||
| '''Зелёный''' || Ищет еду, память пуста | |||
|- | |||
| '''Синий''' || Идёт по памяти к запомненной еде | |||
|- | |||
| '''Фиолетовый''' || Несёт еду в гнездо | |||
|- | |||
| '''Жёлтый''' || Имеет 1 место в памяти (но не использует его в данный момент) | |||
|- | |||
| '''Красный''' || Имеет 2 и более мест в памяти | |||
|} | |||
=== Полный код === | |||
<syntaxhighlight lang="netlogo" line> | |||
;; 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. | |||
</syntaxhighlight> | |||
=== Элементы управления на Interface === | |||
Для работы модели добавьте на вкладку '''Interface''' следующие элементы: | |||
{| class="wikitable" | |||
! Элемент !! Переменная !! Диапазон / Значения !! Описание | |||
|- | |||
| '''Button''' || `setup` || — || Инициализация модели | |||
|- | |||
| '''Button''' || `go` || флаг "Forever" || Запуск симуляции | |||
|- | |||
| '''Slider''' || `population` || 0–100 || Количество муравьёв | |||
|- | |||
| '''Slider''' || `diffusion-rate` || 0–50 || Скорость распространения феромона | |||
|- | |||
| '''Slider''' || `evaporation-rate` || 0–20 || Скорость исчезновения феромона | |||
|- | |||
| '''Switch''' || `use-memory?` || On/Off || Включение/выключение памяти | |||
|- | |||
| '''Switch''' || `more-food?` || On/Off || Включение/выключение дополнительных источников еды | |||
|- | |||
| '''Slider''' || `memory-threshold` || 50–200 || Порог энергии для использования памяти | |||
|} | |||
=== Как это работает === | |||
# Муравьи начинают с пустой памятью ('''зелёные''') | |||
# Найдя еду, запоминают координаты патча и становятся '''фиолетовыми''' (несут еду) | |||
# После доставки еды в гнездо цвет меняется в зависимости от количества запомненных мест ('''жёлтый''' = 1 место, '''красный''' = 2+) | |||
# Когда энергия падает ниже порога (`memory-threshold`), муравей с памятью становится '''синим''' и идёт к ближайшему запомненному месту | |||
# Если запомненное место опустело, муравей ищет еду в радиусе 8 патчей вокруг; если не находит — забывает это место | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Версия от 17:03, 22 мая 2026
Стигмергия в образовании
| Description | |
|---|---|
| Стигмергия | Стигмергия (от др.-греч. στίγμα — знак, метка, и ἔργον — действие, работа) — механизм спонтанного непрямого взаимодействия между индивидами, заключающийся в оставлении индивидами в окружающей среде меток, стимулирующих дальнейшую активность других индивидов. Стигмергия является одной из форм самоорганизации, создающая сложные, казалось бы, интеллектуальные структуры, но без какого-либо планирования, контроля, или даже прямой связи между индивидами. Как таковая, она поддерживает эффективное сотрудничество между чрезвычайно простыми индивидами, у которых нет памяти, интеллекта или даже осведомленности друг о друге. Предположительно, стигмергия является децентрализованным сетевым свойством коллективного взаимодействия термитов. Для эконометрики это означает, что у нас есть наблюдаемые микроданные о действиях агентов во времени, а также агрегированные показатели состояния артефакта (качество статьи, метрики студии, сетевые показатели), и мы можем строить модели «следы → дальнейшие действия/результаты |
Аннотация
Рабочие гипотезы
Инструменты
(Оставить 1 модееееель)
- Анализ данных и программирование: R (tidyverse, ggplot2, lmtest)
- Среда реализации: Поле цифровой дидактики (SMW)
Участники
Распределение работы
- Кира Софронова - сделать З̸̧͖̫̫҇̀̇̑а҈̧̞̟̽͡д҉̨̜̒̽̕а̷͚̲̗҇̎̅̓͢ч̷̡̲̂̑͠а҈̨̱͎́̂͞
- Маргарита Еськова - сделать З̸̧͖̫̫҇̀̇̑а҈̧̞̟̽͡д҉̨̜̒̽̕а̷͚̲̗҇̎̅̓͢ч̷̡̲̂̑͠а҈̨̱͎́̂͞
- Анастасия Юдаева - сделать З̸̧͖̫̫҇̀̇̑а҈̧̞̟̽͡д҉̨̜̒̽̕а̷͚̲̗҇̎̅̓͢ч̷̡̲̂̑͠а҈̨̱͎́̂͞
План работы
- Настройка экспериментов в BehaviorSpace.
- Генерация и выгрузка данных.
- Регрессионный анализ и проверка гипотез в R.
- Оформление выводов и визуализация (RAWGraphs).
Результаты
(Графики, таблицы и т.д.)
Ссылки
(Всё что использовали и что помогло при изучении - сюда)
Модель
Просмотр кода с пояснениями(.nlogo)
Модель реализована в NetLogo. Ниже представлен полный код с подробными комментариями, объясняющими логику памяти муравьёв и визуализацию их состояний.
=== Параметры среды ===
* '''Размер мира:''' от -40 до 40 (80×80)
* '''Еда:''' на радиусе 30 от центра (3 или 6 кучек)
* '''Феромон:''' диффузия и испарение управляются ползунками `diffusion-rate` и `evaporation-rate`
=== Цветовая индикация муравьёв ===
{| class="wikitable"
! Цвет !! Состояние
|-
| '''Зелёный''' || Ищет еду, память пуста
|-
| '''Синий''' || Идёт по памяти к запомненной еде
|-
| '''Фиолетовый''' || Несёт еду в гнездо
|-
| '''Жёлтый''' || Имеет 1 место в памяти (но не использует его в данный момент)
|-
| '''Красный''' || Имеет 2 и более мест в памяти
|}
=== Полный код ===
<syntaxhighlight lang="netlogo" line>
;; 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.Элементы управления на Interface
Для работы модели добавьте на вкладку Interface следующие элементы:
| Элемент | Переменная | Диапазон / Значения | Описание |
|---|---|---|---|
| Button | `setup` | — | Инициализация модели |
| Button | `go` | флаг "Forever" | Запуск симуляции |
| Slider | `population` | 0–100 | Количество муравьёв |
| Slider | `diffusion-rate` | 0–50 | Скорость распространения феромона |
| Slider | `evaporation-rate` | 0–20 | Скорость исчезновения феромона |
| Switch | `use-memory?` | On/Off | Включение/выключение памяти |
| Switch | `more-food?` | On/Off | Включение/выключение дополнительных источников еды |
| Slider | `memory-threshold` | 50–200 | Порог энергии для использования памяти |
Как это работает
- Муравьи начинают с пустой памятью (зелёные)
- Найдя еду, запоминают координаты патча и становятся фиолетовыми (несут еду)
- После доставки еды в гнездо цвет меняется в зависимости от количества запомненных мест (жёлтый = 1 место, красный = 2+)
- Когда энергия падает ниже порога (`memory-threshold`), муравей с памятью становится синим и идёт к ближайшему запомненному месту
- Если запомненное место опустело, муравей ищет еду в радиусе 8 патчей вокруг; если не находит — забывает это место
</syntaxhighlight>
Скачать модель с репозитория(.nlogox)
GitHub: [1]
