error: "You can't use TICK in a turtle context, because TICK is observer-only"

905 views
Skip to first unread message

Unruh Lee

unread,
Jun 30, 2022, 4:10:43 AM6/30/22
to netlogo-users
I'm getting the confusing error: "You can't use TICK in a turtle context, because TICK is observer-only". It's confusing because "tick" is in the "to go" procedure. But the error happens when the following procedure is called: 

to abandon-cacao
  let owner-id who
  ask highlanders with [ cacao-grower = true ] [
    if cacao-profit < 1 [
      set cacao-grower false
      set color red
      ask patches with [ owner = owner-id ] [
        recolor-patch
        set owner 999999
    ]
    ]
  ]
end


I tried calling that procedure from "to go" or from another procedure, "to cacao-grower-actions", but both cause the error. 

The full model code is attached in case that's handy. Thanks in advance for any help!
Lee
resourceharvest_altered_6_29_22.nlogo

Charles Staelin

unread,
Jun 30, 2022, 8:09:19 AM6/30/22
to netlogo-users
Lee, 

The problem is indeed in "abandon-cacao".  The first line in that procedure is "let owner-id who" and, since "who" is a turtle's variable, it changes the context of the procedure to a turtle procedure.  Thus NetLogo's confusion when it returns to the go procedure thinking that it is still in turtle context.  You'll note that if you change "who" in that line to, say, "1", the error disappears.  More generally, whose "who" is being referred to there?  The line looks misplaced.

Charles

Wade Schuette

unread,
Jun 30, 2022, 8:15:43 AM6/30/22
to netlogo-users
It would be a great help if someone (!) would develop an improved Integrated Development Environment ( rich editor ) for Netlogo that you could ask to turn on color coding for what context each line  ( or part of a line) is in.    This is frustrating and baffling for many users, new and old alike, to silently change context and not realize it.

Wade

--
You received this message because you are subscribed to the Google Groups "netlogo-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to netlogo-user...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/netlogo-users/58040dd8-3562-4d32-95a2-9c1967bfecfan%40googlegroups.com.

Unruh Lee

unread,
Jun 30, 2022, 12:46:11 PM6/30/22
to Wade Schuette, netlogo-users
Charles and Wade, thank you!

It does seem that if I move that line you mention, Charles ("let owner-id who"), down further into the bracketed code block below, the error also disappears.  

to abandon-cacao
  ask highlanders with [ cacao-grower = true ] [
    let owner-id who
    if cacao-profit < 1 [
      set cacao-grower false
      set color red
      ask patches with [ owner = owner-id ] [
        recolor-patch
        set owner 999999
    ]
    ]
  ]
end

 This brings up more general questions about using "who" for me. James Steiner wrote in another thread: 
Who always returns a number. 

Self always returns an agent (an object, never a number).

 Aagent can never be equal to a number.

...Another issue is that the code stores a WHO number in OWNER. That's a bad practice. 
It's almost always a code smell [I think he meant something to the effect of "bad practice"?] to use who numbers, except maybe for setting color.

And elsewhere James wrote, "Unless you have a very good reason to do so, never work with who numbers ,,, just work with the turtles."
Note that if I change the above code to use "owner = self" rather than "let owner-id who" followed by "ask patches with [ owner = owner-id ], as follows, this does seem to work. 

to abandon-cacao
  ask highlanders with [ cacao-grower = true ] [
    ;; let owner-id who
    if cacao-profit < 1 [
      set cacao-grower false
      set color red
      ask patches with [ owner = self ] [
        recolor-patch
        set owner 999999
    ]
    ]
  ]
end

Hmm, I was about to say that, on the other hand, it doesn't work with the related code below. But now it DOES seem to be working! I guess I'm not totally clear about the difference between objects and numbers, and what all the ramifications are of using "self" Vs. "who" here. Could anyone point me in the direction of something to read that might help my understanding? 

Thanks! 
Lee

PS. Wade, what you said about developing "an improved Integrated Development Environment ( rich editor ) for Netlogo that you could ask to turn on color coding for what context each line  ( or part of a line) is in" does seem like a good idea! To silently change context and not realize it is particularly baffling for those of us that are just starting to grasp what "turtle context" or "observer context" means!

  



