Ants/Sirenko: различия между версиями

Материал из Поле цифровой дидактики
Нет описания правки
Метка: ручная отмена
Нет описания правки
 
Строка 2: Строка 2:


<netlogo model="Ants" />
<netlogo model="Ants" />
netlogo
globals [
  population        ;; количество муравьёв
  diffusion-rate    ;; скорость диффузии феромона (0-100)
  evaporation-rate  ;; скорость испарения феромона (0-100)
]


== Код ==
patches-own [
patches-own [
   chemical            ;; amount of chemical on this patch
   chemical            ;; количество феромона на этом участке
   food                ;; amount of food on this patch (0, 1, or 2)
   food                ;; количество еды на участке (0, 1 или 2)
   nest?                ;; true on nest patches, false elsewhere
   nest?                ;; true на участках гнезда
   nest-scent          ;; number that is higher closer to the nest
   nest-scent          ;; число, показывающее близость к гнезду
   food-source-number  ;; number (1, 2, or 3) to identify the food sources
   food-source-number  ;; номер источника еды (1, 2, 3)
]
]


Строка 18: Строка 23:
to setup
to setup
   clear-all
   clear-all
  ;; параметры (можно менять)
  set population 50
  set diffusion-rate 50  ;; 50% феромона распространяется на соседей
  set evaporation-rate 10 ;; 10% феромона испаряется за тик
   set-default-shape turtles "bug"
   set-default-shape turtles "bug"
   create-turtles population
   create-turtles population
   [ set size 2         ;; easier to see
   [ set size 2
     set color red ]   ;; red = not carrying food
     set color red
    setxy random-xcor random-ycor
  ]
 
   setup-patches
   setup-patches
   reset-ticks
   reset-ticks
Строка 34: Строка 48:


to setup-nest  ;; patch procedure
to setup-nest  ;; patch procedure
  ;; set nest? variable to true inside the nest, false elsewhere
   set nest? (distancexy 0 0) < 5
   set nest? (distancexy 0 0) < 5
  ;; spread a nest-scent over the whole world -- stronger near the nest
   set nest-scent 200 - distancexy 0 0
   set nest-scent 200 - distancexy 0 0
end
end


to setup-food  ;; patch procedure
to setup-food  ;; patch procedure
   ;; setup food source one on the right
   ;; источник 1 — справа
   if (distancexy (0.6 * max-pxcor) 0) < 5
   if (distancexy (0.6 * max-pxcor) 0) < 5
   [ set food-source-number 1 ]
   [ set food-source-number 1 ]
   ;; setup food source two on the lower-left
 
   ;; источник 2 — снизу слева
   if (distancexy (-0.6 * max-pxcor) (-0.6 * max-pycor)) < 5
   if (distancexy (-0.6 * max-pxcor) (-0.6 * max-pycor)) < 5
   [ set food-source-number 2 ]
   [ set food-source-number 2 ]
   ;; setup food source three on the upper-left
 
   ;; источник 3 — сверху слева
   if (distancexy (-0.8 * max-pxcor) (0.8 * max-pycor)) < 5
   if (distancexy (-0.8 * max-pxcor) (0.8 * max-pycor)) < 5
   [ set food-source-number 3 ]
   [ set food-source-number 3 ]
  ;; set "food" at sources to either 1 or 2, randomly
 
   if food-source-number > 0
   if food-source-number > 0
   [ set food one-of [1 2] ]
   [ set food one-of [1 2] ]
Строка 56: Строка 70:


to recolor-patch  ;; patch procedure
to recolor-patch  ;; patch procedure
  ;; give color to nest and food sources
   ifelse nest?
   ifelse nest?
   [ set pcolor violet ]
   [ set pcolor violet ]
   [ ifelse food > 0
   [ ifelse food > 0
     [ if food-source-number = 1 [ set pcolor cyan ]
     [ if food-source-number = 1 [ set pcolor cyan ]
       if food-source-number = 2 [ set pcolor sky ]
       if food-source-number = 2 [ set pcolor sky ]
       if food-source-number = 3 [ set pcolor blue ] ]
       if food-source-number = 3 [ set pcolor blue ]
     ;; scale color to show chemical concentration
     ]
     [ set pcolor scale-color green chemical 0.1 5 ] ]
     [ set pcolor scale-color green chemical 0.1 5 ]
  ]
end
end


Строка 71: Строка 85:
;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;


