Bug Hunt Scurry
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
VERSION
$Id: Bug Hunt Scurry.nlogo 37529 2008-01-03 20:38:02Z craig $
WHAT IS IT?
A natural selection model that shows the result of two competing forces on natural selection of the speed of prey.
One force is that predators that chase prey, tend to catch slower moving prey more often, thereby selecting for prey that are faster over many generations of offspring.
Another force is that predators who wait for their prey without moving, tend to catch prey that are moving faster more often, thereby selecting for prey that are slower over many generations of offspring.
By also adjusting whether bugs try to avoid the predator and the predictability of their motion, a different one of these competing forces will tend to dominate the selective pressure on the population.
HOW IT WORKS
You assume the role of a predator amongst a population of bugs. To begin your pursuit of bugs as a predator, press SETUP to create a population of bugs, determined by the six times the NUMBER-BUGS-EACH-SPEED slider. These bugs that are created are randomly distributed around the graphics window. Each of these bugs may have one of six speeds assigned to it, at which it will always travel when the model is running.
When you press GO the bugs begin to move at their designated speeds. As they move around, try to eat as many bugs as fast as you can by clicking on them in the graphics window. Alternatively, you may hold the mouse button down and move the mouse pointer over the bugs in the graphics window.
The six different speeds that a bug might move at are distributed amongst six different sub-populations of the bugs. These speeds are genetically inherited. With each bug you eat, a new bug is randomly chosen from the population to reproduce one offspring. This bug's offspring is an exact duplicate of the parent (in terms of its speed, orientation, and location). The creation of this new offspring keeps the overall number population of the bugs on the screen constant.
Initially there are equal numbers of each sub-population of bug (e.g. ten bugs at each of the 6 speeds). Overtime, however, as you eat bugs, the distribution of the bugs will change as shown in the "frequency of bugs" histogram and the "number of bugs vs. time" graph. In the histogram, you might see the distribution shift to the left (showing that more slow bugs are surviving) or to the right (showing that more fast bugs are surviving). Sometimes one sub-population of a single speed of bug will be exterminated. At this point, no other bugs of this speed can be created in the population.
Bugs will avoid the predator (your mouse pointer in the graphics window) if the DETECTS-PREDATOR-AT slider is greater than zero. Bugs will also diverge from walking in a straight line based on the amount of WANDER-ANGLE specified is greater than zero.
HOW TO USE IT
NUMBER-BUGS-EACH-SPEED is the number of bugs you start with in each of the six sub-populations. The overall population of bugs is determined by multiplying this value by 6.
WANDER-ANGLE is the amount of possible change in the angle of orientation that each of the bugs might have with each step.
SPEED-FACTOR is an overall speed coefficient to use to speed up or slow down all the bugs, without making their motion jerky. This is an important slider to adjust to compensate for different speed platforms the model might run on.
DETECTS-PREDITOR-AT is the radius that the bugs can detect the mouse pointer (the predator) from. If they can see the mouse pointer, they determine what direction the mouse pointer is in, and they will turn around in the opposite direction.
SPEED-COLOR-MAP settings help you apply color visualization to the speed of the bugs. The "all green" setting does not show a different color for each bug based on its speed". Keeping the color settings switched to something besides "all green" can tend to result in the predator (the user) unconsciously selecting bugs based on color instead of speed.
The "rainbow" setting shows 6 distinct colors for the 6 different speeds a bug might have. These color settings correspond to the plot pen colors in the graphs.
The "blue red" setting shows the lower half of the speeds of the starting population as blue, and the upper half as red.
The "purple shades" setting shows a gradient of dark purple to light purple for slow to fast bug speed.
THINGS TO NOTICE
This histogram tends to shift right if you assume the role of chasing easy prey.
This histogram tends to shift left if you assume the role of waiting for prey come to you. (The same effect is achieved with moving the mouse around the screen randomly)
THINGS TO TRY
Different combinations of WANDER-ANGLE and SPEED-FACTOR and DETECTS-PREDITOR-AT often lead to different selective forces dominating the outcome of a model run. For example, a SPEED-FACTOR that is low and a WANDER-ANGLE that is high and DETECTS-PREDITOR-AT of 0, lead to bugs that just twitch in place. In this scenario all of these bugs are equally easy to catch, therefore there is no selective mechanism here for the predator to catch one sub-population of the prey over another.
Try different combinations of WANDER-ANGLE and SPEED-FACTOR and DETECTS-PREDITOR-AT.
EXTENDING THE MODEL
It would be interesting to model energy gain from consumption of bugs and energy loss from your amount of motion around the screen.
You could add a slider to assign the random chance that a bug that is an offspring inherits a mutation, resulting in a speed that is not the same as its parent.
You could have each bug inherit WANDER-ANGLE as well as speed.
You could have each bug inherit DETECTS-PREDATOR-AT. It is envisioned that this would tend to select for bugs that the maximum value for this. To balance this with a competing selective force, you could have bugs consume grass or seeds to gain energy and consume energy as they move.
A HubNet version of the model with adjustable starting populations of bugs would help show what happens when two or more competitors assume similar vs. different hunting strategies on the same population at the same time.
RELATED MODELS
See Bug Hunt.
CREDITS AND REFERENCES
Inspired by EvoDots software:
http://faculty.washington.edu/~herronjc/SoftwareFolder/EvoDots.html
Comments and Questions
breed [ bugs bug ] breed [ predators predator] breed [ grass a-grass ] breed [ bugs-starting a-bug-starting] patches-own [energy] bugs-own [speed wander-angle detects-predator-within] bugs-starting-own [speed wander-angle detects-predator-within] globals [total-caught total-6-caught total-5-caught total-4-caught total-3-caught total-2-caught total-1-caught time start-time time-last-caught time-this-caught total-frequency-of-catching changed-color-map? old-color-map histogram-interval-size avg-radius-starting avg-wander-starting show-path? ] to setup ca set total-caught 0 set time 0 set start-time 0 set show-path? false set histogram-interval-size 1 set old-color-map speed-color-map set changed-color-map? false ask patches [set pcolor white] create-bugs number-bugs-each-speed [set speed 1 assign-random-attributes] create-bugs number-bugs-each-speed [set speed 2 assign-random-attributes] create-bugs number-bugs-each-speed [set speed 3 assign-random-attributes] create-bugs number-bugs-each-speed [set speed 4 assign-random-attributes] create-bugs number-bugs-each-speed [set speed 5 assign-random-attributes] create-bugs number-bugs-each-speed [set speed 6 assign-random-attributes] ask bugs [ set shape "bug" setxy random 100 random 100 hatch 1 [set breed bugs-starting set hidden? true] ] create-predators 1 [set hidden? true] ask bugs [set-colors] set avg-radius-starting mean [detects-predator-within] of bugs set avg-wander-starting mean [wander-angle] of bugs setup-plots end to assign-random-attributes ifelse random-attribute-start? [ set wander-angle (random 360) set detects-predator-within (random (max-pxcor)) ] [set wander-angle 20 set detects-predator-within max-pxcor ] end to go let bugs-remaining 0 set time (time + 1) check-color-map-change check-caught move-predator move-bugs do-plots show-path set bugs-remaining (count bugs) set changed-color-map? false end to show-path if (show-path? and (time - start-time) < 200) [ask turtle 0 [pendown]] if (show-path? and (time - start-time) >= 200) [ask turtle 0 [penup] set show-path? false] end to move-predator ;; show the hawk shape under the mouse-pointer in the graphics window if predator? is true if (mouse-inside?) [ask predators [setxy mouse-xcor mouse-ycor]] end to move-bugs let predator-agent one-of predators let heading-toward 0 let distance-from-predator nobody ask bugs [ set distance-from-predator distance-nowrap predator-agent ;; if bugs are close enough to the mouse pinter, calculate the heading toward the mouse pointer and set the heading of the bugs to be in the opposite direction if (mouse-inside? and distance-from-predator < detects-predator-within) [ set heading-toward towards predator-agent set heading (-1 * heading-toward)] fd (speed * speed-factor) rt random wander-angle lt random wander-angle ] end to check-caught let speed-of-caught 0 let period-to-catch 0 let snap-mouse-xcor mouse-xcor let snap-mouse-ycor mouse-ycor if mouse-down? and mouse-inside? [ if (any? bugs-on patch snap-mouse-xcor snap-mouse-ycor) [ set total-caught (total-caught + 1) set time-last-caught time-this-caught set time-this-caught time set period-to-catch (time-this-caught - time-last-caught) set total-frequency-of-catching (total-frequency-of-catching + (1 / period-to-catch)) reproduce-one ;; kill only one of the bugs at the mouse location ask one-of bugs-on patch snap-mouse-xcor snap-mouse-ycor [ set speed-of-caught speed if (speed-of-caught = 1) [set total-6-caught (total-6-caught + 1)] if (speed-of-caught = 2) [set total-5-caught (total-5-caught + 1)] if (speed-of-caught = 3) [set total-4-caught (total-4-caught + 1)] if (speed-of-caught = 4) [set total-3-caught (total-3-caught + 1)] if (speed-of-caught = 5) [set total-2-caught (total-2-caught + 1)] if (speed-of-caught = 6) [set total-1-caught (total-1-caught + 1)] die] ] ] end to reproduce-one ask one-of bugs [ hatch 1 [ set heading (random 360) if mutations? [mutate-offspring-attributes] ] ] end to mutate-offspring-attributes if random-attribute-start? [ set wander-angle (wander-angle + (random-float angle-drift)) set detects-predator-within (detects-predator-within + (random-float detects-drift) - 1) if (random 100 < probability-mutation) [set speed (speed + (random (speed-drift + 1) ) ) ] if speed < 1 [set speed 1] if speed > 6 [set speed 6] ] end to check-color-map-change ;; apply color map change only once: when a new value for speed-color-map is selected if (old-color-map != speed-color-map) [ ask bugs [ set old-color-map speed-color-map set changed-color-map? true set-colors ] ] end to do-plots set-current-plot "Avg. radius vs. time" set-current-plot-pen "starting" plotxy time avg-radius-starting set-current-plot-pen "changing" plotxy time mean [detects-predator-within] of bugs set-current-plot "Avg. wander-angle vs. time" set-current-plot-pen "starting" plotxy time avg-wander-starting set-current-plot-pen "changing" plotxy time mean [wander-angle] of bugs set-current-plot "radius distribution" clear-plot if show-starting? [ set-histogram-num-bars 10 set-current-plot-pen "starting" set-plot-pen-interval 1 histogram [detects-predator-within] of bugs-starting ] set-histogram-num-bars 10 set-current-plot-pen "current" set-plot-pen-interval 1 histogram [detects-predator-within] of bugs set-current-plot "wander angle distribution" clear-plot if show-starting? [ set-histogram-num-bars 10 set-current-plot-pen "starting" set-plot-pen-interval 36 histogram [wander-angle] of bugs-starting ] set-histogram-num-bars 10 set-current-plot-pen "current" set-plot-pen-interval 36 histogram [wander-angle] of bugs set-current-plot "bugs caught vs. time" plot-caught set-current-plot "number of bugs vs. time" plot-populations set-current-plot "consumption rate vs. time" if (total-caught > 0) [ plotxy time (total-frequency-of-catching / total-caught)] set-current-plot "frequency of bugs" plot-histograms end to setup-plots set-current-plot "bugs caught vs. time" plotxy time total-caught set-current-plot "frequency of bugs" plot-histograms end to set-colors if (speed-color-map = "all green") [set color green] if (speed-color-map = "blue red") [recolor-twocolor ] if (speed-color-map = "violet shades") [recolor-shade ] if (speed-color-map = "rainbow") [recolor-rainbow ] end to recolor-twocolor ifelse (speed <= 3) [set color blue] [set color red] end to recolor-shade set color (112 + speed ) end to recolor-rainbow if (speed = 6) [set color red] if (speed = 5) [set color orange] if (speed = 4) [set color (yellow - 1)] if (speed = 3) [set color green] if (speed = 2) [set color blue] if (speed = 1) [set color violet] end to plot-histograms set-histogram-num-bars 8 set-current-plot-pen "pen1" set-plot-pen-interval histogram-interval-size histogram [speed] of bugs with [speed = 1] set-histogram-num-bars 8 set-current-plot-pen "pen2" set-plot-pen-interval histogram-interval-size histogram [speed] of bugs with [speed = 2] set-histogram-num-bars 8 set-current-plot-pen "pen3" set-plot-pen-interval histogram-interval-size histogram [speed] of bugs with [speed = 3] set-histogram-num-bars 8 set-current-plot-pen "pen4" set-plot-pen-interval histogram-interval-size histogram [speed] of bugs with [speed = 4] set-histogram-num-bars 8 set-current-plot-pen "pen5" set-plot-pen-interval histogram-interval-size histogram [speed] of bugs with [speed = 5] set-histogram-num-bars 8 set-current-plot-pen "pen6" set-plot-pen-interval histogram-interval-size histogram [speed] of bugs with [speed = 6] end to plot-populations set-current-plot-pen "speed=1" plot (count bugs with [speed = 1]) set-current-plot-pen "speed=2" plot (count bugs with [speed = 2]) set-current-plot-pen "speed=3" plot (count bugs with [speed = 3]) set-current-plot-pen "speed=4" plot (count bugs with [speed = 4]) set-current-plot-pen "speed=5" plot (count bugs with [speed = 5]) set-current-plot-pen "speed=6" plot (count bugs with [speed = 6]) end to plot-caught ;; set-current-plot-pen "total" ;; plotxy time total-caught set-current-plot-pen "speed=1" plotxy time total-1-caught set-current-plot-pen "speed=2" plotxy time total-2-caught set-current-plot-pen "speed=3" plotxy time total-3-caught set-current-plot-pen "speed=4" plotxy time total-4-caught set-current-plot-pen "speed=5" plotxy time total-5-caught set-current-plot-pen "speed=6" plotxy time total-6-caught end
There is only one version of this model, created over 14 years ago by Uri Wilensky.
Attached files
No files
This model does not have any ancestors.
This model does not have any descendants.