Reputation: 13
I am very new to NetLogo and now I try to understand the logic behind NetLogo. I am building my first model and can not figure out how the procedures have to be ordered to do what I would like them to. What my model should do:
What the model does:
I guess that it is a real beginner-mistake… Could you please explain to me how to get this right?
to go
move-turtles
tick
end
to move-turtles
ask turtles
[ifelse insolation <= max [insolation] of neighbors
[continue]
[bask]
pen-down
]
end
to continue ;; a turtle procedure
ifelse random-float 1.0 < 0.7
[uphill insolation]
[move-to one-of neighbors]
end
to bask ;; a turtle procedure
set count-down count-down - 1
set label count-down
if count-down = 0
[
forage
set label ""
]
end
to forage ;; turtle procedure
set heading (random-normal 180 30)
fd random-normal 3 2
end
Upvotes: 1
Views: 183
Reputation: 17678
If I understand your problem correctly, you only want them to do the uphill / bask once per day but they do it repeatedly. Imagine a turtle has done their basking, the forage procedure sends them in a random direction once. Now, the next tick, they are faced with:
ifelse insolation <= max [insolation] of neighbors
[ continue ]
[ bask ]
So they look around and compare the insolation values and then select the 'continue' or 'bask' procedure depending on the comparison. If they get the continue procedure, they move to one of the neighbouring patches, either to the one with the largest insolation value or randomly. If they get the bask procedure, nothing happens except that the label gets turned on. This is because the value of count-down is 0 from the last time they basked, so it is -1 by the time the code checks whether the value is 0.
Once nothing happens, they are faced with the same choice next tick and will have the same outcome. So once the turtle is at the insolation peak, it will stay there indefinitely.
If you want something to only occur once, the easiest thing to do is to add a variable that remembers whether it has happened yet. NetLogo convention has true/false (yes/no) variables with a question mark at the end. So you can do something like (assuming you have added 'bask-over?' to the turtles-own
and initialised it as false):
to bask ;; a turtle procedure
set count-down count-down - 1
set label count-down
if count-down = 0
[ forage
set label ""
set bask-over? true
]
end
And you then bring that variable into the test for whether to continue or bask:
to move-turtles
ask turtles
[ ifelse bask-over? or insolation <= max [insolation] of neighbors
[ continue ]
[ bask ]
pen-down
]
end
Note that if bask-over?
is the same as if bask-over? = true
. Similarly you can use if not bask-over?
instead of if bask-over? = false
.
Upvotes: 2