to go ;; forever button
to go
   ask turtles
   ask turtles
   [ if who >= ticks [ stop ] ;; delay initial departure
   [
     ifelse color = red
     ifelse color = red
     [ look-for-food ]       ;; not carrying food? look for it
     [ look-for-food ]
     [ return-to-nest ]       ;; carrying food? take it back to nest
     [ return-to-nest ]
 
     wiggle
     wiggle
     fd 1 ]
     fd 1
  ]
 
   diffuse chemical (diffusion-rate / 100)
   diffuse chemical (diffusion-rate / 100)
   ask patches
   ask patches
   [ set chemical chemical * (100 - evaporation-rate) / 100 ;; slowly evaporate chemical
   [
     recolor-patch ]
    set chemical chemical * (100 - evaporation-rate) / 100
     recolor-patch
  ]
 
   tick
   tick
end
end
Строка 88: Строка 108:
to return-to-nest  ;; turtle procedure
to return-to-nest  ;; turtle procedure
   ifelse nest?
   ifelse nest?
   [ ;; drop food and head out again
   [
     set color red
     set color red
     rt 180 ]
     rt 180
   [ set chemical chemical + 60 ;; drop some chemical
  ]
     uphill-nest-scent ]         ;; head toward the greatest value of nest-scent
   [
    set chemical chemical + 60
     uphill-nest-scent
  ]
end
end


to look-for-food  ;; turtle procedure
to look-for-food  ;; turtle procedure
   if food > 0
   if food > 0
   [ set color orange + 1     ;; pick up food
   [
     set food food - 1       ;; and reduce the food source
    set color orange + 1
     rt 180                   ;; and turn around
     set food food - 1
     stop ]
     rt 180
  ;; go in the direction where the chemical smell is strongest
     stop
  ]
 
   if (chemical >= 0.05) and (chemical < 2)
   if (chemical >= 0.05) and (chemical < 2)
   [ uphill-chemical ]
   [ uphill-chemical ]
end
end


;; sniff left and right, and go where the strongest smell is
to uphill-chemical
to uphill-chemical ;; turtle procedure
   let scent-ahead chemical-scent-at-angle 0
   let scent-ahead chemical-scent-at-angle   0
   let scent-right chemical-scent-at-angle 45
   let scent-right chemical-scent-at-angle 45
   let scent-left  chemical-scent-at-angle -45
   let scent-left  chemical-scent-at-angle -45
   if (scent-right > scent-ahead) or (scent-left > scent-ahead)
   if (scent-right > scent-ahead) or (scent-left > scent-ahead)
   [ ifelse scent-right > scent-left
   [
    ifelse scent-right > scent-left
     [ rt 45 ]
     [ rt 45 ]
     [ lt 45 ] ]
     [ lt 45 ]
  ]
end
end


;; sniff left and right, and go where the strongest smell is
to uphill-nest-scent
to uphill-nest-scent ;; turtle procedure
   let scent-ahead nest-scent-at-angle 0
   let scent-ahead nest-scent-at-angle   0
   let scent-right nest-scent-at-angle 45
   let scent-right nest-scent-at-angle 45
   let scent-left  nest-scent-at-angle -45
   let scent-left  nest-scent-at-angle -45
   if (scent-right > scent-ahead) or (scent-left > scent-ahead)
   if (scent-right > scent-ahead) or (scent-left > scent-ahead)
   [ ifelse scent-right > scent-left
   [
    ifelse scent-right > scent-left
     [ rt 45 ]
     [ rt 45 ]
     [ lt 45 ] ]
     [ lt 45 ]
  ]
end
end


to wiggle ;; turtle procedure
to wiggle
   rt random 40
   rt random 40
   lt random 40
   lt random 40

Текущая версия от 09:15, 21 мая 2026

Remix Ants

netlogo globals [

 population        ;; количество муравьёв
 diffusion-rate    ;; скорость диффузии феромона (0-100)
 evaporation-rate  ;; скорость испарения феромона (0-100)

]

patches-own [

 chemical             ;; количество феромона на этом участке
 food                 ;; количество еды на участке (0, 1 или 2)
 nest?                ;; true на участках гнезда
 nest-scent           ;; число, показывающее близость к гнезду
 food-source-number   ;; номер источника еды (1, 2, 3)

]

Setup procedures ;;;

to setup

 clear-all
 ;; параметры (можно менять)
 set population 50
 set diffusion-rate 50   ;; 50% феромона распространяется на соседей
 set evaporation-rate 10 ;; 10% феромона испаряется за тик
 set-default-shape turtles "bug"
 create-turtles population
 [ set size 2
   set color red
   setxy random-xcor random-ycor
 ]
 setup-patches
 reset-ticks

end

to setup-patches

 ask patches
 [ setup-nest
   setup-food
   recolor-patch ]

end

to setup-nest  ;; patch procedure

 set nest? (distancexy 0 0) < 5
 set nest-scent 200 - distancexy 0 0

end

