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