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-count plot total-food-count Время Ширина Популяция Перехват памяти Используем память? Больше еды? ]]> setup repeat 75 [ go ]