to market-actions
;; new cacao growers are picked, randomly but inversely proportional to the weight given by their distance from the market. The number of them per tick determined by slider.
ask markets [
    let max-dist distance max-one-of patches [distance myself]
    ;show  word "max distance to market is " max-dist
    if any? highlanders with [ cacao-grower = false ] [ ask highlanders with [ cacao-grower = false ] [ ; "if any?" was needed b/c an error occurred if all were cacao-growers
      let my-distance distance (one-of markets) + .001  ; to avoid division by zero problem when "my-distance / max-distance = 0"
      ;show word "my distance to market is " my-distance
      set percent-max-distance 1 / (my-distance / max-dist) ; actually the reciprocal so it works with rnd:weighted-one-of, below
      ;show percent-max-distance
    ]
      while [ new-cacao-growers > count highlanders with [ cacao-grower = false ] ] ; decrement slider if there's not enough potential new cacao-growers to run commands
      [ set new-cacao-growers new-cacao-growers - 1 ]
      let new-grower rnd:weighted-n-of new-cacao-growers highlanders with [ cacao-grower = false ] [ percent-max-distance ]
      ask new-grower [
        if any? patches with [cacao-crop = false and max-resource-here >= 1] [
          set color blue
          set cacao-grower true
          let radius-new-cfarm 5 ; try to move to non-cacao patch within radius 5, otherwise increment that radius until suitable patches are found
          ; show word "number of non-cacao patches in radius 5 is " count patches in-radius radius-new-cfarm with [cacao-crop = false]
          while [1 > count patches in-radius radius-new-cfarm with [cacao-crop = false and max-resource-here >= 1] ] [ set radius-new-cfarm radius-new-cfarm + 1 ]
          ; show word "number of non-cacao patches in radius 5 is " count patches in-radius radius-new-cfarm with [cacao-crop = false]
          move-to one-of patches in-radius radius-new-cfarm with [cacao-crop = false and max-resource-here >= 1] ; move to random non-cacao-crop patch within 5 (arbitrary, for starters) patches away, if possible, incrementing further out if necessary.
        ]
        ;; thought this would be obsolete with "set owner self" below (as per Steiner suggestion?) instead of "set owner owner-number", but I get weird behavior I don't understand?
        ; let owner-number who ; create variable out of who number (turtle ID);  
        let neighbor-patches-to-cacao extra-cacao-patches ; equivalent to that set in slider, to be decremented here if necessary. Decrement the EQUIVALENT OF slider (so slider is NOT changed for every case)
        while [ neighbor-patches-to-cacao > count neighbors with [cacao-crop = false and max-resource-here >= 1] ] ; decrement if there's not enough potential new patches to turn into cacao crops
      [ set neighbor-patches-to-cacao neighbor-patches-to-cacao - 1 ]
        ;; slider "extra-cacao-patches" determines number of extra neighboring patches made into cacao farms
        ask n-of neighbor-patches-to-cacao neighbors with [cacao-crop = false and max-resource-here >= 1] [ ; turn neighbor-patches-to-cacao neighboring patches, and patch-here (below) cacao-crop variable to "true" and mark who owns them.
          set cacao-crop true
          set owner self
        ]
          ask patch-here [
            set cacao-crop true
            set owner self
          ]
    ]
    ]
  ]
end





You received this message because you are subscribed to a topic in the Google Groups "netlogo-users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/netlogo-users/Z5Ff7l2k8fI/unsubscribe.
To unsubscribe from this group and all its topics, send an email to netlogo-user...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/netlogo-users/CACv-4rDBuHZdhwMgvUcuZUSCzwS3hp8v7dQcs7wt%3DKnu2aVt6w%40mail.gmail.com.

Unruh Lee

unread,
Jun 30, 2022, 1:26:50 PM6/30/22
to Wade Schuette, netlogo-users
PPS. I take it back about it working to change the "to market-actions" code above to use "owner = self" rather than "let owner-id who" followed by "ask patches with [ owner = owner-id ]. I think I was just confused. And now I'm even more confused about that. 



Charles Staelin

