Ants/Clone01

Материал из Поле цифровой дидактики
* 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