powered by NetLogo
view/download model file: Termite_Defense.nlogo
Termite Defense is a netLogo project in which termites attempt to defend their queen against an attack from ants.
It is an attempt to model the seemingly complex aggregate behavior exhibited by termites in the physical world.
There are 4 main species of turtles in this model.
Queen Termite - is pulled to safety during a critical breach by worker termites
Worker Termites - responsible for the rebuilding of the nest, and pulling the queen to safety
Soldier Termites - responsible for defending the nest against intruders, and killing ants
Ants - ants roam the surface of the nest until a breach is found, upon which point in time, they signal to their army the location of the breach, and commence assault.
Given a small enough number of ants, the colony will defend itself, but when the large inner chamber is breached, the termites enter an emergency mode to protect its queen.
The majorBreach switch is for forcing major breach behavior.
The demoMode switch displays the colored queen's pheromone level per inside patch, and the assault signal on the outer patches for the ants.
Use the top two sliders, startTermiteCount and startAntCount to choose the starting populations of both termites and ants.
As a rule, soldier termites make up 1/5th of the population, and worker termites make up the remaining 4/5ths.
Use the deepBreach slider to determine how far into the nest the ant's must go before the breach is declared a major breach, and the termites go into phase two.
The leftmost value will initiate queen protection mode very soon after the ants enter the nest.
The rightmost value will allow the ants to catch and kill the queen.
The default value of this slider is the approximate value of main chimney vent in the middle of the nest.
After deciding these parameters, click the SETUP BUTTON.
Then click the GO BUTTON.
After allowing the queen's scent (clock based- approx 200 ticks) to permeate through the nest, LEFT-CLICK the outer surface of the termite mound near the ant army to initiate an assault on the termite queen.
If you create a breach away from the army of ants, the termites do a relatively good job in holding them off and rebuilding the nest.
The soldier termites, block the entrance to the nest, killing intruders and protecting the workers.
The worker termites will slowly patch up the breach. Large breaches are patched up using an overspill of dirt, as the way it commonly occurs in the natural world. Dirt is continually piled at the sites of the breaches until the nest has been returned to normal.
The critical value of ants according to the combat protocols specified is approximately 1.2 times the number of soldier termites, or .24 times the entire termite population.
Even if all the ants eventually get killed by the soldier termites, 1.2 times the number of soldier termites will cause phase 2, the reaction to a serious breach.
It may be of interest to see the method behind the ant navigation and signaling.
This can be seen if the SEMICOLONS are removed from the 7 lines of code following the "@@ DEMO CODE @@" comment in the GO SECTION.
1. Implement a mode of retreat for the ants.
2. Implement the repopulation of the ant nest including the reopening of the escape chamber as well as the queen producing more young.
3. Implement large soldiers and workers
4. Simulate the respiratory nature and temperature management of the nest.
5. Use the temperature to more accurately simulate breach repair for more severe breaches as well.
Temporary variable declaration as a means of accessing patch variables for use by turtles was used.
In particular,
let class-ahead [class] of patch-ahead 1
let y-ahead [pycor] of patch-ahead 1
is used very frequently.
The distancexy primitive saved much time when attempting to calculate the radius from one patch or turtle to another. This was particularly useful in modelling the assault notice.
The background nest image is a 1:1 ratio 61x75 .bmp image hand drawn in msPaint.
import-pcolors "nest.bmp"
Online Link to this model:
http://modelingcommons.org/browse/one_model/2593
Wilensky, U. (1997). NetLogo Ants model. http://ccl.northwestern.edu/netlogo/models/Ants. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.
Attenborough, David. "Termites - Life's Ultimate Architects". BBC - YouTube. June 01, 2009 <http://www.youtube.com/watch?v=0m7odGafpQU>.
Maeterlinck, Maurice. The Life of the White Ant. London: George Allen & Unwin LTD, 1927.
Schoning, Caspar, and Mark Moffett. "Driver Ants Invading a Termite Nest: Why Do the Most Catholic Predators of All Seldom Take This Abundant Prey?". University of Copenhagen. June 02, 2009 <http://www1.bio.ku.dk/forskning/oe/cse/media/schoening2007_biotropica.pdf/>.
Turner, Scott . "Structure of Macrotermes mounds". State University of New York College of Environmental Science and Forestry. June 01, 2009 <http://www.esf.edu/efb/turner/termite/termhome.htm>.
"Wars of the Underworld". VidMax - YouTube. June 01, 2009 <http://www.youtube.com/watch?v=mY9LNEJNrZs&feature=related>.
Wilensky, U. (1997). NetLogo Ants model. http://ccl.northwestern.edu/netlogo/models/Ants. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.
breed [ants ant] ; ants! breed [sWorkers sWorker] ; small workers breed [lWorkers lWorker] ; large workers breed [sSoldiers sSoldier] ; small soldiers breed [queens queen] ; queen breed [qScents qScent] ; queenscent ants-own [breach] sWorkers-own [mud vibration] ; patch in front of the workers' color qScents-own [energy] patches-own [class qLevel sigStr] ; qLevel- queen scent in the air in the nest ; sigStr- breach signal strength globals [ breachx breachy qx qy qMoves] ; qx - queen xcor ; qy - queen ycor ; qMoves - # of times the queen has moved ; class- patch classification system ; 0 for dirt ; 1 for nest air ; 2 for outside air ; 3 for queens nest ; 4 for new dirt ; 5 for emergency exit ;######################################## ; SETUP ;######################################## to setup clear-all set majorBreach false set qMoves 0 set-default-shape turtles "bug" import-pcolors "nest.bmp" ; import of paintbrush .bmp files dimensions 60x75 ; light gray for queens nest ; dark gray for hive air ; black for dirt ; white for outside air ;DIRT PATCHES - 0 ask patches with [pcolor = 0] ; ask dirt patches [ nestDirt ] ;NEST AIR - 4.5 ask patches with [pcolor = 4.5] [ nestAir ] ;OUTSIDE AIR - 9.9 ask patches with [pcolor = 9.9] [ outsideAir ] ;QUEENS NEST - 7.3 ask patches with [pcolor = 7.3] [ queensRoom ] ;POPULATE NEST setupTermites setupAnts ;EMERGENCY EXIT ask patches with [pcolor = 14.9] [ set class 5 ] ;SETUP PLOTS do-plots end ;************************** ;PLOT SETUP to do-plots set-current-plot "Totals" set-current-plot-pen "sSoldiers" plot count sSoldiers set-current-plot-pen "ants" plot count ants set-current-plot-pen "sWorkers" plot count sWorkers end ;************************** ;TERMITE SETUP to setupTermites ;workers and soldiers ask patch 5 11 [ sprout-sWorkers startTermiteCount * .8 [ set color gray set size 1 set mud 0 ] sprout-sSoldiers startTermiteCount * .2 [ set shape "soldier" set color red set size 1 ] ] ;spawn queen ask patch 6 -14 [ sprout-queens 1 [ set shape "queen" set size 10 set heading 270 set color yellow + 4 set qx xcor + 3 set qy ycor ] ] ;setup scent trail ask queens [ ask patch xcor ycor [ sprout-qScents 100 [ set energy 90 set size 0 ] ] ] end ;************************** ; ANT SETUP to setupAnts ask patch -16 8 [ sprout-ants startAntCount [ set color black set size 1 set heading 90 set breach 0 ] ] end ;######################################## ; GO ;######################################## to go tick ;************************** ; STOP CONDITIONS if qx < -23 [ show "Queen escapes safely." stop ] if count queens = 0 [ show "Queen has been slain." stop] ;************************** ; DEMO CODE if demoMode = true [ ask patches with [class = 1 or class = 4 or class = 3 or class = 5] [set pcolor qLevel] ask patches with [class = 2] [ if sigStr > .1 [ set pcolor 20 - sigStr ] ] ] ;************************** ;SMALL WORKER GO ask sWorkers [ ifelse majorBreach = false [ mudWork terMove ] [ evacuateWorkers ;next if statement is simply code if any? neighbors4 with [class = 2] or count neighbors4 with [class = 0] > 3 [ die ] ] ] ;************************** ;SMALL SOLDIER GO ask sSoldiers [ ifelse majorBreach = false [ ifelse count neighbors4 with [class = 2] > 0 ; if the soldier is exposed to outside air [ guardBreach ] [ sSolMove ] ] [ protectTheQueen ;next if statement is simply cleanup code if any? neighbors4 with [class = 2] or count neighbors4 with [class = 0] > 3 [ die ] ] sSFight ] ;************************** ; ANT GO ask ants [ ifelse breach = 0 [antMove] [ ifelse breach = 1 [assault] [ if breach = 2 [ retreat ;next if statement is simply cleanup code if any? neighbors4 with [class = 2] or count neighbors4 with [class = 0] > 3 [ die ] ] ] ] antFight ] ;************************** ; QUEEN SCENT GO if any? qScents [ ask qScents [ qMove ] ] ;************************** ; NEST MAINTENENCE ifelse majorBreach = false [ ;PATCH REPAIR ask patches [ updateNest ] ask patches with [class = 4] ; new dirt [ if count neighbors with [class = 2] < 1 ; if disturbances have been fixed [ ; remove unnecessary new-dirt patches nestAir ;show max-one-of neighbors4 [qLevel] let highQ [qLevel] of max-one-of neighbors4 [qLevel] set qLevel highQ - .1 ] ] ] [ ;else if majorBreach = true ask queens [queenMove] ask patches with [class = 4] ; new dirt [ if pcolor < 32 [ nestDirt ] ] ] ;************************** ; MOUSE ATTACK if mouse-down? ; if the mouse is clicked [ ask patch mouse-xcor mouse-ycor [ if class = 0 ; and the patch that is clicked is dirt [ if any? neighbors with [class = 2] ; and the patch is an outside dirt patch [ outsideAir set qLevel 0 ask neighbors4 with [class = 0] [ outsideAir set qLevel 0 ] ] ] ] ] ;PLOT UPDATE do-plots end ;######################################## ; SMALL WORKER TERMITE COMMANDS ;######################################## ;************************** ; MUDWORK to mudWork ;pickup if mud = 0 ; if not carrying mud [ ifelse ycor < -21 ; if in the cellar of the nest [ if any? neighbors4 with [class = 0] [ ask one-of neighbors4 with [class = 0] [ set pcolor pcolor + .1 ] set mud 1 ] ] [ if random 100 < 10 ; 10% chance to pick up dirt from anywhere [ if any? neighbors4 with [class = 0] [ if mud = 0 [ set mud 1 ask one-of neighbors4 with [class = 0] [ set pcolor pcolor + .05 ] ] ] ] ] ] ;dropoff if mud = 1 [ ifelse any? neighbors4 with [class = 2] ; if you have mud, and any of your neighboring patches are air [ ;drop your mud set mud 0 ask patch-here [ mudDrop ] ] [ if ycor > -21 ; if not in cellar [ nestMaintenence ] ] ] end ;************************** ; GENERAL MAINTENENCE to nestMaintenence ; repair any mound dirt that may have been damaged if any? neighbors4 with [class = 0 and pcolor > 32] [ set mud 0 ask one-of neighbors4 with [class = 0 and pcolor > 32] [ set pcolor pcolor - .1 ] ] ; also, if worker termite is standing on a patch of newdirt, and is holding mud, drop mud ask patch-here [ if class = 4 [ ask sWorkers-here with [mud = 1] [ ;show "DROP HERE" set mud 0; ask patch-here [ set pcolor pcolor - .1 ] ] if pcolor < 32 [ nestDirt ] ] ] end ;************************** ; PROTECT THE QUEEN to queenChain if distancexy qx qy > 4 [ face patch qx qy fd .05 ] end to farQueenChain if distancexy qx qy > 8 [ face patch qx qy set heading heading + random 45 - 22.5 fd .05 if [class] of patch-here = 0 [ set heading heading + 180 fd .25 set heading (heading + random 180) + 90 ] ] end ;######################################## ; SMALL SOLDIER TERMITE COMMANDS ;######################################## ;GUARD BREACH to guardBreach ask patch-here [ ; if the patch being guarded gets restored if class = 0 [ ask sSoldiers-here [ atEase ] ] ] end ;BACK TO NORMAL to atEase facexy 5 -26 ; face middle of the next fd .5 ; move soldiers back in end ;COMBAT to sSFight if any? ants-on neighbors4 [ ask one-of ants-on neighbors4 [ die ] if count ants = 0 [ show "Termites win this round." ask patches with [class = 2 or class = 0] [set sigStr 0] ] ask patch-here ;if the ants have reached the inner chimney of the nest [ if qLevel > deepBreach and count neighbors with [class = 1] > 6 [ set majorBreach true ] ] ] end ;######################################## ; ANT COMMANDS ;######################################## ;REINFORCEMENTS to addAnts ask patch -16 8 [ ifelse sigStr > 0 [ sprout-ants 10 [ set color black set size 1 set heading 90 set breach 1 ] ] [ sprout-ants 10 [ set color black set size 1 set heading 90 set breach 0 ] ] ] end to addMadAnts ask patch -16 8 [ ifelse sigStr > 0 [ sprout-ants 100 [ set color black set size 1 set heading 90 set breach 1 ] ] [ sprout-ants 100 [ set color black set size 1 set heading 90 set breach 0 ] ] ] end ;COMBAT to antFight ; if ants surround termites they can kill them if count ants-on neighbors4 > 30 [ if any? queens-on neighbors4 [ ask one-of queens-on neighbors4 [ die ] ] ] if count ants-on neighbors4 > 3 [ if any? sSoldiers-on neighbors4 [ ask one-of sSoldiers-on neighbors4 [ die ] ] ] if any? sWorkers-on patch-here [ ask one-of sWorkers-on patch-here [ die ] ] end ;SIGNAL TO OTHER ANTS to sendSignal ask ants [ set breach 1 ] ask one-of neighbors4 with [class = 4] [ set breachx pxcor set breachy pycor ] ask patches with [class = 2 or class = 4] [ let howFar 7 / (.1 + (distancexy breachx breachy) * (distancexy breachx breachy)) set sigStr howFar ] end ;######################################## ; PATCH SET COMMANDS ;######################################## ;************************** ;NEST MAINTENENCE to updateNest ; Cellar Update if class = 0 and pcolor > 39.5; if dirt patch has been depleted, change it to nest air [ nestAir ] ; ie in the cellar ; SpillOver ; programs newDirt patch darkening to allow for spillover that one of the neighbors 4 is outer air if class = 4 and pcolor < 38 ; if newdirt patch is dark enough [ ask neighbors with [class = 2] ; ask outer air neighbors [ ifelse pcolor = 9.9 ; if first spillover [ set pcolor 39.5 ; change color to very light brown ] [ ; else, just darken the patch ifelse pcolor > 32 [ set pcolor pcolor - .1 ] [ ; if the patch gets dark enough, change it to nestdirt nestDirt ;ask myself [nestDirt] ] ] ] ; if any of the neighboring patches are new dirt, make sure they get filled completely (through spillover) ; before filling in the parent dirt patch if any? neighbors4 with [class = 4] [ set pcolor 38 ] ] end to outsideAir set class 2 ; change the dirt to outside air set pcolor 9.9 end to nestDirt set class 0 set pcolor 32 end to nestAir set qLevel 0 set class 1 set pcolor 59.5 ; very light green - 55 is darker green end to queensRoom set class 3 set pcolor 7.3 end to newDirt set class 4 set pcolor 39 end to mudDrop ifelse class = 2 or class = 1; if the patch is air [ newDirt ] [ if class = 4 ; if the patch is new dirt [ set pcolor pcolor - .1 ] ] end ;######################################## ; MOVEMENT RULES ;######################################## ;************************** ;DEFAULT WORKER MOVEMENT to terMove let class-ahead [class] of patch-ahead 1 ifelse class-ahead = 1 or class-ahead = 4 or class-ahead = 3 [ fd .25 ] [ set heading heading + ((random 150) - 75)] end ;ASSAULT WORKER MOVEMENT to evacuateWorkers let my-class [class] of patch-here let higherClass any? neighbors4 with [class > my-class] ifelse my-class = 1 ;current location is nest air [ ifelse higherClass = false ;get to the queens chamber [ if any? neighbors with [qLevel > 0] [ face max-one-of neighbors4 [qLevel] fd .3 if [class] of patch-here = 0 [ set heading heading + 180 fd .35 ] ] ] [ ;when you are at the border, enter the queens chamber face one-of neighbors4 with [class > my-class] fd .2 backstep ] ] [ ;current location is queens nest, new dirt, or escape route let class-ahead [class] of patch-ahead 1 ifelse class-ahead = 3 or class-ahead = 5 or class-ahead = 4 [ fd .3 ] [ set heading heading + ((random 150) - 75)] ifelse higherClass = false [ ;not on the border ] [ ifelse qx > -2 [ ;on the border if (count neighbors with [class = 5] >= 2) and (count neighbors with [class = 3] >= 2) [ if mud = 1 [ set mud 0 ask neighbors4 [ newDirt ] ask patch-here [ newDirt ] ] ] ] [ ifelse (count neighbors with [class = 5] >= 2) and (count neighbors with [class = 3] >= 2) [] [ if mud = 1 [ if any? neighbors4 with [class = 4] [ ask one-of neighbors4 with [class = 4] [ set pcolor pcolor - .1 ] ] ] ] ] ] ifelse qx > -2 [queenChain] [ ifelse [class] of patch-here = 3 ;stuck in queens nest [ terMove ] [farQueenChain] ] ] end ;************************** ;DEFAULT SOLDIER MOVEMENT to sSolMove let class-ahead [class] of patch-ahead 1 let y-ahead [pycor] of patch-ahead 1 ifelse (class-ahead = 1 or class-ahead = 4) and y-ahead > -17 [ fd .2 ] [ set heading heading + ((random 150) - 75)] end ;ASSAULT SOLDIER MOVEMENT to protectTheQueen ifelse any? neighbors with [qLevel > 0] ;queens nest [ face max-one-of neighbors4 [qLevel] let class-ahead [class] of patch-ahead 1 ifelse class-ahead = 1 [ fd .2 ] [ ifelse class-ahead = 3 [ ;patrol set heading ((random 3) - 1) * 90 fd .2 backstep ] [set heading heading + ((random 150) - 75)] ] ] [ set heading heading + 180 fd .2 ] end ;************************** ;DEFAULT ANT MOVEMENT to antMove let class-ahead [class] of patch-ahead 1 let x-ahead [pxcor] of patch-ahead 1 let y-ahead [pycor] of patch-ahead 1 let temp false ask patch-ahead 1 [ set temp any? neighbors4 with [class = 0] ] ifelse (class-ahead = 1 or class-ahead = 4 or class-ahead = 2) and (temp = true) [ fd .125 if any? neighbors4 with [class = 4] [ ;signal to other ants of the breach sendSignal ;show "SEND SIGNAL" bk .125 set breachx xcor set breachy ycor fd .125 ] ] [ set heading heading + ((random 150) - 75)] end ;ASSAULT ANT MOVEMENT to assault let fightOrMove any? sSoldiers-on neighbors4 if fightOrMove = false [ ifelse any? neighbors4 with [qLevel > 0] [ face max-one-of neighbors4 [qLevel] let retreatCheck [class] of patch-ahead 1 if retreatCheck = 0 ;termites have escaped [ set breach 2 ] fd .1 if [class] of patch-here = 0 [ set heading heading + 180 fd .125 ] ] [ ifelse any? neighbors with [sigStr > 0] [ face max-one-of neighbors4 [sigStr] fd .1 if [class] of patch-here = 0 [ set heading heading + 180 fd .125 ] if ([class] of patch-here = 2 and [pcolor] of patch-here > 32) [ ask patch-here [set pcolor 39] ] ] [ ;show "NOTHING" set heading heading + 180 fd .125 ] ] ] end ;ANT RETREAT to retreat termove end to backStep if [class] of patch-here = 0 [ set heading heading + 180 fd .25 ] end ;************************** ;QUEEN SCENT MOVEMENT to qMove let class-ahead [class] of patch-ahead 1 ifelse class-ahead = 1 or class-ahead = 4 or class-ahead = 3 or class-ahead = 5 [ fd 1 set energy energy - .1 if energy < 80 [ die ] setQlevel energy if class-ahead = 2 [ set heading random 360 ] ] [ set heading heading + ((random 150) - 75)] end to setQlevel [en] ; keeps only shortest path ask patch-here [ if en > qlevel [ set qLevel en sprout-qScents 4 [ set energy [qLevel] of patch-here set size 0 ] ] ] end ;************************** ;QUEEN MOVEMENT to queenMove set qx xcor + 3 set qy ycor if count sWorkers-on neighbors4 > 25 ;startTermiteCount / 100 [ let yourPatch [class] of patch-here ifelse yourPatch = 3; queens nest [ set heading 255 + random 30 fd .05 set qMoves qMoves + .005 ask patches with [pxcor = [pxcor] of myself and pycor = [pycor] of myself - 3 + random 6 ] [ set qLevel 90 + qMoves ] ] [ let class-ahead [class] of patch-ahead 3 ifelse class-ahead = 5 or class-ahead = 4 or class-ahead = 3 [ fd .05 set qMoves qMoves + .005 ask patches with [pxcor = [pxcor] of myself and pycor = [pycor] of myself - 3 + random 6 ] [ if class != 0 [ set qLevel 90 + qMoves ;show qLevel ] ] ] [ set heading 240 + random 60 ] ] ] end