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 ]
; тратим энергию
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
]
; ДИФФУЗИЯ ФЕРОМОНА (используем diffusion-rate)
diffuse chemical (diffusion-rate / 100)
ask patches [
; ИСПАРЕНИЕ ФЕРОМОНА (используем evaporation-rate)
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.]]>total-food-countplot total-food-countВремяШиринаПопуляцияПерехват памятиИспользуем память?Больше еды?
]]>setup repeat 75 [ go ]