Ants/Clone01: различия между версиями
Материал из Поле цифровой дидактики
Patarakin (обсуждение | вклад) |
CristCas (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
turtles-own [ | |||
has-food ; 0 = нет еды, 1 = несёт еду | |||
memory ; список запомненных патчей (где была еда) | |||
energy ; энергия муравья | |||
] | |||
globals [ | globals [ | ||
total-food ; сколько еды доставлено в гнездо | |||
] | ] | ||
;;;;;;;;;;;;;;;;;;;;; | |||
;; НАСТРОЙКА МИРА ;; | |||
;;;;;;;;;;;;;;;;;;;;; | |||
;; | |||
;; | |||
;; | |||
to setup | to setup | ||
clear-all | |||
set-default-shape turtles "bug" | set-default-shape turtles "bug" | ||
ask patch 0 0 [ | |||
; гнездо в центре (0,0) | |||
ask patch 0 0 [ set pcolor violet ] | |||
set | |||
; 8 источников еды по кругу (для мира от -16 до 16) | |||
set | ask patch 16 0 [ set pcolor green set plabel "E" ] ; право | ||
ask patch -16 0 [ set pcolor green set plabel "E" ] ; лево | |||
ask patch 0 16 [ set pcolor green set plabel "E" ] ; верх | |||
ask patch 0 -16 [ set pcolor green set plabel "E" ] ; низ | |||
ask patch 16 16 [ set pcolor green set plabel "E" ] ; верх-право | |||
ask patch -16 16 [ set pcolor green set plabel "E" ] ; верх-лево | |||
set | ask patch 16 -16 [ set pcolor green set plabel "E" ] ; низ-право | ||
ask patch -16 -16 [ set pcolor green set plabel "E" ] ; низ-лево | |||
; создаём муравьёв (40 штук) | |||
create-turtles 40 [ | |||
create-turtles | |||
setxy 0 0 | setxy 0 0 | ||
set color red | set color red | ||
set | set has-food 0 | ||
set memory [] | set memory [] | ||
set | set energy 200 | ||
] | ] | ||
set total-food 0 | |||
reset-ticks | |||
end | end | ||
;; | ;;;;;;;;;;;;;;;;;;; | ||
;; ОСНОВНОЙ ЦИКЛ | ;; ОСНОВНОЙ ЦИКЛ ;; | ||
;; | ;;;;;;;;;;;;;;;;;;; | ||
to go | to go | ||
ask turtles [ | ask turtles [ | ||
if | ; тратим энергию | ||
set energy energy - 1 | |||
if energy <= 0 [ die ] | |||
; поведение в зависимости от того, несёт ли еду | |||
ifelse color = red | |||
[ look-for-food ] | |||
[ return-to-nest ] | |||
; движение | |||
fd 1 | |||
right random 30 | |||
left random 30 | |||
] | ] | ||
tick | tick | ||
end | end | ||
;; | ;;;;;;;;;;;;;;;;;;; | ||
;; | ;; ПОВЕДЕНИЕ ;; | ||
;; | ;;;;;;;;;;;;;;;;;;; | ||
to | to look-for-food | ||
set food 1 | ; если на патче есть еда (зелёный цвет) | ||
if pcolor = green [ | |||
set has-food 1 | |||
set color orange | |||
set pcolor black ; еда исчезает | |||
set plabel "" ; убираем метку | |||
; ЗАПОМИНАЕМ МЕСТО (если память включена) | |||
if use-memory? [ | |||
set memory lput patch-here memory | |||
; ограничиваем память 15 местами | |||
if length memory > 15 [ set memory but-last memory ] | |||
] | ] | ||
right 180 ; разворачиваемся к гнезду | |||
stop | |||
] | ] | ||
; ЕСЛИ ЭНЕРГИЯ МАЛА И ЕСТЬ ПАМЯТЬ — ИДЁМ К ЗАПОМНЕННОМУ МЕСТУ | |||
if use-memory? and energy < memory-threshold and length memory > 0 [ | |||
let target-patch min-one-of memory [distance myself] | |||
if target-patch != nobody [ | |||
face target-patch | |||
stop | |||
let | |||
] | ] | ||
] | ] | ||
end | end | ||
to | to return-to-nest | ||
; если в гнезде (фиолетовый патч) | |||
if pcolor = violet [ | |||
set has-food 0 | |||
set color red | set color red | ||
set | set energy energy + 100 ; награда за еду | ||
set food | set total-food total-food + 1 | ||
right 180 | |||
stop | |||
] | ] | ||
end | end | ||
;; ============================================ | ;; ============================================ | ||
;; | ;; ЗАБЫВАНИЕ УСТАРЕВШЕЙ ПАМЯТИ | ||
;; ============================================ | ;; ============================================ | ||
to | to forget-stale-memory | ||
if length memory > 0 [ | |||
let to-forget [] | |||
foreach memory [ mem-patch -> | |||
; если на запомненном патче больше нет еды (не зелёный) | |||
if [pcolor] of mem-patch != green [ | |||
set to-forget lput mem-patch to-forget | |||
] | |||
to | |||
if | |||
to | |||
] | ] | ||
foreach to-forget [ forget-patch -> | |||
set memory remove forget-patch memory | |||
to | |||
set | |||
] | ] | ||
] | ] | ||
end | end | ||
Версия от 12:39, 14 мая 2026
turtles-own [
has-food ; 0 = нет еды, 1 = несёт еду memory ; список запомненных патчей (где была еда) energy ; энергия муравья
]
globals [
total-food ; сколько еды доставлено в гнездо
]
- НАСТРОЙКА МИРА ;;
to setup
clear-all set-default-shape turtles "bug" ; гнездо в центре (0,0) ask patch 0 0 [ set pcolor violet ] ; 8 источников еды по кругу (для мира от -16 до 16) ask patch 16 0 [ set pcolor green set plabel "E" ] ; право ask patch -16 0 [ set pcolor green set plabel "E" ] ; лево ask patch 0 16 [ set pcolor green set plabel "E" ] ; верх ask patch 0 -16 [ set pcolor green set plabel "E" ] ; низ ask patch 16 16 [ set pcolor green set plabel "E" ] ; верх-право ask patch -16 16 [ set pcolor green set plabel "E" ] ; верх-лево ask patch 16 -16 [ set pcolor green set plabel "E" ] ; низ-право ask patch -16 -16 [ set pcolor green set plabel "E" ] ; низ-лево ; создаём муравьёв (40 штук) create-turtles 40 [ setxy 0 0 set color red set has-food 0 set memory [] set energy 200 ] set total-food 0 reset-ticks
end
- ОСНОВНОЙ ЦИКЛ ;;
to go
ask turtles [
; тратим энергию
set energy energy - 1
if energy <= 0 [ die ]
; поведение в зависимости от того, несёт ли еду
ifelse color = red
[ look-for-food ]
[ return-to-nest ]
; движение
fd 1
right random 30
left random 30
]
tick
end
- ПОВЕДЕНИЕ ;;
to look-for-food
; если на патче есть еда (зелёный цвет)
if pcolor = green [
set has-food 1
set color orange
set pcolor black ; еда исчезает
set plabel "" ; убираем метку
; ЗАПОМИНАЕМ МЕСТО (если память включена)
if use-memory? [
set memory lput patch-here memory
; ограничиваем память 15 местами
if length memory > 15 [ set memory but-last memory ]
]
right 180 ; разворачиваемся к гнезду
stop
]
; ЕСЛИ ЭНЕРГИЯ МАЛА И ЕСТЬ ПАМЯТЬ — ИДЁМ К ЗАПОМНЕННОМУ МЕСТУ
if use-memory? and energy < memory-threshold and length memory > 0 [
let target-patch min-one-of memory [distance myself]
if target-patch != nobody [
face target-patch
stop
]
]
end
to return-to-nest
; если в гнезде (фиолетовый патч) if pcolor = violet [ set has-food 0 set color red set energy energy + 100 ; награда за еду set total-food total-food + 1 right 180 stop ]
end
- ============================================
- ЗАБЫВАНИЕ УСТАРЕВШЕЙ ПАМЯТИ
- ============================================
to forget-stale-memory
if length memory > 0 [
let to-forget []
foreach memory [ mem-patch ->
; если на запомненном патче больше нет еды (не зелёный)
if [pcolor] of mem-patch != green [
set to-forget lput mem-patch to-forget
]
]
foreach to-forget [ forget-patch ->
set memory remove forget-patch memory
]
]
end
