Every click I want a specific percentage of turtles to die (i.e. 50%). Currently I am using the code:
if random 100 < 50 [die]
Whilst this works, it is not consistent, eventually, by pure chance, all the turtles will die using this method.
Any help appreciated, thanks!
ask n-of (count turtles / 2) turtles [ die ] will kill exactly 50% of the turtles. (If the number of turtles is odd, the extra turtle is spared.)
Related
I sprouted my turtles over the patches and in the 'go' I want each turtle to calculate if another turtle is too close (based on a certain threshold of X meters/patches). If another turtle is too close, i want the turtle to become 'dissatisfied'.
Movements of the turtles are not required.
What is the best way to do this? The only piece of code for the go procedure I have so far is as follows:
to go
ask n-of initial-number-tourists (patches with [ lagoon_proximity = 1])
[
sprout 1 [
set color black
set size 10
]
]
tick
end
Kind regards!
Your code is creating more turtles and doesn't have anything about checking distances so it is not clear how it is related to the problem you are trying to solve. However, the following code measure the distance to the nearest turtle and prints a message if that is less than 5.
ask turtles
[ let nearest min-one-of turtles [distance myself]
if distance nearest < 5 [ show "I feel crowded" ]
]
hope you can help me out! I have a NetLogo question about the following code:
breed [tourists tourist]
turtles-own [satisfaction]
to setup
clear-all
reset-ticks
end
to go
tick
ask n-of initial-number-tourists patches
[
sprout 1 [
set color white
set size 1
]
]
ask turtles
[ let nearest min-one-of turtles [distance myself]
if-else distance nearest < 0.0000001 [ set satisfaction 0 ]
[ set satisfaction 1 ]
]
ask turtles with [satisfaction = 0] [die]
end
The intention is to sprout "initial-number-tourists" at the start of each tick. Then, they calculate their 'satisfaction' based on the if there are turtles close and let the turtles that have a satisfaction of 0 die. Then, the turtles that remain (that are satisfied) will be sprouted again and their satisfaction will be calculated again.
The code is working, however, with unexpected outcomes. What happens is that the turtles are all sprouted, and they all die each tick. The next tick; they are sprouted again and all die again. Even if i set the distance threshold really low like i did in the code I provided.
Hopefully you can help me out!! Kind regards
The problem you are encountering is that the nearest turtle to each turtle is itself! Thus the distance to nearest is always zero and satisfaction will be set to zero for every turtle. What you want is the closest among the other turtles,
let nearest min-one-of other turtles [distance myself]
(Your distance threshold will mean that all turtles will have satisfaction of 1, but I assume that is what you wanted to accomplish in your testing. Since turtles are sprouted at the centers of the patches, a threshold of < 1.0 would accomplish the same thing.)
Minor point: the convention is to put tick at the end, not the beginning of the go procedure.
If i add if to my go command i get the error message
you cant use tick in a turtle context because tick is observer only
here is my go commands. search eat go-home and den are all defined in my commands.
energy is also defined as a global variable that turtles own
to go
if ticks = day-length [set day day + 1 create-next-day]
ask adults [search eat]
if energy < 20000 [ask adults [go-home den]]
tick
end
if i take out the line
if energy < 20000 [ask adults [go-home den]]
it runs perfectly, but i need that line or an equivalent. please help
Commands
;;-------------------------------------------------------------;;
;;------------------- ADULTS COMMANDS--------------------------;;
;;-------------------------------------------------------------;;
;; Need to add a private variable (wolves own) for wolves [state] and then need to code 4 states 1. Den 2. Search 3. Eat 4. Return
;; need to code all 4 states
;; Need to correctly allocate energy and the state of decline
To den ;when wolf is full
set energy energy - .04
end
to search ;when wolf is hungry
set energy energy - .07
fd v-wolf
if random 600 = 1 ;; frequency of turn
[ ifelse random 2 = 0 ;; 50:50 chance of left or right
[ rt 15 ] ;; could add some variation to this with random-normal 45 5
[ lt 15 ]] ;; so that it samples from a dist with mean 45 SD 5
;; check if it can see a prey/food item
;; here i think we probably pick one of several possible prey
;; that are detectable randomly using the one-of command.
;; We should probably select the nearest one instead ** The turtles are getting
;; caught between two prey species and dying because they cant choose which one **
if any? prey in-radius smell [set heading towards one-of prey in-radius smell]
if energy < 0 [die]
end
To eat ;to kill prey and eat it
let kill one-of prey-here in-radius smell
;need to code in a variable for success too
if kill != nobody
[ask kill [ die ]
set energy energy + 10000]
end
to go-home ;to head home after they've eaten and den until they need to feed again
if energy > 30000 [set target-patch min-one-of (patches with [pcolor = white]) [distance myself]]
face target-patch
fd v-wolf
set energy energy - 1
end
if energy < 20000 [ask adults [go-home den]] will be a problem in go if energy is (as it appears) a turtle variable. This will make the context of the procedure a turtle context, not an observer context.
Edit:
For example, if energy is a turtle variable, perhaps you meant
ask adults [if (energy < 20000) [go-home den]]
First, you need to build your code much more gradually. You have multiple parts of your code that don't work and that you don't understand. Try adding the smallest amount you can and make sure that works before adding anything else. You have three different questions at the moment, with errors in different parts of your code.
On the context issue in Alan's answer, think about it this way: the variable 'energy' belongs to turtles. This means that if you have 10 turtles, you have 10 variables named 'energy', one for each turtle. Which one are you checking whether it is <20000?
What you probably want is to check it for EACH turtle individually and get the turtle to do the required action if it passes the test. So it must be inside ask turtles [], and that changes from the observer to the turtle context (what model entity is doing the thing).
to go
if ticks = day-length
[ set day day + 1
create-next-day
]
ask adults
[ search
eat
if energy < 20000
[ go-home
den
]
]
tick
end
I have also cleaned up your formatting. This is not a requirement, NetLogo is happy to deal with spaces wherever you put them. However, as your code gets longer and more complicated, it will be much easier for you to debug if you follow some basic practices (1) each call to a procedure, each command etc on a separate line (2) bracket [] and indent so that you can see the code block that the brackets enclose.
Is there a way to spawn turtles during simulation even if they died. In my simulation fish are eating plankton, so if they encounter plankton the plankton dies/gets eaten. However, when a fish can't eat plankton anymore it will die because it doesn't get energy from plankton anymore by eating it. So when all the fish have died the plankton should come back; due to migration etc. and grow immensively. I am not sure how to implement this? The create function doesn't work here, only in the setup.
to plankton-reproduce
if random-float 100 < reproduce-plankton [
set energy (energy / 2)
hatch 1 [setxy random-xcor random-ycor]
]
if count plankton < 10 [
create-plankton 20
setxy random-xcor random-ycor
]
error: you can't use create-plankton in a turtle context, because create-plankton is observer only
I think I may understand the question.
to to have a turtle create turtles use HATCH. Your code would work (if I understand it) if you used
hatch-plankton 20
instead of
create-plankton 20
Did I get it right? Turtles hatch , patches spawn and observer creates.
the turtles hatched will be identical to the hatching turtles and will all be in a lump where hatch was called. Assuming that you do not want that.
use
hatch-plankton 20 [setxy random-xcor random-ycor]
I have incorporated this in the code, but when the count of plankton is zero, there will be no plankton respawned, this is because all plankton is dead and cannot be hatched. Do you know another way to spawn plankton or respawn turtles in general during a simulation even if they die?
Beneath the code to reproduce plankton:
to plankton-reproduce
while [count plankton != 0 and count plankton < 3000]
[ if random-float 100 < reproduce-plankton
[set energy (energy / 2)
hatch-plankton 1 [setxy random-xcor random-ycor]]]
if count plankton = 0
[set energy 1
hatch-plankton 20 [setxy random-xcor random-ycor]]
end
I've been trying to write a model where turtles create links with a certain number of other turtles, and for those turtles to create links with the link-neighbors of the turtle that linked to it. Right now, I can get turtles to create links with other turtles, but they don't share the same link-neighbors. I want to end up with little sub-groups of turtles of a certain group size. However, at the moment I can only tell turtles to create a certain number of links, but they don't end up in sub-groups because their link-neighbors don't necessarily share the same link-neighbors. I thought I could ask each turtle to ask their link-neighbors to create-link-with [link-neighbors] of myself. I think this would work, except I get an error saying a turtle can't link with itself. I've tried to change the code so it says to a turtle ask link-neighbors [create-link-with [link-neighbors] of myself with [who != self]], but this doesn't work either.
Here is some of my code:
;group size is 1 + (count link-neighbors)
;preferred-size is a slider, used to alter what group size I want turtles to be in
ask turtles
[if (preferred-size > group-size) and (any? other turtles in-radius 1 with [preferred-size > group-size])
[create-link-with one-of other turtles in-radius 1 with [preferred-size > group-size]
ask link-neighbors
[create-links-with [link-neighbors] of myself]
]
Also, is there a term like link-neighbors but referring to all the turtles on a string of connections?
Any help would be greatly appreciated!
You were very close! All you need is other:
create-links-with other [ link-neighbors ] of myself
You cannot compare who to self: who is a number and self is a turtle. And in the context of with [ who != self ]], they would always be variables of the same turtle. In any case, it's usually better to avoid dealing with who numbers anyway: there's almost always a better way to do things.
is there a term like link-neighbors but referring to all the turtles on a string of connections?
I'm not entirely sure that's what you mean, but maybe nw:turtles-on-path-to? Or perhaps you will find some other useful thing in the nw extension.