Have I got this correct please?
If I write:
ask turtles
[go_forward
go_backward]
is it correct that a random turtle will move forward then move backward, and then a second random turtle will do the same, and so on? As opposed to:
ask turtles [go_forward]
ask turtles [go_backward]
which will get all turtles in a random order to move forward, and then all turtles in a (different) random order to move backward.
That is correct. There's a very similar example right at the end of the section on ask in the NetLogo Programming Guide: http://ccl.northwestern.edu/netlogo/docs/programming.html#ask
See also Ask Ordering Example, in the Code Examples section of NetLogo's Models Library.
Related
I am trying to build a model in which turtles decide to change colour depending on their environment in a network.
The approach would be to "check" the colour of the surrounding turtles and then set an if statement for the turtle in question to switch colour (there will only be 2 colours).
Specifically I would like to know how can a turtle "see" or check other turtles' colour (or other properties).
If possible I would also like to create a slider for "how many links away" can turtles see their neighbouring turtles' (or neighbours of neighbours, etc) colour.
I am new to both Netlogo and Stackoverflow, so please let me know if I should make any modifications to my model and/or question.
Thanks!
Welcome to Stack Overflow! Typically you'll want to stick to a single question per post, both for simplicity and for the benefit of future users with similar questions. As well, in cases where its applicable you should try to include some code to show what you've tried so far, as well as any setup necessary- you want to make a minimal, complete, and verifiable example. In this case, I think you're okay since your questions are clear and well explained, but if you have more complex questions in the future you will be more likely to get useful answers by following those guidelines.
For your first question, it looks like you want the of primitive- check out the dictionary entry for details. of can be used in a few ways, including allowing agents to check the value of a variable (such as color) of another agent. Check out this example code:
to setup
ca
reset-ticks
crt 10 [
setxy random 30 - 15 random 30 - 15
create-link-with one-of other turtles
]
end
to go
ask turtles [
set color [color] of one-of link-neighbors
]
end
Every time the go procedure is called, one of the turtles changes its color to the color of one of its link-neighbors. If you run it long enough, all connected turtles should end up with the same color.
For your second question, I suggest you check out the Nw extension, which is an extension built to deal more easily with Netlogo networks. Specifically, have a look at nw:turtles-in-radius, which should work with your slider approach. To get it working, include the extension using
extensions [ nw ]
at the start of your code. Then, assuming the same setup as above, you can play around with something like
to network-radius
ask one-of turtles [
set color red
ask other nw:turtles-in-radius 2 [
set color white
]
]
end
When you call the network-radius procedure above, you should see one turtle turn red, and any turtles within 2 links of that turtle turn white. To switch to a slider, just swap the "2" out for your slider variable. Hope that helps!
I created turtles called "birds" that shall move on a specific route. The route is made out of links between turtles I called "rasts". As I couldn't find a way to make the turtles move from the first rast to the second, third, fourth and fifth, I changed the rasts an created them as patches.
So, now I have patches in red (rests).
How do I get the birds moving to exactly these patches and, when they are at the patch, how do I make them go to the next one?
I have no code at the moment, because I always hope to find the fault in my first model (see my other questions).
Is there anybody who knows how to solve my problem?
the move-to command moves your turtle to any other turtle or patch you specify. You can also use the face and forward commands to gradually move along a route (see the 'Move Towards Target' code example in the Models Library that comes with NetLogo)
I want turtles to be able to flow along the paths I have drawn out for them. To do this I think it might be a reasonable idea to have a list in the u.i that allows the user to select a preordained direction of movement for that patch so the turtles know how to flow along the network. Has anyone else produced a model with this feature? If so would it be possible to give an example of the relevant source code for implementation into my own project?
I did something a while back where each patch had a direction variable that turtles set their heading to when on the patch.
Something like
patches-own[dir]
to go
ask turtles [set heading dir fd .1]
end
I want to add an agenset of turtles to the variable TurtlesICanSee of a certain turtle that depends on that turtles properties. For instance, in one application I want to add only the turtle itself to TurtlesICanSee, in another application I want to add the two turtles (if there are any) with adjacent who-numbers (the turtle's own who-number + or - 1).
If I can figure out the first application by using who-numbers I think I can extend that to second application. However, I cannot figure out the first.
I tried
ask turtles [
set TheTurtlesICanSee turtles with [who = ([who] of self)]
]
but this fills the TheTurtlesICanSee of each turtle with every turtle.
I think I understand why; NetLogo thinks that I want every turtle x that has the same who-number as itself (x), i.e. every turtle. But I don't. For every turtle x I want every turtle y that has the same who-number as x.
Can anyone help me with this? Note that the solution that I need to the first application is one that can be generalized to the second. So not any way of adding a turtle to one of its own variables will do. I need a form of self-reference involving who (or a good argument against doing it this way I guess, but preferably the former).
Your code needs only a slight alteration to work, as follows:
ask turtles [ set TheTurtlesICanSee turtles with [who = [who] of myself] ]
Note the substitution of myself for self; http://ccl.northwestern.edu/netlogo/docs/dictionary.html#myself has an explanation of the difference.
But actually there's no need to involve who numbers. It's almost never necessary to use who numbers in NetLogo; there's almost always a simpler, more direct solution. A simpler solution is:
ask turtles [ set TheTurtlesICanSee turtles with [self = myself] ]
But actually it isn't necessary to use with at all. We can use turtle-set to build the desired agentset directly:
ask turtles [ set TheTurtlesICanSee (turtle-set self) ]
This is the solution I would recommend, for clarity and brevity, but also because it will run faster, since it doesn't involve iterating over the set of all turtles, as the with-based solutions do.
In my simulation each turtle has a my-home variable which is the patch agent family lives in, so agents with same Family-ID have same my-home until one of agents moves out or family grows to more than 7 agents.
when an agent wants to move out , I have to check if there is any patch nearby which is not another's agent my-home, what I have done is to store all my-homes in a list and check if any selected possible next home is not a member of this list, but I believe there should be better way to do this:
let all-homes [my-home] of agents with [belongs_to = BS]
set my-home min-one-of patches with [not member? self all-homes and label_ = BS][distance m]
m is current home address
min-one-of patches with ... assesses every patch in the entire world before picking a winner. That's going to be slow. I'd suggest searching nearby patches first, then farther patches, and so forth. Most of the time the turtle will find a new home after only a very brief search, so you'll have replaced code that's O(n) in the number of patches with code that's O(1)-ish. That should fix the main performance problem with this code.
The simplest such search routine I can think of is for the turtle to simply head in a random direction and keep moving fd 1 until it lands on a free patch. But if you want to do something more rigorous that always results in finding the closest possible new home, you could do that too; you'll just have more code to write.
Building the all-homes list is probably only a secondary performance problem here, but it's fixable too. The simplest fix I can think of is to add:
patches-own [home?]
initialize it with ask patches [ set home? false ], and then make sure that whenever a turtle adopts a patch as its home, it does ask my-home [ set home? true ]. Now you can replace member? self all-homes with simply home?. After all, you don't really need to know what all of the home patches are; you only need to know whether some particular patch is a home patch.