|
|
| Строка 1: |
Строка 1: |
| 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
| |