unread,
Jun 30, 2022, 3:38:18 PM6/30/22
to netlogo-users
So, let me see if I can help with self vs who.  You can think of who as a sequence number that the system uses to keep track of the order of each agent's creation.  Since each agent is created one at a time, each agent has a unique place in the order, and thus a unique who number.  who numbers are actual (interger) numbers, in this case, sequence numbers, as you would expect.  self, on the other hand, belongs to the agent itself.  Each agent is unique, and thus each agent has its own identity, its "self".  Perhaps you could think of it as the agent's name, or even its anima.  Each agent, of course, knows its self and NetLogo keeps track of all the agents' selves internally.  I don't know how they are represented internally, but NetLogo can create lists of them, or sets of them.  Because the self belongs to the agent, and not the system, it is more in keeping with the philosophy of agent-based modeling to use "self"s rather than sequence numbers to refer to them.  And, indeed, very little would be lost of NetLogo dropped who numbers altogether.

On to James' point.  When you set owner-id to who, you are making the owner-id a number that does in fact link back to a particular agent.  When you set owner to self, you are saying that the owner is literally me.  Of course you could also make the owner the self of the highlander with brown hair, eg.,
set owner [self] of highlander with [hair = brown]
but you'd need to be careful there was only one such brown-haired highlander or you would have the owner be a list of all the brown-haired highlanders.  Or if there were more than one owner like that, you could say
set owner highlanders with [hair = brown]
and get an set of owners.  You could then ask owners to do something, which you can not do with a list of who numbers.

So, let's look at this code.

to abandon-cacao
  ask highlanders with [ cacao-grower = true ] [
    let owner-id who
    if cacao-profit < 1 [
      set cacao-grower false
      set color red
      ask patches with [ owner = owner-id ] [
        recolor-patch
        set owner 999999
    ]
    ]
  ]
end

Let's say each patch's owner had been properly set to the self of the highlander who owned it.  Then:

to abandon-cacao
  ask highlanders with [ cacao-grower = true ] [
    if cacao-profit < 1 [
      set cacao-grower false
      set color red
      ask patches with [ owner = myself ] [
        recolor-patch
        set owner nobody
    ]
    ]
  ]
end

The highlander is asking the patches to see if they are owned by "myself", i.e., the highlander who is asking.  ("self" would be the identity of the patch itself.)  The owner of the patch is then set to "nobody", a special value denoting just what it says.  Unowned patches would then have owner = nobody.

Similarly, when growers collect patches into farms, they simply ask those patches to "set owner myself", I.e., to the self of the person who is asking that patch.

I hope this helps to clarify things a bit.  If not, by all means come back!
Charles

James Steiner

unread,
Jun 30, 2022, 4:42:31 PM6/30/22
to Charles Staelin, Unruh Lee, netlogo-users
To put it simply and without any philosophy:

Who is a fixed property of a turtle, an integer, it is like a serial number or as was said, a sequence number. Each turtle created has a who number one greater than the previously created turtle. When turtles die, they leave gaps in the sequence. Who numbers are not reused unless clear-turtles (or clear-all) is run. 

TURTLE N  s a reporter that returns a reference to the agent with the sequence number N

Self is a reporter that returns an  reference to the agent that is currently executing this code.

In programming terms, you can think of it as these report a structure that includes the knd of agent it is and  the location in memory where that agents properties are located. NetLogo hides this complexity from us. 

Self is like a shortcut for TURTLE WHO

We just say "self reports a reference to the turtle itself" and "you can store this reference in a variable, and use that variable is if it was the turtle."

We just pretend that TURTLE 0 "is" the turtle, that SELF "is" the turtle. But we keep in mind that when we assign that to a variable, we are not making a copy of the turtle, just a copy of the reference. 


NOW IT GETS TRICKY. 


MYSELF is a reporter that returns a reference to the agent that made the current agent execute this code. 

READ THAT AGAIN, SLOWLY. 

It can save you the trouble of assigning Self to a variable. 

Though, sometimes it's useful to assign self to a variable for later use. 


So

CA
Let thisguy nobody
Let thisbox patch 0 0
CRT 1
Create-turtles 1
[ Set thisguy self ]

Ask turtle 0 [ show self ]
Ask thisguy [ show self ]
Ask thisguy 
[ Ask thisbox
   [ show self
      Show myself
      Ask myself 
      [ show self
         Show myself
       ] 
    ]
]

If you can untangle that you've mastered self and myself. Hint: it's very straightforward and predictable. No magic. 

The show command prints  the agent running the show command.

You can see that self is always the same as the agent running the code. 

