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