AnnK
AnnK

Reputation: 189

Netlogo: measure mean distance between start and end patches

I am teaching myself how to create ABMs in Netlogo using the book of Railsback & Grimm 2012. I am having trouble with one book exercise which is on butterflies following "virtual" corridors. Basic idea is that butterflies go uphill for mating using the differences in height as guide. I need to calculate the width of the corridors dividing the number of patches used by the butterflies over the average distance the butterflies fly from the start patch to the end patch. I am struggling with plotting this corridor width, which I am coding like this:

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

I then created a plot in the interface with the command:

plot corridor-width

The error message I get reads:

Division by zero. error while observer running / called by procedure CORRIDOR-WIDTH called by plot 'Corridor width' pen 'default' update code called by procedure SETUP called by Button 'setup'

I believe there is something wrong with the way I am coding distance start-patch but I have surfed the web and looked at several codes and I cannot spot my mistake. My whole code looks like this:

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

Upvotes: 2

Views: 1328

Answers (1)

mattsap
mattsap

Reputation: 3806

What happens when the mean-distance is 0?

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

Essentially, in your setup, you set all the turtle's start-patch to their current patch. So, if you ask all the turtles how far away they are from their start patch, they will all tell you 0 units away.

So, [distance start-patch] of turtles is filled with a list of all 0's.

Thus, a mean of a list of all 0s is 0 causing your divide by 0 error.

Maybe in this situation, you want to report 0 instead...so

ifelse mean-distance = 0 
[ report 0]
[report patches-visited / mean-distance]

Upvotes: 1

Related Questions