Myself is the "immediately outer agent"

Lee in your code you want to store the owner self in the owner-id   

The. Owners can compare it to myself. 

In your sample, comparing owner Id to self is an error, because self is always the patch. You would use myself there. 

When you need to refer to a particular agent, like to relate that agent to some other agent, you can store the value returned by Self in another variable. 

In your case, a patch has an owner.  

Instead of storing the who of the owner, it's better to store a reference to the owner in that variable. 

This topic has been confusing netlogo coders since the beginning, you are in good company. 

~~James 





Unruh Lee

unread,
Jul 1, 2022, 3:29:48 PM7/1/22
to ja...@turtlezero.com, Charles Staelin, netlogo-users
I really appreciate this generous help! 

I changed all my code, using self and myself where it seems appropriate. Got rid of all the use of who. 

Took me some time, wrestling with it because in many of the places where I was pretty sure "self" was appropriate, it took "myself" to make it work. 

A side-benefit of the process was noticing a bug, again involving the error about using TICK in a turtle context:
I have code for accumulation of cacao farm patches that's running many more times than intended. I'm pretty sure now that this is because it's within a code block that starts "ask highlanders with [ cacao-grower = true ] [..." 
I thought I could rewrite this whole procedure, as below, but then I get that old error about using TICK in a turtle context. 
I am again confused about where the context silently shifted, and how to best deal with it. 

New version of whole model code attached, but without the re-written procedure below. 

;; cacao-growers move among their private patches, accumulate more according to wealth and accumulators-per-tick slider
to cacao-grower-actions
  if max-wealth > 0 [ ; just to prevent division by zero error.
    let percent-wealth (wealth / max-wealth) ; percent of max wealth
    ; show word "my percent of max wealth is" percent-wealth
    let accumulator rnd:weighted-n-of accumulators-per-tick highlanders with [ cacao-grower = true ] [ percent-wealth ]
    if any? patches with [cacao-crop = false and max-resource-here >= 1] [
      let radius-new-cfarm 5 ; try to accumulate non-cacao patch within radius 5, otherwise we'll increment until suitable patches are found
      ; show word "number of non-cacao patches in radius 5, BEFORE while loop, is " count patches in-radius radius-new-cfarm with [cacao-crop = false]
      while [1 > count patches in-radius radius-new-cfarm with [cacao-crop = false and max-resource-here >= 1] ] [ set radius-new-cfarm radius-new-cfarm + 1 ]
      ; show word "number of non-cacao patches in radius 5, AFTER while loop, is " count patches in-radius radius-new-cfarm with [cacao-crop = false]
      move-to one-of patches in-radius radius-new-cfarm with [cacao-crop = false and max-resource-here >= 1]
    ]
    if any? neighbors with [cacao-crop = false and max-resource-here >= 1] [
      let extra-cacao-patches-temp extra-cacao-patches ; setting up a temporary substitute for extra-cacao-patches b/c don't want to permanently change slider just b/c the number is too much for one instance.
      while [extra-cacao-patches-temp > count neighbors with [cacao-crop = false and max-resource-here >= 1] ] [ set extra-cacao-patches-temp extra-cacao-patches-temp - 1 ]
      ;; slider "extra-cacao-patches" determines number of extra neighboring patches made into cacao farms
      ask n-of extra-cacao-patches-temp neighbors with [cacao-crop = false and max-resource-here >= 1] [
        set cacao-crop true
        set owner myself
        show word "My owner is " owner
      ]
      ask patch-here [
        set cacao-crop true
        set owner myself
        show word "My owner is " owner
      ]
    ]
  ]
       
  ask highlanders with [ cacao-grower = true ] [
    if any? other patches with [ owner = myself ] [ move-to one-of patches with [ owner = myself ]]  ; not quite what I want but close. …I don’t want it to be random, ideally.
    ; It should move to the other patch if there are two, as now, and when I make for accumulation of patches, I’ll want it to go through the list of them, or ideally move to the one with the highest resource? (As with "To turn-towards-resource")
    ; Tried to change this:
; if any? other patches with [ owner = owner-number ] [ move-to one-of patches with [ owner = owner-number ] and max resource-here ]
; or:
; if any? other patches with [ owner = owner-number ] [ move-to one-of patches with [ owner = owner-number ] and max [ resource-here ] ]
        ]
    set cacao-crops count patches with [ owner = myself ] ;; cacao-crops variable defined by number of patches owned for cacao growing ;; 6-30-22, if I did this right, "self" should work;; changed to myself. Confusing!
    show word "my number of cacao-crops is " cacao-crops
    set owned-patches [self] of patches with [owner = myself] ; makes a list of patches owned by each cacao grower, for debugging. Actually converts the agentset into a list.
    show word "my owned patches are " owned-patches
  ; abandon-cacao
