I would like to implement certain rules into relationship between my turtles and my patches. My Patches variables are:
My turtles states are: yellow (move) -> orange (stay) -> red (infest) Patches states are: green (n_min< then number of orange turtles on one patch) pink (number of orange turtles is > n_min and < n_max) brown (no turtles)
My problem is how can I avoid to have more then n_max turtles on one patch if they are all moving at the same time and thus are targeted to same patch? How can I include the condition that "if you see that there are some turtles of color orange/red, just keep moving to find another patch? " Also, if my patch is already pink, and n_min != n_max to ask turtles to directly change its color to red?
my not working example:
globals [
available-patch
]
patches-own [
nmax ; maximum nuber of turtles per patch, and change color
nmin ; minimum number of turtles to change patch color
n.yellow ; how many turtles are on the patch with yellow
n.orange ; how many orange (staying) turtles are on 1 patch?
]
to setup
clear-all
reset-ticks
setup-patches
setup-turtles
end
to setup-patches
ask n-of n_patches patches [
set pcolor green
set nmin n_min ; how many orange turtles can be there to set the patch to pink?
set nmax n_max ; max number of orange beetles to turn the patch to brown
]
end
to setup-turtles
crt n_turtles [
set color yellow
]
end
to go
tick
ask turtles with [color = yellow ] [ ; move only yellow turtles
move-turtles
]
ask patches [ ; if n.orange = nmin, turn all turtles to red and turn patch to pink
set n.orange count turtles-here with [color = orange]
]
end
to move-turtles
; if color = yellow ;and n.yellow < nmin
;ifelse count other turtles-on
; move-to one-of patches with [pcolor = green and n.orange <= nmin]
; if [n.orange <= nmin] of patch-here [
; set color orange ; not to move anymore. However, the n.orange should be always less then nmin !!
; ]
set available-patch patches with [pcolor = green and count turtles-here with [color = orange] < 2] ; agentset
ifelse (count other turtles-on available-patch <= nmin) ; how to change the code for nmin here?
[ move-to one-of available-patch
set color orange
ask patch-here [
set n.orange count turtles-here with [color = orange]
]
]
[ fd 2 ]
end
Result:
one turtle on the green patch has changed its color to orange, but I wanted 2 turtles (nmin) to find green patch and become orange. Also, the yellow turtles move next time steps just by [fd 2], the "ifelse" condition is not re-run each time step.
This code should meet my needs - keep only certain number of turtles per patch, and depending on number of turtles of certain color (nmin, nmax) per patch turn patch to pink and to brown.
patches-own [
nmax ; maximum nuber of turtles per patch, and change color
nmin ; minimum number of turtles to change patch color
n.orange ; how many orange (staying) turtles are on 1 patch?
n.red ; how mony infesting turtles are on the patch??
]
to setup
clear-all
setup-patches
setup-turtles
reset-ticks
end
to setup-patches
ask n-of n_patches patches with [pcolor = black][
set pcolor green
set nmin n_min ; how many orange turtles can be there to set the patch to pink?
set nmax n_max ; max number of orange beetles to turn the patch to brown
]
end
to setup-turtles
crt n_turtles [
set color yellow
]
end
to go
; add turtles and patches by time steps, to see the effect
if ticks mod 5 = 0 [
ask n-of 1 patches with [pcolor = black][
set pcolor green
set nmin n_min ; how many orange turtles can be there to set the patch to pink?
set nmax n_max ; max number of orange beetles to turn the patch to brown
]
]
if ticks mod 3 = 0 [
crt 1 [
set color yellow
]
]
ask turtles with [color = yellow ] [ ; move only yellow turtles
move-turtles
]
tick
end
to move-turtles
; specify the target
let available-patches (patches with [(pcolor = pink and count turtles-here < nmax) or ;
(pcolor = green and count turtles-here < nmin)] )
; select only one patch, nmin is related to "self"
ifelse any? available-patches ; don't work if there is <= nmin, then there are nmin + 1
[ move-to one-of available-patches
if pcolor = green [
set color orange
set n.orange (n.orange + 1)
infest.patch ; if there is enough turtles, turn patch to pink, turn turtles to red
]
if pcolor = pink [
set color red
set n.red (count turtles-here with [color = red])
kill.patch
]
]
[ fd 1 ]
end
to infest.patch ; change color of patch only if there is n.orange = nmin of this specific patch
if n.orange = nmin [
set pcolor pink ; patch
ask turtles-here with [color = orange] [
set color red ]; turtles
]
end
to kill.patch
if n.red = nmax [ ; turn patch brown when red turteles on this patch are = nmax
set pcolor brown
; ask turtles-here with [color = red] [
; die ]
]
end