alexjamessays
alexjamessays

Reputation: 25

NetLogo: Using global variables with breeds and links

I have a programme that sets up a number of different breeds of turtles. Each breed needs to have a leader turtle and a follower turtle. I have assigned these as global variables as they come up a lot in the code further down.

I need to assign these variables to turtles in the breeds and then create a link from the leader to the follower. There are a lot of conditions in the interface that determine how many and which breeds are created so i cannot assign by turtle number.

I am receiving an error (not all of the time) 'turtle cannot link with itself' which i presume occurs when they overwrite the first set command and assign the same turtle to the two variables. Does anybody know a condition i can put in that will allow it to set up everytime without the error. ( I have tried if statements, is-turtle?, one-of other, other)

breed [flinks flink] ;; linked turtles that will turn away from sources

globals [ 
flink-leader
flink-followers]

to set-up
  clear-all
  setup-turtles
  reset-ticks
end

to setup-turtles
  create-flinks 2 [
  set flink-leader one-of flinks
  set flink-followers one-of other flinks
  ask flink-followers [create-link-with flink-leader]
  ask flink-followers [set color pink]
  ask flink-leader [
      setxy 10 4]
   ask flink-followers [
      setxy 19.5 4]
 ]
end

to go 
  fd 1
end 

Upvotes: 1

Views: 1176

Answers (1)

Nicolas Payette
Nicolas Payette

Reputation: 14972

There would be many different ways to approach this. Here is one that doesn't stray too far from the code you have provided:

to setup-turtles
  create-flinks 2
  set flink-leader one-of flinks
  ask flink-leader [
    set flink-followers one-of other flinks
    setxy 10 4
  ]  
  ask flink-followers [
    create-link-with flink-leader
    setxy 19.5 4
    set color pink
  ]
end

Note that your intuition about using other to make sure that the follower(s) is/are different from the leader was correct.

To understand what was going on, you need to grasp the notion of "context" in NetLogo. Some primitives, like ask, of and create-turtles, are "context switching": one of their argument is a code block (the part between [ and ]) that runs in the context of a particular turtle. Other primitives depend on the context in which the code is running: the primitive named other, for example, will report all the agents from a given agentset, except the one in the context of which the block is running.

In your version, you wrapped most of the code inside a code block provided for create-flinks. That meant that the code block was run once for each turtle that was created. So your calls to set flink-leader, set flink-followers and so on were all run twice, each time in a different turtle context. Can you see how that was messing things up?

Keeping track of the different context in NetLogo can be challenging at first (the frequent confusion between self/myself being a case in point), but once you get it, it should become easy and natural.


One last point as an addendum. You say:

i cannot assign by turtle number

Good! Never¹ assign anything by turtle number! It leads to brittle, error prone, more complex, less general, unnetlogoish code. If you think you need to use turtle numbers anywhere in your code, come ask another question here. Someone will most likely suggest a better way to do it.

¹ Well, almost never.

Upvotes: 2

Related Questions