Butterfly model/Sirenko
Материал из Поле цифровой дидактики
netlogo globals [
max-height ;; максимальная высота на карте summit-count ;; сколько бабочек достигло вершины blue-summit-count ;; сколько синих бабочек достигло вершины
]
turtles-own [
butterfly-type ;; "normal" или "blue" steps-taken ;; сколько шагов сделала бабочка reached-summit? ;; достигла ли вершины
]
patches-own [
elevation ;; высота пятна (0-100) visit-count ;; сколько бабочек прошло через это пятно
]
- Setup Procedures ;;;
to setup
clear-all setup-landscape create-butterflies reset-ticks update-viz
end
to setup-landscape
ask patches [
;; Создаём несколько горных пиков
let peak1-distance distancexy (max-pxcor * 0.3) (max-pycor * 0.7)
let peak2-distance distancexy (max-pxcor * 0.7) (max-pycor * 0.3)
let peak3-distance distancexy (max-pxcor * 0.5) (max-pycor * 0.9)
set elevation 0
;; Пик 1 (высокий)
if peak1-distance < 30 [
set elevation elevation + (30 - peak1-distance) * 3
]
;; Пик 2 (средний)
if peak2-distance < 25 [
set elevation elevation + (25 - peak2-distance) * 2.5
]
;; Пик 3 (низкий)
if peak3-distance < 20 [
set elevation elevation + (20 - peak3-distance) * 2
]
;; Добавляем случайный шум для реализма
set elevation elevation + random 5
;; Ограничиваем высоту
if elevation > 100 [ set elevation 100 ]
if elevation < 0 [ set elevation 0 ]
set visit-count 0
]
set max-height max [elevation] of patches
end
to create-butterflies
set summit-count 0
set blue-summit-count 0
;; Создаём 80 обычных бабочек (серых)
create-turtles 80 [
set butterfly-type "normal"
set color gray
set size 2
setxy random-xcor random-ycor
set steps-taken 0
set reached-summit? false
]
;; Создаём 20 синих бабочек (редкий вид, более умные)
create-turtles 20 [
set butterfly-type "blue"
set color blue
set size 2.5
setxy random-xcor random-ycor
set steps-taken 0
set reached-summit? false
]
ask turtles [
;; Убеждаемся, что не на вершине в начале
if elevation-of-self >= max-height * 0.95 [
setxy random-xcor random-ycor
]
]
end
to update-viz
ask patches [
;; Цвет показывает активность коридора
let intensity (visit-count / 50)
if intensity > 1 [ set intensity 1 ]
ifelse visit-count = 0 [
set pcolor scale-color green elevation 0 100
] [
set pcolor scale-color red intensity 0 1
]
]
;; Особый цвет для вершины
ask patches with [elevation = max-height] [
set pcolor white
]
end
- Go Procedures ;;;
to go
if count turtles = 0 [ stop ]
ask turtles [
if not reached-summit? [
move-butterfly
check-summit
]
]
tick
update-viz
update-plots
end
to move-butterfly
let move-up-probability ;; Разные типы бабочек ведут себя по-разному ifelse butterfly-type = "normal" [ set move-up-probability 0.7 ;; 70% идёт вверх ] [ set move-up-probability 0.9 ;; 90% идёт вверх (умнее) ] if random-float 1 < move-up-probability [ move-to-highest-neighbor ] [ move-randomly ] set steps-taken steps-taken + 1
end
to move-to-highest-neighbor
let highest-patch patch-here
let highest-elevation elevation-of-self
ask neighbors [
if ([elevation] of self) > highest-elevation [
set highest-elevation [elevation] of self
set highest-patch self
]
]
;; Запоминаем, что прошли через это пятно
ask patch-here [
set visit-count visit-count + 1
]
move-to highest-patch
end
to move-randomly
;; Запоминаем проход ask patch-here [ set visit-count visit-count + 1 ] rt random 360 fd 1 ;; Не выходим за границы if not can-move? 1 [ set heading heading + 180 ]
end
to check-summit
if elevation-of-self >= max-height * 0.95 [
set reached-summit? true
set summit-count summit-count + 1
if butterfly-type = "blue" [
set blue-summit-count blue-summit-count + 1
]
;; Визуальный эффект при достижении вершины
set color yellow
;; Бабочка улетает через 5 шагов (имитация размножения)
if steps-taken > 5 [
die
]
]
end
to-report elevation-of-self
report [elevation] of patch-here
end
to update-plots
set-current-plot "Butterfly Progress" clear-plot ;; График 1: количество достигших вершины set-current-plot-pen "summit" plot summit-count ;; График 2: средняя высота бабочек set-current-plot-pen "avg-height" if count turtles > 0 [ let total-height sum [elevation-of-self] of turtles plot total-height / count turtles ] set-current-plot "Traffic Intensity" clear-plot let max-visits max [visit-count] of patches if max-visits > 0 [ histogram [visit-count] of patches ]
end
- Buttons & Sliders ;;;
- Создайте в интерфейсе
- - Slider
- q (0-1) для вероятности движения вверх
- - Button
- Setup
- - Button
- Go (forever)
- - Monitor
- summit-count (достигшие вершины)
- - Monitor
- blue-summit-count (синие бабочки)
- - Monitor
- count turtles (оставшиеся бабочки)
- - Plot
- "Butterfly Progress" с двумя линиями
- - Plot
- "Traffic Intensity" гистограмма
to-report butterfly-efficiency
;; Эффективность: сколько бабочек достигло вершины за минимальное время if summit-count = 0 [ report 0 ] report (summit-count / count turtles) * 100
end
