Ants/Zhitkova

Материал из Поле цифровой дидактики

Remix Ants

Код

;; ============================================
;; ДОПОЛНИТЕЛЬНЫЕ СВОЙСТВА ПАТЧЕЙ
;; ============================================
patches-own [
  chemical             ;; amount of chemical on this patch
  food                 ;; amount of food on this patch (0, 1, or 2)
  nest?                ;; true on nest patches, false elsewhere
  nest-scent           ;; number that is higher closer to the nest
  food-source-number   ;; number (1, 2, or 3) to identify the food sources
]

;; ============================================
;; НАСТРОЙКА МИРА (SETUP)
;; ============================================

to setup
  clear-all
  set-default-shape turtles "bug"
  
  ;; создаём муравьёв
  create-turtles population
  [ 
    set size 2         ;; easier to see
    set color red      ;; red = not carrying food
  ]
  
  setup-patches
  reset-ticks
end

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

to setup-nest  ;; patch procedure
  ;; set nest? variable to true inside the nest, false elsewhere
  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
end

to setup-food  ;; patch procedure
  ;; setup food source one on the right
  if (distancexy (0.6 * max-pxcor) 0) < 5
  [ set food-source-number 1 ]
  ;; setup food source two on the lower-left
  if (distancexy (-0.6 * max-pxcor) (-0.6 * max-pycor)) < 5
  [ set food-source-number 2 ]
  ;; setup food source three on the upper-left
  if (distancexy (-0.8 * max-pxcor) (0.8 * max-pycor)) < 5
  [ set food-source-number 3 ]
  ;; set "food" at sources to either 1 or 2, randomly
  if food-source-number > 0
  [ set food one-of [1 2] ]
end

to recolor-patch  ;; patch procedure
  ;; give color to nest and food sources
  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 ]
    ]
    ;; scale color to show chemical concentration
    [ set pcolor scale-color green chemical 0.1 5 ]
  ]
end

;; ============================================
;; ОСНОВНОЙ ЦИКЛ (GO)
;; ============================================

to go  ;; forever button
  ask turtles
  [ 
    if who >= ticks [ stop ] ;; delay initial departure
    ifelse color = red
    [ look-for-food  ]       ;; not carrying food? look for it
    [ return-to-nest ]       ;; carrying food? take it back to nest
    wiggle
    fd 1 
  ]
  diffuse chemical (diffusion-rate / 100)
  ask patches
  [ 
    set chemical chemical * (100 - evaporation-rate) / 100  ;; slowly evaporate chemical
    recolor-patch 
  ]
  tick
end

to return-to-nest  ;; turtle procedure
  ifelse nest?
  [ 
    ;; drop food and head out again
    set color red
    rt 180
  ]
  [ 
    set chemical chemical + 60  ;; drop some chemical
    uphill-nest-scent           ;; head toward the greatest value of nest-scent
  ]
end

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

;; sniff left and right, and go where the strongest smell is
to uphill-chemical  ;; turtle procedure
  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

;; sniff left and right, and go where the strongest smell is
to uphill-nest-scent  ;; turtle procedure
  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  ;; turtle procedure
  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

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

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 ]

---