Netlogo: измерение среднего расстояния между начальным и конечным патчами

Я учу себя создавать ABM в Netlogo, используя книгу Railsback & Grimm 2012. У меня возникли проблемы с одним книжным упражнением, которое касается бабочек, следующих по «виртуальным» коридорам. Основная идея заключается в том, что бабочки поднимаются в гору для спаривания, ориентируясь на разницу в высоте. Мне нужно рассчитать ширину коридоров, разделив количество участков, используемых бабочками, на среднее расстояние, на которое бабочки пролетают от начального участка до конечного участка. Я борюсь с построением этой ширины коридора, которую я кодирую следующим образом:

to-report corridor-width

  let patches-visited count patches with [used?]
  let mean-distance mean [distance start-patch] of turtles
  report patches-visited / mean-distance

Затем я создал график в интерфейсе с помощью команды:

plot corridor-width

Сообщение об ошибке, которое я получаю, гласит:

Деление на ноль. ошибка во время работы/вызова наблюдателя процедурой CORRIDOR-WIDTH, вызванной графиком «Ширина коридора», пером «по умолчанию», код обновления, вызванным процедурой SETUP, вызванной кнопкой «setup»

Я считаю, что что-то не так с тем, как я кодирую distance start-patch, но я просмотрел Интернет и просмотрел несколько кодов, и я не могу найти свою ошибку. Весь мой код выглядит так:

globals [ q ]                    ;; q is the probability that butterfly moves directly to highest patch
turtles-own [ start-patch ]
patches-own [ elevation used? ]     ;; patches property of elevation and whether the patch has been used by butterfly or not.

to setup
  ca

  ;; Let's create patches and asign them an elevation and color by using ask patches statement

  ask patches

  [
    ;; Elevation decreases linearly with distance from the center of hills. Hills are at (30,30) and
    ;; (120,120) coordinates. The first hill is 100 units high whereas the second one is 50
    let elev1 100 - distancexy 30 30
    let elev2 50 - distancexy 120 100

    ifelse elev1 > elev2
    [ set elevation elev1 ]
    [ set elevation elev2 ]

    set pcolor scale-color green elevation 0 100

    set used? false
   ]

  ;; Create 50 butterflies

  crt 50

  ask turtles [

  set size 6

  ;; set their initial location as their initial patch

  setxy random-pxcor random-pycor

  set start-patch patch-here


  ;; have the butterfly draw its path with the pen-down statement
  pen-down
]

  reset-ticks

  ;; Initialize the q parameter
  set q 0.4

end

;; The master schedule

to go

  ask turtles [ move ]
  plot corridor-width
  tick
  if ticks >= 1000

  [
    let final-corridor-width corridor-width
    write "Corridor width: " print final-corridor-width
    ;export-plot "Corridor width" (word "Corridor-width-output-for-q-" q ".csv")
    stop

  ]

end

;; let's code the butterfly procedure of movement

to move

  if elevation >=
  [ elevation ] of max-one-of neighbors [ elevation ]
  [ stop ]

  ifelse random-float 1 < q                ;; Decide whether to move to the highest sorrounding
                                           ;; patch with p=q

  [ uphill elevation ]                     ;; move deterministically uphill
  [ move-to one-of neighbors ]             ;; or move randomly

  set used? true

end

to-report corridor-width

  let patches-visited count patches with [used?]
  let mean-distance mean [distance start-patch] of turtles
  report patches-visited / mean-distance

end

person AnnK    schedule 18.10.2016    source источник


Ответы (1)


Что происходит, когда среднее расстояние равно 0?

let mean-distance mean [distance start-patch] of turtles

По сути, в вашей настройке вы устанавливаете для всех начальных патчей черепахи их текущие патчи. Итак, если вы спросите всех черепах, как далеко они от своего стартового участка, все они скажут вам, что на расстоянии 0 единиц.

Итак, [distance start-patch] of turtles заполнен списком всех 0.

Таким образом, среднее значение списка всех 0 равно 0, что вызывает вашу ошибку деления на 0.

Возможно, в этой ситуации вы хотите вместо этого сообщить 0... так что

ifelse mean-distance = 0 
[ report 0]
[report patches-visited / mean-distance]
person mattsap    schedule 19.10.2016
comment
@matttsap спасибо, что объяснили, в чем была моя ошибка. Мои черепахи на самом деле двигаются, поэтому не должно быть 0 на любых расстояниях между начальным и конечным участками. То, что я пытался закодировать, заключалось в том, чтобы получить среднее расстояние между начальным и конечным участками моих черепах после каждого запуска. Не могли бы вы посоветовать мне, как мне изменить мой код для этой цели? - person AnnK; 20.10.2016
comment
Ну, дело в том, что вы вычисляете среднее расстояние на каждом тике (включая начало, где возникает ваша проблема). Если вам нужна только одна точка, вы не будете отображать среднее расстояние после каждого тика, вместо этого вы должны определить критерии остановки для своей симуляции и сказать, если критерии остановки [показать ширину коридора] или что-то в этом роде похоже на это. - person mattsap; 20.10.2016