end
 

resourceharvest_altered_7_1_22.nlogo

Charles Staelin

unread,
Jul 2, 2022, 2:27:35 PM7/2/22
to netlogo-users
The first section of to cacao-grower-actions requires a highlander to do something, using highlander variables.  This forces the procedure into turtle context.  NetLogo assumes that this procedure will be called from go by an "ask", eg., ask highlanders cocoa-grower-actions.  Rather than that, however, If you put as the first line of the procedure ask highlanders [   and put an extra "]" to close off that ask before the next ask highlanders, the procedure will revert back to observer context since everything within it is now something being asked of highlanders by the observer.  (Of course, perhaps you only want to ask growers, not all highlanders.)

Charles

Unruh Lee

unread,
Jul 3, 2022, 1:08:36 AM7/3/22
to Charles Staelin, netlogo-users
Thank you Charles. I think I'm finally getting this. 

But I'm still stumped on how to deal with this problem with the code for accumulation of cacao farm patches that's running many more times than intended. If the procedure starts with "ask highlanders with [ cacao-grower = true ] [ ...", then it iterates through all cacao growers, and I get one accumulator for each of them, when all I want is one per tick. 
I thought I found a workaround, by changing it to "ask ONE-OF highlanders with [ cacao-grower = true ] [ ...", but that is causing weird behavior that is baffling me. I can't figure out why, but it is making the changes to pcolor of cacao farm patches not stay brown as intended. 

I think there were some other sloppy bugs in the last version of the model I sent. So attached is the latest. In it, I put this in "to go":
ask highlanders with [ cacao-grower = true ] [ cacao-grower-actions]
And then "to cacao-grower-actions" is thus: 
to cacao-grower-actions
  if max-wealth > 0 [ ; just to prevent division by zero error.
      let percent-wealth (wealth / max-wealth) ; percent of max wealth
      ; show word "my percent of max wealth is" percent-wealth
      let accumulators rnd:weighted-n-of accumulators-per-tick highlanders with [ cacao-grower = true ] [ percent-wealth ]
      ask accumulators [
        show word "accumulator code test1: I am an accumulator " self
        if any? patches with [cacao-crop = false and max-resource-here >= 1] [
          let radius-new-cfarm 5 ; try to accumulate non-cacao patch within radius 5, otherwise we'll increment until suitable patches are found
          ; show word "number of non-cacao patches in radius 5, BEFORE while loop, is " count patches in-radius radius-new-cfarm with [cacao-crop = false]
          while [1 > count patches in-radius radius-new-cfarm with [cacao-crop = false and max-resource-here >= 1] ] [ set radius-new-cfarm radius-new-cfarm + 1 ]
          ; show word "number of non-cacao patches in radius 5, AFTER while loop, is " count patches in-radius radius-new-cfarm with [cacao-crop = false]
          move-to one-of patches in-radius radius-new-cfarm with [cacao-crop = false and max-resource-here >= 1]
        ]
        if any? neighbors with [cacao-crop = false and max-resource-here >= 1] [
          let extra-cacao-patches-temp extra-cacao-patches ; setting up a temporary substitute for extra-cacao-patches b/c don't want to permanently change slider just b/c the number is too much for one instance.
          while [extra-cacao-patches-temp > count neighbors with [cacao-crop = false and max-resource-here >= 1] ] [ set extra-cacao-patches-temp extra-cacao-patches-temp - 1 ]
          ;; slider "extra-cacao-patches" determines number of extra neighboring patches made into cacao farms
          ask n-of extra-cacao-patches-temp neighbors with [cacao-crop = false and max-resource-here >= 1] [
            set cacao-crop true
            set owner myself
            show word "accumulator code test2: My owner is " owner
          ]
          ask patch-here [
            set cacao-crop true
            set owner myself
            show word "accumulator code test3: My owner is " owner
          ]
        ]
      show word "accumulator code test4: my number of ownened patches is " patches with [owner = self]
        ]
   
     ]
    set cacao-crops count patches with [ owner = myself ] ;; cacao-crops variable defined by number of patches owned for cacao growing
  show word "cacao-grower-actions test: my number of cacao-crops is " cacao-crops ; interesting, so this is something all highlanders with [cacao-grower = true] will print out.
  ask patches with [ owner = myself ] [
          set pcolor brown ;; color cacao-crops owned brown ;; change this so each grower has patches owned a unique color? Complicated, tho. See http://ccl.northwestern.edu/netlogo/docs/programming.html#colors, and alt method of James Steiner (email).
        ]
    if any? other patches with [ owner = myself ] [ move-to one-of patches with [ owner = myself ]]  ; not quite what I want but close. …I don’t want it to be random, ideally.
    ; It should move to the other patch if there are two, as now, and when I make for accumulation of patches, I’ll want it to go through the list of them, or ideally move to the one with the highest resource? (As with "To turn-towards-resource")
    ; Tried to change this:
; if any? other patches with [ owner = owner-number ] [ move-to one-of patches with [ owner = owner-number ] and max resource-here ]
; or:
; if any? other patches with [ owner = owner-number ] [ move-to one-of patches with [ owner = owner-number ] and max [ resource-here ] ]
 
end


resourceharvest_altered_7_2_22c_(back_to_6_30_myself).nlogo

Unruh Lee

unread,
Jul 3, 2022, 8:25:28 AM7/3/22
to netlogo-users
PS. I'm starting to think this may warrant a new post? It at least seems to be a different kind of issue I'm wrestling with now. 

There must be a simple way to run code for turtles that doesn't iterate it through all of them, no?   I will probably kick myself when this is resolved. 

I thought maybe I'd misunderstood  rnd:weighted-n-of? But changing that to  rnd:weighted-one-of doesn't resolve the problem. 



Unruh Lee

unread,
Jul 3, 2022, 8:37:43 AM7/3/22
to netlogo-users
PPS. I think it was a misunderstanding of  "rnd:weighted-n-of"!  

Changed the whole thing so that in "to go" the procedure is called: 
ask rnd:weighted-n-of accumulators-per-tick highlanders with [ cacao-grower = true ] [wealth] [ cacao-grower-actions ]
And now it works as expected!

Unruh Lee

unread,
Jul 3, 2022, 1:08:05 PM7/3/22
to netlogo-users
Darn it, I spoke too soon. While probably on the right track, this change, too, interferes with the coloring brown of cacao-farm patches, which I had working before this change. Again, completely baffled as to why this is happening. I should probably make a separate post about it? 

James Steiner

unread,
Jul 3, 2022, 1:55:05 PM7/3/22
to Unruh Lee, netlogo-users
This is breaking my heart. I'll take a close look and let you know.

Unruh Lee

unread,
Jul 3, 2022, 2:18:51 PM7/3/22
to James Steiner, netlogo-users
Thanks again, James!

Attaching two more up-to-date versions of the model here. 

The "7-2-22c...." version calls the cacao-grower-actions in "to go" thus: 
ask highlanders with [ cacao-grower = true ] [ cacao-grower-actions ]
That version has the problem of running the commands too much, but the pcolor changes to brown with cacao farm patches is working as expected. 

The "7-3-22..." version instead has this in "to go":
ask rnd:weighted-n-of accumulators-per-tick highlanders with [ cacao-grower = true ] [wealth] [ cacao-grower-actions ]
And that lacks the problem of running commands too much, but then the pcolor changes get wacky. 

It's especially baffling because the latter problem is affecting the pcolor changes done in the "market-actions" procedure as well. You can see this clearly if you set the "accumulators-per-tick" slider to zero. That makes it so the only way to change a patch to have [cacao-crop = true] is through the "market-actions" procedure, where new cacao growers get their start. The "cacao-grower-actions," on the other hand, makes for accumulation of new patches for "highlanders" that are already cacao growers. 


resourceharvest_altered_7_3_22.nlogo
resourceharvest_altered_7_2_22c_(back_to_6_30_myself).nlogo
Reply all
Reply to author
Forward
0 new messages