In my go procedure, I want to check the breed of my turtles. But I cannot find a way to do it simply. I want to execute different code depending upon the breed. How should I do this?
I define breeds as:
breed [late-adopters late-adopter]
and in go
to go
ask turtles [
if is-late-adopter [do something...]
]
end
You just need to check the breed turtle variable against the breed agentset itself. The Bug Hunt Predators model is a good example of this. Here is the relevant code:
to go
; ...
ask turtles [
;; we need invaders and bugs to eat at the same time
;; so one breed doesn't get all the tasty grass before
;; the others get a chance at it.
(ifelse breed = bugs [ bugs-live reproduce-bugs ]
breed = invaders [ invaders-live reproduce-invaders ]
breed = birds [ birds-live reproduce-birds ]
[ ] ; anyone else doesn't do anything
)
]
; ...
end
Related
Whenever we use the "ask" command for all agents of a particular kind or breed, the Netlogo program goes through each agent one by one in random order. What I want is really simple: I would like to access the turtle whose turn it is at that moment.
I can't seem to find an appropriate command for this.
My code for reference purposes is as follows:
to surfer-visits-source
ask surfers [
if ([quality] of one-of [out-link-st-neighbors] of one-of out-link-ss-neighbors) < expected-quality
[
let temp ([who] of out-link-ss-neighbors)
create-link-ss-to one-of sources with [who != temp]
ask links-ss with [end1 = [who] of surfer][
ask links-ss with [[who] of turtle temp] [
die
]
]
]
]
We can use the self command to do this.
I have 8 different breeds in my model. Some of them share similar traits.
Anyway, lets suppose that my breeds are
breed [ humans human ]
breed [ dogs dog ]
breed [ cats cat ]
breed [ horses horse ]
breed [ elephants elephant ]
breed [ mouses mouse ]
breed [ monkeys monkey ]
breed [ birds bird ]
My question is how to ask for example everyone except birds. I don't want to ask each breed individually. I know that when you want to ask every breed than you go with ask turtles.
You will want some combination of turtle-set and member? primitives. For example, let wanted (turtle-set humans horses mouses) will get an agentset named 'wanted' with all the humans, horses and mouses. For your specific example, let wanted turtles with [not member? self birds] will get all the turtles except birds.
Don't forget that turtles have a built-in variable breed (look it up). All you need is ask turtles with [breed != birds]
I'm trying to model families. I would like to set it so that males meet females and form a link that will subsequently allow them to reproduce. I have not been able to figure out or find online how to code links to do this although I think it is quite basic.
I have as breeds males and females and husbands and wives. This code is to be run by males.
to marry
if hunger < 10 [create-link-with one-of females]
ask my-links [set breed wives]
end
This returns a runtime error "you can't see breed to a non-link agentset". I thought this meant that I needed to use some kind of breed-command, e.g.
create-<breed>-link-with
But
create-<wives>-link-with
and
create-<a wife>-link-with
etc all generate error messages.
I have also tried making the link directed, e.g.
create-link-to one-of females
but to no avail.
You're having the turtles ask the links rather than the link-neighbors, I think that's all:
breed [ cats cat ]
to setup
ca
crt 10 [ setxy random-pxcor random-pycor ]
reset-ticks
end
to go
ask one-of turtles [
create-link-with one-of other turtles
ask link-neighbors [
set breed cats
]
]
end
Edit
I think this does what you want:
breed [ males male ]
breed [ husbands husband ]
breed [ females female ]
breed [ wives wife ]
males-own [ mood ]
to setup
ca
create-males 5 [
set color green
setxy abs random-pxcor / 2 random-pycor
set mood "lonely"
]
create-females 5 [
set color white
setxy ( abs random-pxcor ) / -2 random-pycor
]
reset-ticks
end
to go
if any? females [
ask one-of males [
set breed husbands
create-link-with one-of females
ask link-neighbors [
set breed wives
]
]
]
end
However, you may want to reconsider having the turtles switch breeds, and instead give them all a turtles-own boolean variable like married? that you can use as a flag. If you want to do the breed switching, do make sure any variables that you create for related breeds are identical- note that in the example above males have a mood variable but they lose that info when they change breeds to husbands.
I spent all afternoon trying to work out with a part of my code and I don't seem to be getting anywhere. Basically, I'm trying to create a social network on model setup. Each person in the model starts off with a set of people that are nearby to them people-nearby. It is from this set that people choose who to connect with:
create-people population-size
[
set people-nearby turtle-set other people in-radius neighborhood-radius
]
to create-network
let num-links round (average-node-degree * population-size) / 2
while [ count links < num-links and count people with [length sort people-nearby > 0] > 0 ]
[ ask one-of people
[ *... initiate probabilistic link creation process...*
create-unlink-with chosen-friend
Once person A has connected to someone (ie. person B), person B is removed from person A's people-nearby set. I'm having trouble with this portion of the code where the people-nearby set is updated by excluding all nearby people that are members of the unlink-neighbors set (i.e., those to whom person A is already connected - this set including person B):
ifelse count turtle-set people-nearby > 1
[ let nearby-people-not-linked-to-me ( turtle-set people-nearby with [ not member? self [ turtle-set unlink-neighbors ] of myself ] )
set people-nearby nearby-people-not-linked-to-me ]
[ set people-nearby [ ] ]
For some reason this error keeps popping up:
"WITH expected input to be an agentset but got the list [(person 0) (person 1) (person 3) (person 4)] instead." whenever
people-nearby with [ not member? self [ turtle-set unlink-neighbors ] of myself is called.
I looked up so many posts but can't seem to get the form of the argument right so that it stops showing this error.
Can anyone help me fix this please? (Oh and it's my first post so apologies if I haven't set up the issue properly)
When you submit code, try to submit what is needed to recreate your problem- check out the asking help page, and specifically the section on helping others reproduce your problem. As is, I think your problem comes from using turtle-set. That primitive is mostly used to combine agentsets, not to query them. So in your line:
( turtle-set people-nearby with [ not member? self [ turtle-set unlink-neighbors ] of myself ] )
there is an syntax issue related to turtle-set. The error itself is saying that you have not returned an agentset but a list of agents, which behave differently.
If I understand correctly, you want all people to have a variable that contains all people within a radius of themselves: "people-nearby". Then, you want the people to form a link with one of their "neighbor" turtles. Finally, you want the people to update their "people-nearby" variable to exclude the person to whom they just formed a link. Below is some code with comments where I tried to follow those steps- obviously your variables will be different, but it may get you started. Let me know if I need to clarify anything or if I missed a step.
breed [ people person ]
turtles-own [ people-nearby ]
to setup
ca
reset-ticks
create-people 70 [
setxy (random 30 - 15) (random 30 - 15)
]
; do this after all turtles have spawned
ask people [
set people-nearby other people in-radius 3
]
end
to create-links
let num-links 10
;; Create a temporary agentset out of turtles that have people nearby
let turtles-with-neighbors turtles with [ any? people-nearby ]
; ask some number of the temporary agentset:
ask n-of num-links turtles-with-neighbors [
;; This just makes it easy to identify the turtle that causes the link
ask patches in-radius 3 [
set pcolor white
]
; create a link to one of the nearby people
create-link-to one-of people-nearby
; newly set people-nearby to only include turtles in radius
; that are not linked-to from the currently acting turtle
set people-nearby other people in-radius 3 with [ not member? self [ out-link-neighbors ] of myself ]
ask people-nearby [ set size 0.5 ]
]
end
I've been trying to link turtles from BREED1 (still) to turtles from breed2 (mobile) who are on neighbors of BREED1. I want to do so in order to change a variable according the link-length between BREED1 and breed2.
(you can say that BREED1 represent houses and breed2 represents people, I would like to change the fact that the people are "protected" or not, according to the distance that separates them from their house (BREED1 that they are linked to))
I don't know if this is the best way to do it, but here's my code, I know it's not working because the "protected" variable is always false by default.
to protect
ask n-of total-number-BREED1 BREED1
[ if any? breed2-on neighbors
[ create-link-with [who] of breed2-on neighbors]
ask link-neighbors
[ set protected true]
]
I would also like to add a part concerning the link's length
ask link-neighbors
[ ifelse link-length < 2
[set protected true]
[set protected false]]
Thank you for your help !
Try this to create links with the breed2-on the neighboring patches:
ask BREED1
[
if any? breed2-on neighbors [ create-links-with breed2-on neighbors]
ask link-neighbors [ set protected true]
]
and this, which gets the link-length between the breed1 and it's neighbors
ask BREED1
[
ask link-neighbors
[
if [link-length] of link-with myself < 2 [ do something]
]
]
Note: link-length is called from a link's perspective, so you need to get the link that's connecting two things.