to setup-food  ;; patch procedure

 ;; источник 1 — справа
 if (distancexy (0.6 * max-pxcor) 0) < 5
 [ set food-source-number 1 ]
 ;; источник 2 — снизу слева
 if (distancexy (-0.6 * max-pxcor) (-0.6 * max-pycor)) < 5
 [ set food-source-number 2 ]
 ;; источник 3 — сверху слева
 if (distancexy (-0.8 * max-pxcor) (0.8 * max-pycor)) < 5
 [ set food-source-number 3 ]
 if food-source-number > 0
 [ set food one-of [1 2] ]

end

to recolor-patch  ;; patch procedure

 ifelse nest?
 [ set pcolor violet ]
 [ ifelse food > 0
   [ if food-source-number = 1 [ set pcolor cyan ]
     if food-source-number = 2 [ set pcolor sky ]
     if food-source-number = 3 [ set pcolor blue ]
   ]
   [ set pcolor scale-color green chemical 0.1 5 ]
 ]

end

Go procedures ;;;

to go

 ask turtles
 [
   ifelse color = red
   [ look-for-food ]
   [ return-to-nest ]
   wiggle
   fd 1
 ]
 diffuse chemical (diffusion-rate / 100)
 ask patches
 [
   set chemical chemical * (100 - evaporation-rate) / 100
   recolor-patch
 ]
 tick

end

to return-to-nest  ;; turtle procedure

 ifelse nest?
 [
   set color red
   rt 180
 ]
 [
   set chemical chemical + 60
   uphill-nest-scent
 ]

end

to look-for-food  ;; turtle procedure

 if food > 0
 [
   set color orange + 1
   set food food - 1
   rt 180
   stop
 ]
 if (chemical >= 0.05) and (chemical < 2)
 [ uphill-chemical ]

end

to uphill-chemical

 let scent-ahead chemical-scent-at-angle 0
 let scent-right chemical-scent-at-angle 45
 let scent-left  chemical-scent-at-angle -45
 if (scent-right > scent-ahead) or (scent-left > scent-ahead)
 [
   ifelse scent-right > scent-left
   [ rt 45 ]
   [ lt 45 ]
 ]

end

to uphill-nest-scent

 let scent-ahead nest-scent-at-angle 0
 let scent-right nest-scent-at-angle 45
 let scent-left  nest-scent-at-angle -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 40
 lt random 40
 if not can-move? 1 [ rt 180 ]

end

to-report nest-scent-at-angle [angle]

 let p patch-right-and-ahead angle 1
 if p = nobody [ report 0 ]
 report [nest-scent] of p

end

to-report chemical-scent-at-angle [angle]

 let p patch-right-and-ahead angle 1
 if p = nobody [ report 0 ]
 report [chemical] of p

end </syntaxhighlight>

Справка по командам к черепахам

task realisation
Все turtles выполняют команду
ask turtles [ fd 1 ]
Выбрать turtles по условию
ask turtles with [color = red] [ set size 2 ]
Исключить текущую turtle из набора
ask turtles [ show other turtles ]
Turtles на текущем патче
ask turtles [ show turtles-here ]
Другие turtles на текущем патче
ask turtles [ show other turtles-here ]
Turtles на соседних патчах
ask turtles [ show turtles-on neighbors4 ]
Turtles в радиусе
ask turtles [ show turtles in-radius 3 ]
Проверить, есть ли соседи-черепахи
ask turtles [ if any? other turtles in-radius 2 [ set color red ] ]
Посчитать число соседей
ask turtles [ set label count other turtles in-radius 2 ]
Получить patch под turtle
ask turtles [ show patch-here ]
Получить patch впереди
ask turtles [ show patch-ahead 1 ]
Проверить, можно ли идти вперед
ask turtles [ if can-move? 1 [ fd 1 ] ]
Выбрать самую "богатую" turtle
turtles-own [energy]
ask max-one-of turtles [energy] [ set color yellow ]
Выбрать несколько turtles по максимуму
turtles-own [energy]
ask max-n-of 5 turtles [energy] [ set shape "star" ]
Случайная turtle из набора
ask one-of turtles with [color = blue] [ set color pink ]
Собрать список значений turtle-переменной
turtles-own [energy]
show [energy] of turtles
Среднее значение по turtles
turtles-own [energy]
show mean [energy] of turtles
Сумма значений по turtles
turtles-own [energy]
show sum [energy] of turtles
Отсортировать turtles по who
show sort-on [who] turtles
Сформировать набор из разных источников
let selected turtle-set turtles with [color = red] turtles with [shape = "car"]
ask selected [ set label who ]
Создать links со всеми остальными
ask turtle 0 [ create-links-with other turtles ]
Получить все links данной turtle
ask turtles [ show my-links ]

---