Two turtles running 'similar' code at the same time - netlogo

Ive got this strange issue with my code going on.
In my model i have female (set female true) and males (set male true).
Upon a particular trigger each will 'become' a disperser (set disperser true).
Dispersers and non dispersers have very different behaviour.
I have tried solving this with different breeds representing the two classes but this has also not worked.
The problem is that one of the turtles e.g. male, will operate accordingly and set disperser to 'false' upon meeting the opposite turtle. However the other will not, and will continue with disperser set 'true'
Im sure it is because once one of the turtles operates the code, it is no longer a 'disperser' and therefore no longer applys to the search criteria of the later turtle but every work around ive tried has resulted in the same problem or nobody errors.
to search-for partner
if male = true [ set potential-mates other turtles with [female = true
and disperser = true]
if female = true [ set potential-mates other turtles with [male = true
and disperser = true]
let chosen-mate min-one-of potential-mates [distance myself]
if any? potential-mates [
set heading towards chosen-mate]
if male = true [ if any? other turtles-here with [female = true and
disperser = true] [set disperser false]
if female = true [ if any? other turtles-here with [male = true and
disperser = true] [set disperser false]
end

I'm not entirely convinced I know what you want to do, but I think you are asking to set disperser to false for both turtles. In which case you want code that looks something like this (not tested):
if male
[ let my-partner one-of other turtles-here with [female and disperser ]
if my-partner != nobody
[ set disperser false
ask partner [ set disperser false ]
]
]
You should probably also consider separating the 'search for partner' code from the 'found partner' code. Also, you may be better off having them check if they have a partner, then search for partner by setting heading to closest and moving forward. At the moment they look around but don't go anywhere.

Related

Linking turtles to another turtle with highest value in NetLogo. Limit the number of links

I am a beginner with NetLogo and I am trying to ask some turtles (students from different social classes) to link to other turtles (schools). What I would like is for the working class students to look for the school with the highest achievement which is at the same not expensive and has not reached the max number of links allowed. If the desired school has reached the max number of links allowed I want the student to look for the next school with the highest achievement which has not reached the max number of links allowed and so on.
This is the code. I get the following message "ANY? expected input to be an agentset but got the turtle (school 1) instead."
breed [schools school]
breed [upperclass upperclass-student]
breed [workingclass workingclass-student]
upperclass-own [achievement enrolled? target]
workingclass-own [achievement enrolled? target]
schools-own [schoolachievement expensive? ]
to setup
clear-all
set-default-shape schools "house"
set-default-shape upperclass "person"
set-default-shape workingclass "person"
ask patches [ set pcolor 8 ]
create-schools num-of-schools [ setxy random-xcor random-ycor set schoolachievement random-normal 5 1
set expensive? one-of [ true false ] ]
create-upperclass num-of-upperclass [ set color white setxy random-xcor random-ycor set achievement
random-normal 5 1 ] ;Students from upper class have higher achievement
create-workingclass num-of-workingclass [ set color red setxy random-xcor random-ycor set achievement
random-normal 4 1 ]
end
to go
ask workingclass [
choose-school ]
end
to choose-school
if breed = workingclass [
set target one-of schools with-max [ schoolachievement ] with [ expensive? = false ] ]
if any? target with [ count link-neighbors < max-link-count ] [
create-link-with target ]
set enrolled? TRUE
end
Your problem is the difference between an agent and an agentset, which is a somewhat subtle problem. The with-max returns an agentset - a set of agents (in this case turtles). That agentset can have 0 members, 1 member, 2+ members but is a set even if it is empty. However, the one-of selects one agent from the agentset and returns it as an agent, not an agentset. That is, NetLogo knows anything that is returned by one-of must be exactly one agent. At this point, primitives that are for agentsets (like any?) will throw an error unless they can also be used on individual agents.
So, back to your code. I like the readability of checking whether there are viable schools and then selecting one, which is what I think you meant to do. That would be:
to choose-school
if breed = workingclass
[ set targets schools with-max [ schoolachievement ] with [ expensive? = false ]
set candidates targets with [ count link-neighbors < max-link-count ]
if any? candidates
[ create-link-with one-of candidates
set enrolled? TRUE
]
]
end
Note that I also changed to targets instead of target, which is one way to keep track of whether something is an agent or an agentset.
The other way you could do this and keep it as an agent is:
to choose-school
if breed = workingclass [
set target one-of schools with-max [ schoolachievement ] with [ expensive? = false ] ]
if target != nobody and [count link-neighbors] of target < max-link-count [
create-link-with target ]
set enrolled? TRUE
end
So you can use nobody instead of any? but you can't also use with in that line because the with is really a filter on a set.
I also think you have a bracketing issue - I assume you want set enrolled? TRUE inside the brackets. I left it in the second fix, but changed in the first error (as well as changing bracket position convention to make the code block structure more visible)

Netlogo WITH expected a true/false value but got 0 instead

I am fairly new to Netlogo. I am trying to make my turtles act differently depending on their variables, however I get the runtime error WITH expected a true/false value but got 0 instead.
I already initialize a couple of turtles on a different procedure so there should not be any empty agentsets of turtles with the requested variables.
to setup-figures
ask n-of 2 citizens
[ get-panicked ]
ask n-of 2 citizens
[ get-alerted ]
ask n-of 2 citizens
[ calm-down ]
end
to flee
ask citizens with [ panicked? ] [
fd 1.1
]
ask citizens with [ alerted? ] [
fd 0.6
]
ask citizens with [ calm? ] [
fd 0.5
]
if [pcolor] of patch-ahead 1 = grey
[collision-check]
end
to get-panicked
set panicked? true
set color red
set mood 19
end
to get-alerted
set alerted? true
set color yellow
set mood 35
end
to calm-down
set calm? true
set color green
set mood 66
end
The ask primitive will look at all citizens to find those with (say) alerted? equals true. But if you only initialize some citizens, those not initialized will have alerted? set to its default value of zero. Zero and false are not the same in NetLogo, so ask chokes on those citizens whose value of alerted? is zero, i.e., on those that have not be initialized. At the beginning of your setup, you can put
ask citizens [
set panicked? false
set alerted? false
set calm? false
]
Then you can ask n-of your citizens to become panicked, etc., as you do in your code.

Netlogo if statement with myself and other

I'm fairly new to Netlogo and struggling with how to set up a somewhat complicated if statement. The statement is for turtles and the condition is that other turtles live in the same region and have a house.
I've tried the iterations of the following, but have not yet been successful:
if (one-of other turtles with [region = [region] of myself and house? = True]) []
if (other turtles with [region = [region] of myself and house? = True]) []
Thank you for any insights!
If you need to insert code in a question, check out the "Code Sample" button in the toolbar. You can highlight your code and click the button- super handy.
Your second try is extremely close. The quick fix is to add the any? primitive in order to tell Netlogo that you want to evaluate the agentset "other turtles" in this case. As it was, you weren't actually evaluating anything with if- kind of like saying "If the turtles in my region who have a house," as opposed to "If there are any turtles in my region who have a house."
to check-region
ask one-of turtles [
if any? other turtles with [ region = [region] of myself and house? = true ] [
set color white
]
]
end
If you need to evaluate more specific numbers, you can use something like count to set a threshold - for example:
to check-region-count
ask one-of turtles [
if count other turtles with [ region = [region] of myself and house? = true ] > 3 [
set color white
]
]
end

to check all 8-neighboring patches with turtles on it? NetLogo

I need to check if all the neighboring patches have turtles on them. The code I tried gave the error of "expected reporter" with set primitive.
My code is
if all? other (people-on neighbors) with [fear?] [set unable-move? true ]
people is the breed, fear is an attribute variable (people-own variable) and unable-move? is a global variable.
At some point I want to stop the person(turtle) if all the 8-patches including the center patch have a person(turtle) on it and are in fear.
The all? primitive requires you to give:
an agentset for which you want to test a condition (in your case, neighbors).
a reporter for testing that condition on each agent (in your case, the neighboring patches): any? people-here with [ fear? ].
All together:
if all? neighbors [ any? people-here with [ fear? ] ] [
set unable-move? true
]
That's all there is to it!
This should work as well:
if (not any? neighbors with [count people-here with [fear?] = 0])
[ set unable-move? true ]
something like :
if sum [count people-here with [fear?]] of neighbors >= 8 [
set unable-move? true
]
I hope it works!

Netlogo one-to-one relation

I have a netlogo problem for which I can't seem to find a solution, but yet it feels very basic.
I have two types of breeds:
breed [individuals individual]
breed [cars car]
I want to create a link from one individual to one car. So, its a one-one relation. I use this code to do that:
to setup-individuals
create-individuals individuals-number [
set ID 2
set shape "person"
set color yellow
setxy random-xcor random-ycor
set activity ""
set activity_time 0
let rand random 2
ifelse rand = 0
[
set owns-car false
]
[
set owns-car true
create-link-to one-of cars ;; here is the issue
]
]
end
The problem is that if i use "create-link-to one-of cars" there are more than one individuals linked to one car, but I want each individual to have a distinct car. When trying the following command: "create-link-to one-of cars with [my-in-links = 0]" its giving me the following ERROR: "CREATE-LINK-TO expected input to be a turtle but got NOBODY instead." I tried many variations of this command, but its not working.
Your attempted solution of create-link-to one-of cars with [my-in-links = 0] is on the correct path. However, if you look at the NetLogo dictionary, you will see that my-in-links returns an agentset, not an integer giving the number of members of that agentset. So you need to compare to empty rather than compare to the number 0.
This is the code that is syntactically closest to what you have: create-link-to one-of cars with [count my-in-links = 0].
What you really want though is something more like create-link-to one-of cars with [not any? my-in-links]