Java StarLogo 1.1 `turtle` breeds [ frogs toads newts efts salamanders caecilians timer-setter] globals [ outputs cluster-ratio cycles moves moves-per-jitter speed started affection radius density breeds-in-use population] to jitter-how-often output moves-per-jitter end to patches-on-neighborhood-edge let [ :edge ( radius + radius + 1 ) ] output :edge end to neighborliness output affection / 1000 end to offset-list let [ :a-list ( butfirst ( butfirst ( list 0 0 ) ) ) ] let [ :an-offset radius ] repeat patches-on-neighborhood-edge [ let [ :a-list ( fput :an-offset :a-list ) ] let [ :an-offset ( :an-offset - 1 ) ] ] output :a-list end to frog-color let [ :some-color cyan ] output :some-color end to toad-color let [ :some-color red ] output :some-color end to newt-color let [ :some-color blue ] output :some-color end to eft-color let [ :some-color yellow ] output :some-color end to salamander-color let [ :some-color green ] output :some-color end to caecilian-color let [ :some-color brown ] output :some-color end to setup-turtles if breed = frogs [ setcolor frog-color ] if breed = toads [ setcolor toad-color ] if breed = newts [ setcolor newt-color ] if breed = efts [ setcolor eft-color ] if breed = salamanders [ setcolor salamander-color ] if breed = caecilians [ setcolor caecilian-color ] fd random 500 setxy (int xcor) (int ycor) end to move-turtle if breed = timer-setter [ setstarted timer die ] ;; move this task out of the setup code, the hard way. if breed = frogs [ move-creature-colored frog-color ] if breed = toads [ move-creature-colored toad-color ] if breed = newts [ move-creature-colored newt-color ] if breed = efts [ move-creature-colored eft-color ] if breed = salamanders [ move-creature-colored salamander-color ] if breed = caecilians [ move-creature-colored caecilian-color ] ;; neighbor-matrix end ;; to creature-setup ;; creatures-have minimum-percentage ;; creatures-have test-distance ;; set-minimum-percentage 0.3 ;; if turtle? [activate-demon turtle-move-demon] ;; if frog? [activate-demon frog-move-demon] ;; activate-demon avoid-doubling-demon ;; end to neighbors-colored :some-color let [:local-color :some-color] let [ :neighbors 0 ] let [ :v-list offset-list ] let [ :h-list :v-list ] repeat length :v-list [ let [ :v-offset first :v-list ] let [ :v-list ( lput :v-offset ( butfirst :v-list ) ) ] repeat length :h-list [ let [ :h-offset first :h-list ] let [ :h-list ( lput :h-offset ( butfirst :h-list ) ) ] let [ :turtle-list ( list-of-turtles-at :h-offset :v-offset ) ] repeat ( length :turtle-list ) [ let [ :a-color ( color-of ( first :turtle-list ) ) ] if ( :a-color = :local-color ) [ let [ :neighbors ( :neighbors + 1 ) ] ] let [ :turtle-list ( butfirst :turtle-list ) ] ] ] ] output :neighbors end to turtle-neighbors output ( ( neighbors-colored frog-color ) + ( neighbors-colored toad-color ) + ( neighbors-colored newt-color ) + ( neighbors-colored eft-color ) + ( neighbors-colored salamander-color ) + ( neighbors-colored caecilian-color ) + 1 ;; count self ) end to move-creature-colored :some-color let [ :local-color :some-color ] ifelse ( ( ( neighbors-colored :local-color ) < ( neighborliness * turtle-neighbors ) ) or ( count-turtles-here > 1 ) or ( 0 = random jitter-how-often ) ) [ find-free-patch ] [ ] end ;; to turtle-move-demon ;; if turtle-neighbors ;; < (minimum-percentage * total-neighbors) ;; [find-free-patch] ;; end ;; to frog-move-demon ;; if frog-neighbors ;; < (minimum-percentage * total-neighbors) ;; [find-free-patch] ;; end ;; to avoid-doubling-demon ;; if ask patch-here [creature-total > 1] ;; [find-free-patch] ;; end to offsets :zero-to-eight if :zero-to-eight = 0 [ let [:alist ( list 0 1 )] output :alist ] if :zero-to-eight = 1 [ let [:alist ( list 1 1 )] output :alist ] if :zero-to-eight = 2 [ let [:alist ( list 1 0 )] output :alist ] if :zero-to-eight = 3 [ let [:alist ( list 1 -1 )] output :alist ] if :zero-to-eight = 4 [ let [:alist ( list 0 -1 )] output :alist ] if :zero-to-eight = 5 [ let [:alist ( list -1 -1 )] output :alist ] if :zero-to-eight = 6 [ let [:alist ( list -1 0 )] output :alist ] if :zero-to-eight = 7 [ let [:alist ( list -1 1 )] output :alist ] if :zero-to-eight = 8 [ let [:alist ( list 0 0 )] output :alist ] end to find-free-patch let [ :index random 8 ] let [ :offlist ( offsets :index ) ] ifelse ( ( count-turtles-at (first :offlist) (last :offlist) ) = 0 ) [ setxy ( xcor + ( first :offlist ) ) ( ycor + ( last :offlist ) ) ] [ ] end ;; to find-free-patch ;; set-heading 45 * random 8 ;; if ask patch-polar test-distance heading ;; [creature-total = 0] ;; [forward-grid test-distance] ;; end ;; to turtle-neighbors ;; ask patch-here [neighbor-sum [turtle-total]] ;; end ;; to frog-neighbors ;; ask patch-here [neighbor-sum [frog-total]] ;; end ;; to creature-neighbors ;; ask patch-here [neighbor-sum [creature-total]] ;; end `observer` to amphibians-per-patch output ( density / 100 ) end to amphibian-breed-count let [:a-breed-count breeds-in-use] output :a-breed-count end to cleanup-prior clearall end to setup clearall resett setcycles 0 setmoves 0 setspeed 0 setstarted 0 ;; totally bogus value just to have one set; really set by turtle timer-setter setoutputs 0 setcluster-ratio 0 let [ :amphibian-density amphibians-per-patch ] let [ :amphibian-breeds amphibian-breed-count ] let [ :breed-count ( int ( ( screen-height * screen-width * :amphibian-density ) / :amphibian-breeds ) ) ] create-frogs :breed-count create-toads :breed-count if ( :amphibian-breeds > 2 ) [ create-newts :breed-count ] if ( :amphibian-breeds > 3 ) [ create-efts :breed-count ] if ( :amphibian-breeds > 4 ) [ create-salamanders :breed-count ] if ( :amphibian-breeds > 5 ) [ create-caecilians :breed-count ] setpopulation ( :breed-count * :amphibian-breeds ) ;; constant displayed just for info create-timer-setter 1 ask-turtles [ setup-turtles ] end ;; to setup ;; clear-all ;; set-scale 128 64 ;; create-breed frog ;; create-turtle 3000 ;; create-frog 3000 ;; creature-setup ;; end ;; if breed = frogs [ setcolor cyan ] ;; if breed = toads [ setcolor red ] ;; if breed = newts [ setcolor blue ] ;; if breed = efts [ setcolor yellow ] ;; if breed = salamanders [ setcolor green ] ;; if breed = caecilians [ setcolor brown ] to frog-ratio output ( ( max 0 ( sum-of-frogs [ neighbors-colored cyan ] ) ) / ( max 1 ( sum-of-frogs [ turtle-neighbors ] ) ) ) end to toad-ratio output ( ( max 0 ( sum-of-toads [ neighbors-colored red ] ) ) / ( max 1 ( sum-of-toads [ turtle-neighbors ] ) ) ) end to newt-ratio output ( ( max 0 ( sum-of-newts [ neighbors-colored blue ] ) ) / ( max 1 ( sum-of-newts [ turtle-neighbors ] ) ) ) end to eft-ratio output ( ( max 0 ( sum-of-efts [ neighbors-colored yellow ] ) ) / ( max 1 ( sum-of-efts [ turtle-neighbors ] ) ) ) end to salamander-ratio output ( ( max 0 ( sum-of-salamanders [ neighbors-colored green ] ) ) / ( max 1 ( sum-of-salamanders [ turtle-neighbors ] ) ) ) end to caecilian-ratio output ( ( max 0 ( sum-of-caecilians [ neighbors-colored brown ] ) ) / ( max 1 ( sum-of-caecilians [ turtle-neighbors ] ) ) ) end to move-cycles-per-cluster-calculation output 20 end to do-cluster-calculation let [ :frog-proportion frog-ratio ] let [ :toad-proportion toad-ratio ] let [ :newt-proportion newt-ratio ] let [ :eft-proportion eft-ratio ] let [ :salamander-proportion salamander-ratio ] let [ :caecilian-proportion caecilian-ratio ] let [:amphibian-average ( ( :frog-proportion + :toad-proportion + :newt-proportion + :eft-proportion + :salamander-proportion + :caecilian-proportion ) / amphibian-breed-count ) ] print ( se [Frog------->cluster ratio:] :frog-proportion ) print ( se [Toad------->cluster ratio:] :toad-proportion ) if ( amphibian-breed-count > 2 ) [ print ( se [Newt------->cluster ratio:] :newt-proportion ) ] if ( amphibian-breed-count > 3 ) [ print ( se [Eft-------->cluster ratio:] :eft-proportion ) ] if ( amphibian-breed-count > 4 ) [ print ( se [Salamander->cluster ratio:] :salamander-proportion ) ] if ( amphibian-breed-count > 5 ) [ print ( se [Caecilian-->cluster ratio:] :caecilian-proportion ) ] print ( se [Amphibian-->average ratio:] :amphibian-average ) let [ :elapsed-time ( ( timer - 0 ) - ( started - 0 ) ) ] print ( se [Elapsed Time------------>:] ( se :elapsed-time ( se timer started ) ) ) print "-" setcluster-ratio :amphibian-average setoutputs ( outputs + 2 + amphibian-breed-count ) setcycles ( cycles + 1 ) setspeed ( :elapsed-time / cycles ) end ;; display verbs used by monitors to display-population output population end to display-cluster-ratio output cluster-ratio end to display-speed output speed end to display-cycles output cycles end to display-moves output moves end ;; to cluster-ratios-demon ;; every 20 ;; [type [Turtle cluster ratios:] ;; print (turtle-sum [turtle-neighbors)]) ;; / (turtle-sum [total-neighbors]) ;; type [Frog cluster ratios:] ;; print (frog-sum [frog-neighbrs]) ;; / (frog-sum [total-neighbors])] ;; end to outputs-limit output 300 end to go do-cluster-calculation repeat move-cycles-per-cluster-calculation [ ask-turtles [ move-turtle ] setmoves ( moves + 1 ) if outputs > outputs-limit [ wait 2 clear-output setoutputs 0 ] ] end `information` Welcome to Like Unto Like, a little demo inspired by some code Brett Smith asked me to translate to StarLogo for Java 1.1 from some older version of StarLogo. The object of the demo is to show an emergent behavior, how even a little preference to have more neighbors of ones own kind than the average of neighbors of all kinds can lead to heavily segregated neighborhoods over time. The demo interface consists of two buttons, a data display monitor, a patch screen area, and four sliders. Conceptually, from two to six kinds of creatures inhabit the patch screen area, moving to an empty patch if not comfortable with the proportion of their own kind of creature in their neighborhood. The monitor shows: The average over all creatures of the portion of their own kind to the total of all kinds in that creature's neighborhood. The sliders control: Density of creatures: too dense and it is hard to move, too sparse and nothing much interesting happens. A density of fifty percent is a good place to start exploring this setting. Neighborhood size: use a radius of 1 (a three by three square) until very comfortable with the rest of the demo; it is very hard to gain an intuition of what a larger neighborhood contains when seeing it on the screen. Fraction of own kind: creatures will attempt to leave a neighborhood where their own kind is more outnumbered than this fraction. Decrease this fraction when increasing the number of breeds for reasons that will become obvious. Number of breeds to use: the original demo used two, this one provides for using two to six. Six are more colorful, two are easier perhaps to understand. The buttons do: The Setup Run button puts creatures on the patch area. The Make It Go button starts them moving to find places with enough of their own kind. The windows have: The output window gives more detail about the clustering ratio of each breed of creature in use. The information window contains this message. Enjoy! xanthian. Kent Paul Dolan, under http://www.well.com/user/xanthian/, this demo is public/code/StarLogo/FrogsAndToads/likeuntolike.slogo `interface` SLButton turtle-or-observer? observer top-left 0 167 width-height 118 36 name "Clean Up After Run" line-to-run "cleanup-prior" forever? false button-number 4 show-name? true SLSlider top-left 40 4 width-height 282 25 name "density in creatures per 100 patches " variable "density" min-value 10 max-value 90 current-value 25 slider-number 2 show-name? true SLSlider top-left 118 4 width-height 282 25 name "breeds to use ( 2 to 6 )" variable "breeds-in-use" min-value 2 max-value 6 current-value 6 slider-number 3 show-name? true SLSlider top-left 144 4 width-height 282 25 name "average move rounds per wanderlust per creature" variable "moves-per-jitter" min-value 1 max-value 10000 current-value 378 slider-number 4 show-name? true SLMonitor top-left 305 410 width-height 85 36 name "total population" list-to-run "display-population" digits 0 delay 1.0 monitor-number 5 show-name? true SLMonitor top-left 229 5 width-height 98 36 name "accounting rounds" list-to-run "display-cycles" digits 0 delay 1.0 monitor-number 3 show-name? true SLMonitor top-left 267 4 width-height 99 36 name "move rounds" list-to-run "display-moves" digits 0 delay 0.2 monitor-number 4 show-name? true SLMonitor top-left 305 2 width-height 404 36 name "accounting round 'average per creature' local clustering ratio of own kind / all kinds" list-to-run "display-cluster-ratio" digits 3 delay 1.0 monitor-number 1 show-name? true SLMonitor top-left 191 3 width-height 281 36 name "average seconds between accounting rounds" list-to-run "display-speed" digits 3 delay 1.0 monitor-number 2 show-name? true SLSlider top-left 92 4 width-height 282 25 name "neighborhood size in steps from center to side" variable "radius" min-value 1 max-value 5 current-value 1 slider-number 1 show-name? true SLSlider top-left 66 4 width-height 282 25 name "least density of like kind to stay, in parts per 1000" variable "affection" min-value 0 max-value 500 current-value 200 slider-number 0 show-name? true SLButton turtle-or-observer? observer top-left 0 80 width-height 82 37 name "Make It Go" line-to-run "go" forever? true button-number 3 show-name? true SLButton turtle-or-observer? observer top-left 0 6 width-height 68 37 name "Setup Run" line-to-run "setup" forever? false button-number 2 show-name? true SLCanvas top-left 3 289 `settings` patch-size 5 num-shapes 256 screen-half-width 32 screen-half-height 29 interface-window-xcor 6 interface-window-ycor 0 interface-window-size 619 344 output-window-xcor 642 output-window-ycor 1 output-window-width 812 output-window-height 503 info-window-xcor 181 info-window-ycor -2 info-window-width 493 info-window-height 508 control-center-xcor 637 control-center-ycor -1 control-center-width 300 control-center-height 419 turtle-command-center-height 138 observer-command-center-height 138 plot-window-xcor 0 plot-window-ycor 0 plot-window-width 508 plot-window-height 372 `string table` H4sIAAAAAAAAAGNgYGAAABzfRCEEAAAAAAAABA== `symbol table` H4sIAAAAAAAAAGNgYGAAABzfRCEEAAAAAAAABA== `double table` H4sIAAAAAAAAAGNgYGAAABzfRCEEAAAAAAAABA== `list table` H4sIAAAAAAAAAGNgYGAAABzfRCEEAAAAAAAABA== `observer world` H4sIAAAAAAAAAI1OSw6CMBAdVKiAJBzBtQk7D+BRKDBoTW2bdkrC7R0aw9omk7yZ 9+mDtrdDQL+gvwaShP0D9neDQqN50ovxHYTTlhyaRNVJvLMnngsIG8lFCknRjDoG Qt95ScryIYNiXEeNG32A/GOXBI/QJtg51r4VsSUF5sEhTgxzEPyZp7QUUMp5xpEj tyICCi8nFbegM4gJTVC08lJCM3j2h06ZLgbkUwWVsy5q+fPWW6csFft/vgXrSEMw AQAAAAABMA== `patch world` H4sIAAAAAAAAAH3VycpzbXqe4TfBJIIQ0EADDRQQQgghhFDfN6v6vsqbYGNMPDB2 kdQgmWmTswmp2Lmf7+P/Lx0LJC3pWNej4fn1X//uz3//l3/4p/H//Mvf/+Uf/677 atcvv/7mf/3Dv/6Pf7v/j3/+h7++97/+0z//47/897/801/vR1//+c///K9/+fM/ /stfvwy//uZ///ujva//8m8Hfffc19f4r6//9v+Oef2ffz+6Pr+7/kP9c7QerA8b wIawEWwMm8CmsBlsDlvAlrAVbA3bwLawHWwPO8COsBPsDLvArrAb7A57wJ6wF6yT vT/bT7D7CXY/xe6n2P0Mu59h93Psfo7dL7D7BXa/xO6X2P0Ku19h92vsfo3db7D7 DXa/xe632P0Ou99h93vsfo/dH7D7A3Z/xO6P2P0Juz9h97fY/W330eq37kf0rY3R erA+bAAbwkawMWwCm8JmsDlsAVvCVrA1bAPbwnawPewAO8JOsDPsArvCbrA77AF7 wl6wTvb+bD/B7ifY/RS7n2L3M+x+ht3Psfs5dr/A7hfY/RK7X2L3K+x+hd2vsfs1 dr/B7jfY/Ra732L3O+x+h93vsfs9dn/A7g/Y/RG7P2L3J+z+hN3fYvf/25istbEX dl+wHqwPG8CGsBFsDJvAprAZbA5bwJawFWwN28C2sB1sDzvAjrAT7Ay7wK6wG+wO e8CesBesk70/W7UxGnbVxmjYVRujYVdtjIZdtTEadtXGaNhVG6NhV22Mhl21MRp2 1cZo2FUbo2FXbYyGXbUxGnbVxmjYVRujYVdtjNZ9tNbGfth9wXqwPmwAG8JGsDFs ApvCZrA5bAFbwlawNWwD28J2sD3sADvCTrAz7AK7wm6wO+wBe8JesE72/mzVxmjY VRujYVdtjIZdtTEadtXGaNhVG6NhV22Mhl21MRp21cZo2FUbo2FXbYyGXbUxGnbV xmjYVRujYVdtjIZdtTFa99FaGwdh9wXrwfqwAWwIG8HGsAlsCpvB5rAFbAlbwdaw DWwL28H2sAPsCDvBzrAL7Aq7we6wB+wJe8E62fuzVRujYVdtjIZdtTEadtXGaNhV G6NhV22Mhl21MRp21cZo2FUbo2FXbYyGXbUxGnbVxmjYVRujYVdtjIZdtTEadtXG aN1Ha20cht0XrAfrwwawIWwEG8MmsClsBpvDFrAlbAVbwzawLWwH28MOsCPsBDvD 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 a2My7Fobk2HX2pis+2j/FyJpdT/howEAAAGj4Q== `turtle world` H4sIAAAAAAAAAE2OwU4DMQxEpzTZRW3FiSOHHjghwaH0A/iUmo27WSlNVonRwlfw ycXZVhVzemN57MHDQb6yBN4WIeHDB276RRM49uKV97CfmdkpPqMdQ5KRo5o32C6F lBWfYH66mTZYz8f+pe913aUpjup2sMXTyIovMN+XjMFy8mn+2xR/3XxH65ncEHs1 j9daLewxp74oLmAlkat4Bxt5kopLGD7OZLQIBTpRdJzrwGLVEXdDGChW32Ajw4nz a2ERrj3as6q++QPdwzCIGQEAAAAAARk=