Я учу себя создавать 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