MalansonReslerJTB2014
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
WHAT IS IT?
This project models the behavior of ants following a leader towards a food source. The leader ant moves towards the food along a random path; after a small delay, the second ant in the line follows the leader by heading directly towards where the leader is located. Each subsequent ant follows the ant ahead of it in the same manner.
Even though the leader may take a very circuitous path towards the food, the ant trail, surprisingly, adopts a smooth shape. While it is not yet clear if this model is a biologically accurate model of ant behavior, it is an interesting mathematical exploration of the emergent behavior of a series of agents following each other serially.
HOW TO USE IT
The SETUP button initializes the model. A brown ant nest is placed on the left side of the world. Inside it are a number of ants (yellow) determined by the NUM-ANTS slider. On the right hand of the world is an orange source of food.
The GO button starts the ants moving. The leader ant (turtle 0) is set in motion roughly in the direction of the food. It wiggles as it moves. That is, it does not head directly towards the food, but changes its heading a random amount to the left or right before it takes each step.
The maximum amount the leader ant can wiggle at each step (and therefore the raggedness of the leader ant's path) is governed by the LEADER-WIGGLE-ANGLE slider. When the leader ant gets close enough to the food to "smell" it, it stops wiggling and heads directly for the food. The leader ant leaves a red trace as it moves.
Each subsequent ant follows the ant ahead of it by heading directly towards it before it takes each step. The follower ants do not leave a trace. The yellow line of ants, however, traces out a curve in the drawing. The last ant to go leaves a blue trace.
The amount of time between ants departing their nest is governed by the START-DELAY slider (plus some random factor).
The ANTS-RELEASED monitor shows you how many ants have left the nest. The other monitor shows you the heading of the lead ant.
THINGS TO NOTICE
How does the shape of the ant line change over time?
How does the path of the initial ant compare with the path of the final ant?
THINGS TO TRY
Try varying the maximum wiggle angle (LEADER-WIGGLE-ANGLE). How does that affect the shape of initial and final ant lines?
Try varying the delay. How does that affect the shape of initial and final ant lines?
How can you slow down the flattening out of the ant line? Can you make the path fail to converge to a straight line?
How can you speed up the flattening out of the ant line?
EXTENDING THE MODEL
How might you keep track of, measure, or plot the flattening process?
What if you relaxed the ant following rules -- maybe add some "wiggle" to their behavior?
NETLOGO FEATURES
In NetLogo, the default behavior of the ants is to move in parallel. Notice the use of delays based on turtle ids in the TIME-TO-START? reporter to make the turtles leave the nest serially.
CREDITS AND REFERENCES
The model was inspired by the work of Alfred Bruckstein (see Bruckstein 1993: "Why the ant trails look so straight and nice", The Mathematical Intelligencer, Vol. 15, No. 2).
HOW TO CITE
If you mention this model in an academic publication, we ask that you include these citations for the model itself and for the NetLogo software:
- Wilensky, U. (1997). NetLogo Ant Lines model. http://ccl.northwestern.edu/netlogo/models/AntLines. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.
- Wilensky, U. (1999). NetLogo. http://ccl.northwestern.edu/netlogo/. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.
In other publications, please use:
- Copyright 1997 Uri Wilensky. All rights reserved. See http://ccl.northwestern.edu/netlogo/models/AntLines for terms of use.
COPYRIGHT NOTICE
Copyright 1997 Uri Wilensky. All rights reserved.
Permission to use, modify or redistribute this model is hereby granted, provided that both of the following requirements are followed:
a) this copyright notice is included.
b) this model will not be redistributed for profit without permission from Uri Wilensky. Contact Uri Wilensky for appropriate licenses for redistribution for profit.
This model was created as part of the project: CONNECTED MATHEMATICS: MAKING SENSE OF COMPLEX PHENOMENA THROUGH BUILDING OBJECT-BASED PARALLEL MODELS (OBPML). The project gratefully acknowledges the support of the National Science Foundation (Applications of Advanced Technologies Program) -- grant numbers RED #9552950 and REC #9632612.
This model was converted to NetLogo as part of the projects: PARTICIPATORY SIMULATIONS: NETWORK-BASED DESIGN FOR SYSTEMS LEARNING IN CLASSROOMS and/or INTEGRATED SIMULATION AND MODELING ENVIRONMENT. The project gratefully acknowledges the support of the National Science Foundation (REPP & ROLE programs) -- grant numbers REC #9814682 and REC-0126227. Converted from StarLogoT to NetLogo, 2001.
Comments and Questions
globals [ pseeds sseeds parentid originage branchpine branchspruce branchkill treecount edgedensity zengsum ndense neibo year potential cover edges pinec sprucec pinef pinefile sprucef sprucefile sprucecount pinecount ] breed [pines] breed [pbranch] breed [sbranch] breed [spruce] breed [deadguy] breed [deadguy-branch] turtles-own [origin parent age canker brage branchparent pinepine ] pines-own [infectp ] pbranch-own [infectb ] patches-own [ quality zeng zengX prob dense ] to setup __clear-all-and-reset-ticks set-default-shape pines "tree pine" set-default-shape pbranch "plant" set-default-shape sbranch "plant" set-default-shape spruce "tree pine" set-default-shape deadguy "tree pine" set-default-shape deadguy-branch "plant" set year 0 ask patches [ set quality 0 set zeng 0 set prob 0 set potential 0 set cover 0 set edges 0 set pinec 0 set sprucec 0 set dense 0 set pinecount 0 set sprucecount 0 set pinefile 0 set sprucefile 0 set pinef 0 set sprucef 0 set quality ( (1 - (pycor / 500)) * .5) set pcolor white if (startspruce > 0) AND (startpine > 0 ) [ ifelse (random-float 1 < quality * startspruce ) [ sprout-spruce 1 [ set color 2 set size 2 ] ] [ ; else if (random-float 1 < quality * startpine ) [ sprout-pines 1 [ set color 5 set size 2 ] ] ] ] ] ages reset-ticks end ;;___PROCEDURES__________ to ages ask turtles [ set age ( 50 + random 50 ) set brage 0 ] end to go ifelse (year < 101) [ ager feedback seeds spruces whiteb grow death feedback edgepro profilepro tick ] [ stop ] end ; NOTE using procedure within procedure is to avoid having the observer call a turtle or patch directly to ager agerpro end to agerpro set year (year + 1) set pinec (count patches with [any? pines-here] + count patches with [any? pbranch-here]) set sprucec (count patches with [any? spruce-here] + count patches with [any? sbranch-here] ) set cover (count patches with [any? spruce-here] + count patches with [any? sbranch-here] + count patches with [any? pines-here] + count patches with [any? pbranch-here]) set edges edgedensity set potential ( zengsum / ( 50000 - (pinec + sprucec) ) ) ask turtles [ set age (age + 1) set brage (brage + 1) ] end to seeds set pseeds 0 set sseeds 0 seedspro end to seedspro ask pines [ if (age > 50) AND (random-float 1 < pineseeder * (quality + zeng)) [ set pseeds pseeds + 1 ]] ask spruce [ if (age > 50) AND (random-float 1 < spruceseeder * (quality + zeng)) [ set sseeds sseeds + 1 ] ] end to whiteb whitebpro end to whitebpro repeat pseeds [ ask patches [ if (not any? turtles-here) [ set prob pinestab * (quality + zeng )] if (random-float 1 < prob) [ sprout-pines 1 [ set age 0 set brage 0 ; print 111 ; set origin who set origin 1 set parent 1 set parentid 1 ; set pinedead 0 set infectp 0 set canker 0 set color 5 set size 2 ] ] ] ] end to spruces sprucespro end to sprucespro repeat sseeds [ ask patches [ if (not any? turtles-here) [ set prob sprucestab * (quality + (zeng * 2) ) if (random-float 1 < prob ) [ sprout-spruce 1 [ set age 0 set brage 0 ; set origin who set origin 2 set parent 2 set parentid 2 ; set infectb 0 set color 2 set size 2 ] ] ] ] ] end to grow growpro end to growpro ask pines [ if brage > 10 [ set parentid 1 set originage age set branchpine who let seeding-place nobody set seeding-place one-of neighbors with [not any? turtles-here] if (seeding-place != nobody) AND (random-float 1 < pinegrow * (quality + zeng)) [ ask seeding-place [ sprout-pbranch 1 [ set age originage set brage 0 set parent parentid set branchparent branchpine set color 5 set size 2 ] ] ] ] ] ask spruce [ if brage > 10 [ set parentid 2 set originage age set branchspruce who let seeding-place nobody set seeding-place one-of neighbors with [not any? turtles-here] if (seeding-place != nobody) AND (random-float 1 < sprucegrow * (quality + zeng)) [ ask seeding-place [ sprout-sbranch 1 [ set age originage set brage 0 set parent parentid set branchparent branchspruce set color 2 set size 2 ] ] ] ] ] ask pbranch [ if brage > 10 [ set parentid parent set branchpine branchparent set originage age let seeding-place nobody set seeding-place one-of neighbors with [not any? turtles-here] if (seeding-place != nobody) AND (random-float 1 < pinegrow * (quality + zeng) ) [ ask seeding-place [sprout-pbranch 1 [ set age originage set parent parentid set brage 0 set branchparent branchpine set color 5 set size 2 ] ] ]]] ask sbranch [ if brage > 10 [ set parentid parent set branchspruce branchparent set originage age let seeding-place nobody set seeding-place one-of neighbors with [not any? turtles-here] if (seeding-place != nobody) AND (random-float 1 < sprucegrow * (quality + zeng) ) [ ask seeding-place [sprout-sbranch 1 [ set age originage set parent parentid set brage 0 set branchparent branchspruce set color 2 set size 2 ] ] ]]] end to death deathpro end to deathpro ask pines [ ifelse (age <= 10) and (random-float killer > (lowsurviv * (quality + zeng) ) ) [ die ] [ifelse (age > 10 and age < 350) and (random-float killer > (highsurviv * (quality + zeng)) ) [ die ] [if (age >= 350) and (random-float killer > (lowsurviv * (quality + zeng)) ) [ ask patch-here [ sprout-deadguy 1 [ set color black set size 2 set age 0 ; print 99 ]] die ] ] ] ] ask pbranch [ ifelse (age <= 10) and (random-float killer > (lowsurviv * (quality + zeng) ) ) [ die ] [ifelse (age > 10 and age < 350) and (random-float killer > (highsurviv * (quality + zeng)) ) [ die ] [if (age >= 350) and (random-float killer > (lowsurviv * (quality + zeng)) ) [ ask patch-here [ sprout-deadguy-branch 1 [ set color black set size 2 set age 0 ; print 9999 ]] die ] ] ] ] ask spruce [ ifelse (age <= 10) and (random-float killer > (lowsurviv * (quality + zeng) ) ) [ die ] [ifelse (age > 10 and age < 200) and (random-float killer > (highsurviv * (quality + zeng)) ) [ die ] [if (age >= 200) and (random-float killer > (lowsurviv * (quality + zeng)) ) [ ask patch-here [ sprout-deadguy 1 [ set color black set size 2 set age 0 ; print 8 ]] die ] ] ] ] ask sbranch [ ifelse (age <= 10) and (random-float killer > (lowsurviv * (quality + zeng) ) ) [ die ] [ifelse (age > 10 and age < 200) and (random-float killer > (highsurviv * (quality + zeng)) ) [ die ] [if (age >= 200) and (random-float killer > (lowsurviv * (quality + zeng)) ) [ ask patch-here [ sprout-deadguy-branch 1 [ set color black set size 2 set age 0 ; print 88 ]] die ] ] ] ] ask pbranch [ set pinepine branchparent if ( turtle pinepine = nobody ) [ if (age > 350) [ ask patch-here [ sprout-deadguy-branch 1 [ set color black set size 2 set age 0 ]]] die ] ] ask deadguy [ if (age > 10) [ die ] ] ask deadguy-branch [ if (age > 5) [ die ] ] end to feedback feedbackpro end to feedbackpro ask patches [ set dense 0 ifelse ( ((sum [count pines-here] of neighbors) + (sum [count spruce-here] of neighbors) + (sum [count pbranch-here] of neighbors) + (sum [count sbranch-here] of neighbors)) < 1 ) [ set dense 0 ] [ set dense ((sum [count pines-here] of neighbors) + (sum [count spruce-here] of neighbors) + (sum [count pbranch-here] of neighbors) + (sum [count sbranch-here] of neighbors)) ] if (dense = 0) [set zengX 0] if (dense = 1) [set zengX .125 ] if (dense = 2) [set zengX .25] if (dense = 3) [set zengX .375] if (dense = 4) [set zengX .5] if (dense = 5) [set zengX .625] if (dense = 6) [set zengX .75] if (dense = 7) [set zengX .875] if (dense = 8) [set zengX 1] set zeng (zengX * (((1 - quality) * .7125) - .2008 )) ] end to edgepro set edgedensity 0 set zengsum 0 set ndense 0 ask patches [ if (not any? turtles-here) [ set edgedensity edgedensity + ((sum [count pines-here] of neighbors4) + (sum [count spruce-here] of neighbors4) + (sum[count pbranch-here] of neighbors4)+ (sum[count sbranch-here] of neighbors4) + (sum[count deadguy-here] of neighbors4)) set zengsum zengsum + zeng ] if ( any? turtles-here) [ set ndense ndense + ((sum [count pines-here] of neighbors4) + (sum [count spruce-here] of neighbors4) + (sum[count pbranch-here] of neighbors4)+ (sum[count sbranch-here] of neighbors4) + (sum[count deadguy-here] of neighbors4)) ] set neibo ndense / 2 ] end to profilepro set pinefile 0 set sprucefile 0 set pinecount 0 set sprucecount 0 ask pines [ set pinefile (pinefile + pycor) set pinecount (pinecount + 1) ] ask spruce [ set sprucefile ( sprucefile + pycor) set sprucecount (sprucecount + 1) ] set pinef pinefile / pinecount set sprucef sprucefile / sprucecount end
There is only one version of this model, created about 10 years ago by George Malanson.
Attached files
File | Type | Description | Last updated | |
---|---|---|---|---|
MalansonResler2014.pdf | Paper in Journal of Theoretical Biology | about 10 years ago, by George Malanson | Download | |
MalansonReslerJTB2014.png | preview | Preview for 'MalansonReslerJTB2014' | about 10 years ago, by George Malanson | Download |
This model does not have any ancestors.
This model does not have any descendants.