Ants/Clone01: различия между версиями
Материал из Поле цифровой дидактики
Patarakin (обсуждение | вклад) Нет описания правки |
CristCas (обсуждение | вклад) |
||
| Строка 12: | Строка 12: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
globals [ | |||
food-source-number | |||
food-in-nest | |||
food-in-nest-history | |||
chemical-history | |||
] | |||
patches-own [ | |||
chemical | |||
food | |||
food-source-number | |||
nest? | |||
] | |||
turtles-own [ | |||
chemical | |||
food | |||
memory ; список запомненных патчей (мест с едой) | |||
] | |||
;; ============================================ | |||
;; ИНИЦИАЛИЗАЦИЯ | |||
;; ============================================ | |||
to setup | |||
ca | |||
set-default-shape turtles "bug" | |||
ask patch 0 0 [ set nest? true set pcolor violet ] | |||
create-food-sources | |||
create-ants | |||
set food-in-nest 0 | |||
set food-in-nest-history [] | |||
set chemical-history [] | |||
reset-ticks | |||
end | |||
to create-food-sources | |||
let number-of-food-sources 4 | |||
set food-source-number number-of-food-sources | |||
let angle 0 | |||
let radius (max-pxcor - 5) | |||
let angle-step 360 / number-of-food-sources | |||
repeat number-of-food-sources [ | |||
let xcor radius * cos angle | |||
let ycor radius * sin angle | |||
ask patch xcor ycor [ | |||
set food 1 | |||
set pcolor green | |||
set food-source-number angle | |||
] | |||
set angle angle + angle-step | |||
] | |||
end | |||
to create-ants | |||
create-turtles 50 [ | |||
setxy 0 0 | |||
set color red | |||
set chemical 0 | |||
set food 0 | |||
set memory [] | |||
set label "" | |||
] | |||
end | |||
;; ============================================ | |||
;; ОСНОВНОЙ ЦИКЛ | |||
;; ============================================ | |||
to go | |||
if all? turtles [food = 1] [ stop ] | |||
ask turtles [ | |||
if nest? and food = 1 [ drop-food ] | |||
if not nest? [ move ] | |||
if food-here > 0 and food = 0 [ pick-up-food ] | |||
if not nest? [ lay-chemical ] | |||
] | |||
diffuse chemical 0.5 | |||
ask patches [ | |||
set chemical chemical * 0.95 | |||
if chemical < 0.01 [ set chemical 0 ] | |||
if not nest? [ | |||
set pcolor scale-color gray chemical 0 10 | |||
] | |||
] | |||
forget-stale-memory | |||
update-plots | |||
tick | |||
end | |||
;; ============================================ | |||
;; ПАМЯТЬ (ОСНОВНАЯ ЛОГИКА) | |||
;; ============================================ | |||
to pick-up-food | |||
set food 1 | |||
set color orange | |||
set label "F" | |||
set food-here 0 | |||
ask patch-here [ set food 0 set pcolor gray ] | |||
end | |||
to drop-food | |||
set food 0 | |||
set color red | |||
set label "" | |||
set food-in-nest food-in-nest + 1 | |||
end | |||
to lay-chemical | |||
ask patch-here [ set chemical chemical + 60 ] | |||
end | |||
to move | |||
; используем память, если энергии мало и есть воспоминания | |||
if energy < 100 and length memory > 0 [ | |||
let closest-patch min-one-of memory [distance myself] | |||
if closest-patch != nobody [ | |||
face closest-patch | |||
fd 1 | |||
stop | |||
] | |||
] | |||
; иначе обычное движение по феромону | |||
if chemical > 0.5 [ | |||
uphill-chemical | |||
] | |||
fd 1 | |||
end | |||
to uphill-chemical | |||
let best-patch patch-here | |||
let best-value chemical | |||
ask neighbors [ | |||
if chemical > best-value [ | |||
set best-value chemical | |||
set best-patch self | |||
] | |||
] | |||
if best-patch != patch-here [ | |||
face best-patch | |||
] | |||
end | |||
to forget-stale-memory | |||
if length memory > 0 [ | |||
let to-remove [] | |||
foreach memory [ mem-patch -> | |||
if [food] of mem-patch = 0 [ | |||
set to-remove lput mem-patch to-remove | |||
] | |||
] | |||
foreach to-remove [ rm-patch -> | |||
set memory remove rm-patch memory | |||
] | |||
] | |||
end | |||
to update-plots | |||
; заглушка для графиков | |||
end | |||
Версия от 11:59, 14 мая 2026
* Ants
Код
Пример 1
to circle
layout-circle turtles max-pxcor - 2
end
globals [
food-source-number food-in-nest food-in-nest-history chemical-history
]
patches-own [
chemical food food-source-number nest?
]
turtles-own [
chemical food memory ; список запомненных патчей (мест с едой)
]
- ============================================
- ИНИЦИАЛИЗАЦИЯ
- ============================================
to setup
ca set-default-shape turtles "bug" ask patch 0 0 [ set nest? true set pcolor violet ] create-food-sources create-ants set food-in-nest 0 set food-in-nest-history [] set chemical-history [] reset-ticks
end
to create-food-sources
let number-of-food-sources 4
set food-source-number number-of-food-sources
let angle 0
let radius (max-pxcor - 5)
let angle-step 360 / number-of-food-sources
repeat number-of-food-sources [
let xcor radius * cos angle
let ycor radius * sin angle
ask patch xcor ycor [
set food 1
set pcolor green
set food-source-number angle
]
set angle angle + angle-step
]
end
to create-ants
create-turtles 50 [ setxy 0 0 set color red set chemical 0 set food 0 set memory [] set label "" ]
end
- ============================================
- ОСНОВНОЙ ЦИКЛ
- ============================================
to go
if all? turtles [food = 1] [ stop ]
ask turtles [
if nest? and food = 1 [ drop-food ]
if not nest? [ move ]
if food-here > 0 and food = 0 [ pick-up-food ]
if not nest? [ lay-chemical ]
]
diffuse chemical 0.5
ask patches [
set chemical chemical * 0.95
if chemical < 0.01 [ set chemical 0 ]
if not nest? [
set pcolor scale-color gray chemical 0 10
]
]
forget-stale-memory
update-plots
tick
end
- ============================================
- ПАМЯТЬ (ОСНОВНАЯ ЛОГИКА)
- ============================================
to pick-up-food
set food 1 set color orange set label "F" set food-here 0 ask patch-here [ set food 0 set pcolor gray ]
end
to drop-food
set food 0 set color red set label "" set food-in-nest food-in-nest + 1
end
to lay-chemical
ask patch-here [ set chemical chemical + 60 ]
end
to move
; используем память, если энергии мало и есть воспоминания
if energy < 100 and length memory > 0 [
let closest-patch min-one-of memory [distance myself]
if closest-patch != nobody [
face closest-patch
fd 1
stop
]
]
; иначе обычное движение по феромону
if chemical > 0.5 [
uphill-chemical
]
fd 1
end
to uphill-chemical
let best-patch patch-here
let best-value chemical
ask neighbors [
if chemical > best-value [
set best-value chemical
set best-patch self
]
]
if best-patch != patch-here [
face best-patch
]
end
to forget-stale-memory
if length memory > 0 [
let to-remove []
foreach memory [ mem-patch ->
if [food] of mem-patch = 0 [
set to-remove lput mem-patch to-remove
]
]
foreach to-remove [ rm-patch ->
set memory remove rm-patch memory
]
]
end
to update-plots
; заглушка для графиков
end
