breeds [druggies cops] druggies-own [wealth boss dope dope$ jailtimer] cops-own [] globals [ ticks plotTicks wealthRange sourceY sinkY sourceColor sinkColor patchColor jailColor jailTime debug? stopTick ; monitors set by plot proc -- no initialization needed runners bosses cruisers maxMaxNet maxWealth maxMaxWealth minWealth maxnet busts ] to startup ; called by netlogo when opening the model. set-defaults end to setup-globals set ticks 0 set plotTicks 0 set wealthRange 100 set jailTime 100 set debug? false set stopTick 5000 set patchColor yellow + 3 set jailColor gray + 2 set sourceColor red - 1 set sinkColor green - 1 set sourceY screen-edge-y - 4 set sinkY 0 - sourceY end to setup clear-all if seed? [random-seed 1] setup-globals setup-patches setup-turtles do-plots end to setup-patches ask patches [set pcolor patchColor] let y screen-edge-y - 2 ask patches with [pycor = sourceY][set pcolor sourceColor] ask patches with [pycor = sinkY][set pcolor sinkColor] end to setup-turtles ask random-n-of agents patches [sprout 1 [ set breed druggies set wealth 1 + random (wealthRange - 1) clear-dope set jailtimer 0 set-color ]] if cop? [ ask patch 0 0 [sprout 1 [ set breed cops set heading 90 set shape "car" set color black ]]] end to set-color if not busted? [ ifelse investing? [if shape != "circle" [set color bright-color set shape "circle" set heading 0] set size scale-size] [set color ifelse-value (boss = nobody) [gray][color-of boss] set shape "default" set size 1] ] end to-report scale-size ; Use log ?? (foreach [1.0E7 1.0E6 1.0E5 1.0E4 1.0E3 1.0E2 0][2.5 2.25 2 1.75 1.5 1.25 1][if wealth > ?1 [report ?2]]) end to go set ticks ticks + 1 let stop? false ask druggies [ without-interruption [ ifelse busted? [do-time] [ ifelse cruising? [hussle] [ ifelse scoring? [if pcolor = sourceColor [score]] [ ifelse selling? [if pcolor = sinkColor [sell]] [ ifelse settling? [if distance boss < 1 [settle]] [ if not investing? [show "Oops[" + ticks + "] Bad state -- " + tstate set stop? true] ]]]]] if not investing? and not busted? [forward 1] ; deal making creates bosses who don't move ]] ask druggies [set wealth max list 1 precision (wealth * (1 - costs%)) 2] ask cops [ let druggie random-one-of druggies-here with [selling?] if druggie != nobody [do-bust druggie] forward 1 ] do-plots ask druggies [set-color] if done? or stop? [show-billionaire do-report stop] end to-report done? report (maxWealth > 1.0E9) or (ticks = stopTick) or (maxWealth = 1) end to-report will-deal? [aBoss me] report profit-with aBoss > dealMin% * wealth-of me end to do-report print report-string end to show-billionaire if maxWealth > 1.0E9 [ask max-one-of druggies [wealth] [set shape "star" set size 3.5]] end to do-time set jailtimer jailtimer - 1 if jailtimer = 0 [if shape = "default" [set pcolor patchColor] set label no-label] end to do-bust [druggie] let theBoss boss-of druggie ask druggies with [boss = theBoss] [clear-dope] ask druggie [set jailtimer jailTime * 2 set pcolor jailColor] ask theBoss [clear-dope set jailtimer jailTime set shape "square"] end to hussle let t random-one-of other-druggies-here with [(cruising? or investing?) and will-deal? self myself] ifelse t != nobody [deal t][jiggle] end to deal [aBoss] set boss aBoss tdebug "deal" let deal$ dope-with aBoss set dope$ 0 - deal$ ask boss [ set dope$ dope$ - deal$ set wealth wealth - deal$ set label count druggies with [boss = myself] + " " setxy pxcor pycor if count druggies-here with [investing?] > 1 [ ; try not to put bosses on top of each other let p random-one-of neighbors with [count druggies-here with [investing?] = 0] if p != nobody [setxy pxcor-of p pycor-of p] ] ] setxy xcor-of boss ycor-of boss ifelse pycor-of boss >= sourceY [set heading 180][set heading 0] if pycor-of boss = sourceY [back 1] ; counter act forward 1 which will be called by "go" end to score tdebug "score" set dope (abs dope$) set dope$ 0 set heading 180 end to sell tdebug "sell" set dope$ dope set dope 0 ifelse pycor-of boss < pycor [set heading 180][set heading 0] end to settle tdebug "settle" set wealth wealth + my-profit dope$ let theDope$ dope$ ask boss [ set wealth wealth + theDope$ + boss-profit theDope$ set dope$ dope$ + theDope$ ; not zero because can do multiple deals if dope$ > -.5 [set dope$ 0] ; fix for precision errors w/ large floats ifelse random-float 1.0 < loyalty and will-deal? self myself [ ask myself [deal myself] ][ ask myself [ ; set dope 0 ; should already be 0, leave commented out as check set dope$ 0 set boss nobody set heading random 360 ] let myrunners count druggies with [boss = myself] ifelse dope$ = 0 [set label no-label][set label runners-for self + " "] ] ] end to do-plots let wealths values-from druggies [wealth] set maxWealth nice-num max wealths set minWealth nice-num min wealths if ticks mod plotFreq = 0 or done? [ set plotTicks plotTicks + 1 let bossSet druggies with [investing?] let runnerSet druggies with [running?] set bosses count bossSet let dealList values-from bossSet [count runnerSet with [boss = myself]] set runners sum dealList set maxnet ifelse-value (bosses = 0) [0][max dealList] set maxMaxNet max list maxMaxNet maxnet set cruisers count runnerSet - runners set busts count druggies with [busted?] set maxMaxWealth max list maxMaxWealth maxWealth set-current-plot "Wealth" set-plot-y-range 0 100 set-plot-x-range 0 maxWealth set-histogram-num-bars 20 histogram-list wealths set-current-plot "NetworkSize Distribution" let bars max list 1 maxnet set-histogram-num-bars bars set-plot-x-range 1 bars + 1 set-plot-y-range 0 1 histogram-list dealList set-current-plot "MaxWealth" set-plot-y-range 0 maxMaxWealth plot maxWealth if done? [set-plot-x-range 0 plotTicks - 1] set-current-plot "MaxNetwork" if maxMaxNet > 0 [set-plot-y-range 0 maxMaxNet] plot maxnet if done? [set-plot-x-range 0 plotTicks - 1] ] end to-report nice-num [n] if n < 1000 [report precision n 2] if n < 1.0E7 [report precision n 0] let p floor log n 10 ; places let d 10.0 ^ p ; places as power of 10 -- 10.0 forces float for large p otherwise 10^10 = 2147483647! let nums precision (n / d) 2 report nums * d end to-report report-string let settings ["invest%" "cut%" "dealMin%" "profit%" "costs%" "loyalty" "cop?" "agents" "seed?"] let monitors ["ticks" "bosses" "runners" "cruisers" "busts" "maxWealth" "minWealth" "maxnet"] report "Results: " + var-list monitors + "\n" + "Settings: " + var-list settings end to set-defaults set agents 200 set cop? true set seed? true set invest% .35 set cut% .75 set dealMin% .20 set profit% 10.00 set costs% .04 set loyalty .50 set plotFreq 1 end ; one-liners to-report investing? report (boss = nobody and dope$ < 0 and dope = 0) end to-report running? report not investing? and not busted? end to-report cruising? report (boss = nobody and dope$ = 0 and dope = 0 and not busted?) end to-report scoring? report (boss != nobody and dope$ < 0 and dope = 0) end to-report selling? report (boss != nobody and dope$ = 0 and dope > 0) end to-report settling? report (boss != nobody and dope$ > 0 and dope = 0) end to-report busted? report (jailtimer > 0) end to-report tstate report (word "boss:" boss " dope:" dope " dope$:" dope$ " wealth:" wealth) end to-report bright-color report 15 + (10 * random 10) end to clear-dope set boss nobody set dope$ 0 set dope 0 end to debug [s] if debug? [show "ticks:" + ticks + " " + s] end to tdebug [s] if debug? [debug (s + " " + tstate)] end to jiggle right 45 - random 91 forward 1 end to-report my-profit [dopeAmt] report precision ((1 - cut%) * (dopeAmt * profit%)) 2 end to-report boss-profit [dopeAmt] report precision (cut% * (dopeAmt * profit%)) 2 end to-report profit-with [aBoss] report my-profit dope-with aBoss end to-report dope-with [aBoss] report max list 1 precision (invest% * wealth-of aBoss) 2 end to-report runners-for [aBoss] report count druggies with [boss = aBoss] end to-report var-list [names] let s "" foreach names [set s s + ? + ":" + runresult ? + " "] report but-last s end ; parameter scanning, not needed by model for runs from GUI to test ; REMIND: Use log file set-defaults set plotFreq 100 file-close-all let filename "scanlog.txt" file-open filename ; note: will append, so put in a date/time marker let s "New param scan -- " + get-date-and-time print s file-print s let invest%s [.10 .50 .90] let cut%s [.50 .75 .90] let dealMin%s [.10 .50 .90] let profit%s [1.0 5.0 20.0] let costs%s [0 .05 .10] let loyaltys [0 .50 100.0] let run# 1 foreach invest%s [set invest% ? foreach cut%s [set cut% ? foreach dealMin%s [set dealMin% ? foreach profit%s [set profit% ? foreach costs%s [set costs% ? foreach loyaltys [set loyalty ? set s "Test " + run# + " using " + var-list ["invest%" "cut%" "dealMin%" "profit%" "costs%" "loyalty"] print s file-print s setup while [not done?] [go] file-print report-string file-close file-open filename set run# run# + 1 ]]]]]] file-close end @#$#@#$#@ GRAPHICS-WINDOW 284 10 822 569 16 16 16.0 1 10 1 1 1 0 CC-WINDOW 5 638 831 733 Command Center SLIDER 4 54 96 87 agents agents 100 500 200 50 1 NIL BUTTON 5 17 60 50 NIL setup NIL 1 T OBSERVER T NIL BUTTON 60 17 115 50 NIL go T 1 T OBSERVER NIL NIL PLOT 4 155 277 275 Wealth wealth number 0.0 100.0 0.0 10.0 true false PENS "default" 1.0 1 -16777216 false MONITOR 225 10 275 59 NIL ticks 3 1 BUTTON 115 17 170 50 step go ;test NIL 1 T OBSERVER T NIL MONITOR 550 568 619 617 NIL maxWealth\n 3 1 MONITOR 618 568 682 617 NIL minWealth 3 1 MONITOR 284 568 334 617 NIL bosses\n 3 1 SLIDER 4 91 96 124 invest% invest% 0.1 0.9 0.35 0.05 1 NIL SLIDER 94 91 186 124 cut% cut% 0.1 0.9 0.75 0.05 1 NIL SLIDER 4 122 96 155 profit% profit% 1 25 10.0 0.5 1 NIL SLIDER 94 122 186 155 costs% costs% 0 0.1 0.04 0.01 1 NIL MONITOR 330 568 393 617 NIL runners\n 3 1 MONITOR 375 568 425 617 NIL cruisers\n 3 1 SLIDER 184 122 276 155 loyalty loyalty 0 1 0.5 0.05 1 NIL SLIDER 184 91 276 124 dealMin% dealMin% 0 2 0.2 0.05 1 NIL PLOT 4 271 277 391 NetworkSize Distribution # of runners number 0.0 10.0 0.0 10.0 true false PENS "default" 1.0 1 -16777216 true MONITOR 680 568 730 617 NIL maxnet\n 3 1 PLOT 4 388 277 508 MaxWealth ticks wealth 0.0 10.0 0.0 10.0 true false SWITCH 95 54 185 87 cop? cop? 0 1 -1000 MONITOR 424 568 474 617 NIL busts 3 1 PLOT 4 504 277 624 MaxNetwork ticks runners 0.0 10.0 0.0 1.0 true false CHOOSER 730 568 822 613 plotFreq plotFreq 1 10 100 0 BUTTON 170 17 225 50 defaults set-defaults NIL 1 T OBSERVER T NIL SWITCH 185 54 275 87 seed? seed? 0 1 -1000 @#$#@#$#@ This model is part of a project under, and was supported by, National Institute on Drug Abuse grant DA-10736, "Drug Trends in Community Contexts," Michael Agar, principal investigator. WHAT IS IT? ----------- This is a model of a drug economy. The key point in the economy is that the bosses who employ dealers do so without actually holding drugs themselves, thus isolate themselves from direct risk of arrest. It includes a stripped down business life cycle for drug dealing: Hustling for deals, making a deal, going to the source to buy the drug (wholesale), carrying the drug to the buy and selling it, and returning to the boss to complete the deal. The players are exposed to risk of arrest via a cruising cop. The source/sink (wholesale seller, retail buyer) are "exogenous" and of infinite capacity. By this we mean the model does not attempt to create and evolve the entire drug supply chain. Rather we focus solely on the economics of the boss and his runners. This is done to simplify and clarify the actual dealer economy. The findings of this model can provide insights into a more inclusive drug supply chain model using something like the BeerGame model. HOW IT WORKS ------------ The model is initialized with a number ("agents" slider) of undifferentiated druggies with random wealth in the range 0-100. There is a switch ("cop?") controlling whether or not a police cruiser is present as well. (Thus in the code there are two specific NetLogo agent types called "breeds" -- druggies and cops) During each initial step of the model, druggies hustle for deals by moving randomly and looking to see if they are currently paired with a potential boss. Four sliders shape the deal: - invest%: The percent of his wealth a boss wants to invest in a deal. - cut%: The percent of the profit going to the boss. - dealMin%: The minimum deal a runner will accept as a percentage of his current wealth. - profit%: The profit on the transaction expressed as a percent of the boss's investment. During the hustle, a druggie asks a potential boss what deal he is willing to make. The boss calculates this from his current wealth as deal = (wealth * invest%). The profit on this sale is calculated using profit%. The amount going to the boss is cut% and to the potential runner is (1 - cut%). The potential runner calculates whether or not to risk it based on his current wealth. He does this by calculating dealMin% * wealth. If his cut is greater than this minimum value, he will perform the run. Thus the risk calculation for the runner is simple: if I'm poor, I'll do most deals, but if I'm well off, I'll be picky. This then begins the creation of differentiated druggies: bosses and runners. Also, as time goes by, all druggies spend money for food, dues to the mob and so on. This is calculated as cost% * wealth and is subtracted from the wealth each step of the model. We peg the lower bound of wealth at 1. This cost creates pressure for deals to occur. This starts the life cycle of a deal. The boss gives cash to the runner, subtracting it from his wealth. The runner goes to the source to buy the drugs. He then is in the carrying state and exposed to arrest. He goes to the sink/buyer to sell the drugs and then becomes free of risk of arrest after the sell. Finally he returns to the boss where they settle the deal. At this point, the runner can decide to make another run, based on what sort of deal the boss can make using the same calculations as above. Both the boss and runner are now richer, thus a re-deal is not assured but is likely. In addition to the deal calculation, a second factor is used: loyalty. This is a number between 0 and 1. The lower the number, the less likely the runner will attempt a re-deal. If its 0, the runner simply leaves. If its one, the runner always attempts a re-deal. If its .50, he'll attempt a re-deal 50% of the time. (Loyalty may be a bit of a misnomer here -- the boss could be of the sort that offs runners that leave his network, so it is motivated by fear and mob control as well as mutual benefit.) Note that hustlers can do a deal with either a free hustler or a druggie who has become a boss, if the above calculations for deal making indicate a deal. Thus a boss can have more than one runner at a given time. But the boss is always poorer during a deal due to his fronting the drug money to his runners. This creates interesting and complex dynamics. HOW TO USE IT ------------- Select an interesting number of agents, set cops? to include one or not, and adjust the parameters for deal making. Click "defaults" to use the startup values. Click "setup" to create the initial scene, then "go" to run the model. The model starts with a set of reasonable default values which can be re-installed by clicking "defaults". The model also allows you to have repeatable runs by setting "seed?" to On. This will install a random number generator seed at "setup" thus insuring a run with the same parameters will always proceed the same. Turning this off lets you have variations within runs with the same settings. The world the druggies live in has the source to the north, and the sink/buyer to the south, as red and green stripes of patches. When a deal is struck, the boss stops moving and changes to a brightly colored circle who's size is based on his wealth. His label shows how many runners he has at that time. The runner stops his random motion and starts a north/south trek as the life cycle of the deal. He takes on the color of his boss. This makes it easy to follow the progress of the deal. If a cop is present, he cruises the middle of the world, thus can easily nab a druggie carrying drugs as he goes from the red stripe to the green stripe. If an arrest is made, several things happen at once: - The busted runner's boss is also busted. - The boss and the busted runner become stationary during their jailtime. The boss turns to a square and the runner paints his patch gray. - The jailtime for the boss is 100, while the runners is twice that. - The boss and all his runners, including the busted runner, loose their current deal. - The non-busted runners for the boss return to hustling. - While in jail, the boss and busted runner still loose wealth as usual via the cost% parameter. (See code below to see how simple all this is!) Note that, due to the north/south routes, you can easily spot the busted runner and his boss as the model runs. Like most models, this is pretty "busy". To slow things down, you can use the "step" button rather than the "go" button. You can also move the display slider on top of the agent's world to the left to slow down the action while using the "go". The plot frequency can be changed from 1 to 10 to 100 steps using the plotFreq chooser. The model stops when the first dealer becomes a billionaire, changing his shape to a star, and printing the current displayed values and settings for the run. THINGS TO NOTICE ---------------- As the model runs, you'll notice a balance or equilibrium occurs between the number of bosses and runners. With a cop, this number drops and varies considerably. On the bottom of the display are four monitors for bosses, runners, cruisers (hustlers), and busts. They should sum to the number of agents you started with. They provide an interesting way to judge when the economy reaches an equilibrium. With loyalty set to 1, you'll find the cruisers drops to 0 when there is no cop. A set of plots and histograms are given to show the behavior during the run. THINGS TO TRY ------------- Start with the default deal settings by clicking "defaults". Click go and remember the ticks it took to build a billionaire. Note that the max wealth curve does indeed look a lot like a stock market with huge variations. What do you think causes the variations? (We are told in economics, queueing theory and chaos theory that inter-event delays can lead to instability and wide variation.) Change the invest% and cut% to their max of 90%. Run the model and compare the ticks. (800 vs 406 for my runs). Does this make sense? Re-establish the defaults and then try min/max loyalty. (1703 vs 576 for my runs) Again, how would you explain this? Similarly, look for states where the economy disolves into no bosses. Here's a set of parameters that do this: - invest%:0.1 - cut%:0.5 - dealMin%:0.5 - profit%:1.0 - costs%:0.05 - loyalty:0.0 Does this make sense? How about moving the loyalty to 1.00 .. should help, right? Try it. Now bump the profit% to 2.00. What happens now? Any ideas why? Then set the cut% to .75. Now what differences do you see? Finally, set the invest% to .25. This is getting pretty interesting, right? Note: You can make the runs fast by turning off the display (the on/off slider on the top of the model's view area) and setting the plotFreq to 100. Remember to reset the plotFreq after hitting defaults if you do this. Use the 3D button after you start a run to see if you notice different things during the run. What stands out more? EXTENDING THE MODEL ------------------- This model has been kept very simple indeed in order to make it both easy to change and to investigate only the actual economic topology of drug dealing. - Add more cops. - Extend the bust to include all the druggies, not just the busted one and the boss. - Create a slider for changing the jailtime, and the percent served by bosses vs runners. - Let bosses form a hierarchy by taking deals from other bosses and having their runners do the deal. - Make the sources and sinks limited and dynamic. - Look into a true drug supply chain similar to the BeerGame but with the DrugSupply economy. See: http://backspaces.net/models/beergame.html NETLOGO FEATURES ---------------- - Teamwork: The simplicity of NetLogo made it quite easy for three of us to conspire on the model. For example, rather than the complex description of a "bust" above, I can simply show this: to do-bust [druggie] let theBoss boss-of druggie ask druggies with [boss = theBoss] [clear-dope] ask druggie [set jailtimer jailTime * 2 set pcolor jailColor] ask theBoss [clear-dope set jailtimer jailTime set shape "square"] end Reading the code is far less error-prone than a verbal explanation. - 3D, Shapes, Sizes and Colors: Being able to run the model with no modifications in 3D helps us show it to non-scientests without explaining all the "dots on the screen" of the 2D model. We find clients of our consulting are often puzzled by more traditional models. Similarly, the ease of changing sizes, shapes, and colors greatly improve visualization. Things like: The busted dealers are squares, the runners and cruisers are arrows, the cop is in a car, richer means bigger, runners are the color of their boss, and so on are a great help. - Breeds: Although one can always add tags to agents for distinguishing very different agents (cops and druggies in this model), breeds make it far more manageable. - Startup: We find the convention of the "startup" procedure (which always runs as soon as the model is loaded) quite convenient. In this model for example, we want to start with the same defaults no matter how the model was last saved. So we simply press the "defaults" button (run the set-defaults procedure) within startup. - Random-seed: Because we want reproducible results while we investigate the model's behavior, it is quite useful to be able to set the random number generator's initial seed. We can turn it off easily when we want to investigate variation within runs of the same parameter settings as well. - Plots & Histograms: We tried dozens of different plots and histograms before settling on the four shown here. The ease in quick modification was invaluable. - Numerics: The smooth transition between integers and floating point numbers was important for this model due to the wealth of the really rich is in the billions while the poorest runners is almost always 1, the minimum. Managing this with Java's ints, longs, floats and doubles can be quite difficult. [Note: A slight improvement to NetLogo's numerics might include a version of the "precision" command which works on the numeric portion of large floats. So possibly "precision-float 1.23456E12 2" would produce 1.23E12.] RELATED MODELS -------------- DrugSupply is a second model in an NIH funded project to investigate illicit drug epidemics. An earlier Netlogo model from the project, DrugTalk, looked at demand as a function of consumer evaluation, http://ccl.northwestern.edu/netlogo/models/community/Drugtalk. CREDITS AND REFERENCES ---------------------- This model is part of a project under, and was supported by, National Institute on Drug Abuse grant DA-10736, "Drug Trends in Community Contexts," Michael Agar, principal investigator. Design and implementation of the model was carried out by Stephen Guerin and Owen Densmore of Redfish Group in Santa Fe, NM. @#$#@#$#@ default true 0 Polygon -7566196 true true 150 5 40 250 150 205 260 250 airplane true 0 Polygon -7566196 true true 150 0 135 15 120 60 120 105 15 165 15 195 120 180 135 240 105 270 120 285 150 270 180 285 210 270 165 240 180 180 285 195 285 165 180 105 180 60 165 15 arrow true 0 Polygon -7566196 true true 150 0 0 150 105 150 105 293 195 293 195 150 300 150 box false 0 Polygon -7566196 true true 150 285 285 225 285 75 150 135 Polygon -7566196 true true 150 135 15 75 150 15 285 75 Polygon -7566196 true true 15 75 15 225 150 285 150 135 Line -16777216 false 150 285 150 135 Line -16777216 false 150 135 15 75 Line -16777216 false 150 135 285 75 bug true 0 Circle -7566196 true true 96 182 108 Circle -7566196 true true 110 127 80 Circle -7566196 true true 110 75 80 Line -7566196 true 150 100 80 30 Line -7566196 true 150 100 220 30 butterfly true 0 Polygon -7566196 true true 150 165 209 199 225 225 225 255 195 270 165 255 150 240 Polygon -7566196 true true 150 165 89 198 75 225 75 255 105 270 135 255 150 240 Polygon -7566196 true true 139 148 100 105 55 90 25 90 10 105 10 135 25 180 40 195 85 194 139 163 Polygon -7566196 true true 162 150 200 105 245 90 275 90 290 105 290 135 275 180 260 195 215 195 162 165 Polygon -16777216 true false 150 255 135 225 120 150 135 120 150 105 165 120 180 150 165 225 Circle -16777216 true false 135 90 30 Line -16777216 false 150 105 195 60 Line -16777216 false 150 105 105 60 car false 0 Polygon -7566196 true true 300 180 279 164 261 144 240 135 226 132 213 106 203 84 185 63 159 50 135 50 75 60 0 150 0 165 0 225 300 225 300 180 Circle -16777216 true false 180 180 90 Circle -16777216 true false 30 180 90 Polygon -16777216 true false 162 80 132 78 134 135 209 135 194 105 189 96 180 89 Circle -7566196 true true 47 195 58 Circle -7566196 true true 195 195 58 circle false 0 Circle -7566196 true true 30 30 240 circle 2 false 0 Circle -7566196 true true 16 16 270 Circle -16777216 true false 46 46 210 cow false 0 Polygon -7566196 true true 200 193 197 249 179 249 177 196 166 187 140 189 93 191 78 179 72 211 49 209 48 181 37 149 25 120 25 89 45 72 103 84 179 75 198 76 252 64 272 81 293 103 285 121 255 121 242 118 224 167 Polygon -7566196 true true 73 210 86 251 62 249 48 208 Polygon -7566196 true true 25 114 16 195 9 204 23 213 25 200 39 123 face happy false 0 Circle -7566196 true true 8 8 285 Circle -16777216 true false 60 75 60 Circle -16777216 true false 180 75 60 Polygon -16777216 true false 150 255 90 239 62 213 47 191 67 179 90 203 109 218 150 225 192 218 210 203 227 181 251 194 236 217 212 240 face neutral false 0 Circle -7566196 true true 8 7 285 Circle -16777216 true false 60 75 60 Circle -16777216 true false 180 75 60 Rectangle -16777216 true false 60 195 240 225 face sad false 0 Circle -7566196 true true 8 8 285 Circle -16777216 true false 60 75 60 Circle -16777216 true false 180 75 60 Polygon -16777216 true false 150 168 90 184 62 210 47 232 67 244 90 220 109 205 150 198 192 205 210 220 227 242 251 229 236 206 212 183 fish false 0 Polygon -1 true false 44 131 21 87 15 86 0 120 15 150 0 180 13 214 20 212 45 166 Polygon -1 true false 135 195 119 235 95 218 76 210 46 204 60 165 Polygon -1 true false 75 45 83 77 71 103 86 114 166 78 135 60 Polygon -7566196 true true 30 136 151 77 226 81 280 119 292 146 292 160 287 170 270 195 195 210 151 212 30 166 Circle -16777216 true false 215 106 30 flag false 0 Rectangle -7566196 true true 60 15 75 300 Polygon -7566196 true true 90 150 270 90 90 30 Line -7566196 true 75 135 90 135 Line -7566196 true 75 45 90 45 flower false 0 Polygon -11352576 true false 135 120 165 165 180 210 180 240 150 300 165 300 195 240 195 195 165 135 Circle -7566196 true true 85 132 38 Circle -7566196 true true 130 147 38 Circle -7566196 true true 192 85 38 Circle -7566196 true true 85 40 38 Circle -7566196 true true 177 40 38 Circle -7566196 true true 177 132 38 Circle -7566196 true true 70 85 38 Circle -7566196 true true 130 25 38 Circle -7566196 true true 96 51 108 Circle -16777216 true false 113 68 74 Polygon -11352576 true false 189 233 219 188 249 173 279 188 234 218 Polygon -11352576 true false 180 255 150 210 105 210 75 240 135 240 house false 0 Rectangle -7566196 true true 45 120 255 285 Rectangle -16777216 true false 120 210 180 285 Polygon -7566196 true true 15 120 150 15 285 120 Line -16777216 false 30 120 270 120 leaf false 0 Polygon -7566196 true true 150 210 135 195 120 210 60 210 30 195 60 180 60 165 15 135 30 120 15 105 40 104 45 90 60 90 90 105 105 120 120 120 105 60 120 60 135 30 150 15 165 30 180 60 195 60 180 120 195 120 210 105 240 90 255 90 263 104 285 105 270 120 285 135 240 165 240 180 270 195 240 210 180 210 165 195 Polygon -7566196 true true 135 195 135 240 120 255 105 255 105 285 135 285 165 240 165 195 line true 0 Line -7566196 true 150 0 150 300 pentagon false 0 Polygon -7566196 true true 150 15 15 120 60 285 240 285 285 120 person false 0 Circle -7566196 true true 110 5 80 Polygon -7566196 true true 105 90 120 195 90 285 105 300 135 300 150 225 165 300 195 300 210 285 180 195 195 90 Rectangle -7566196 true true 127 79 172 94 Polygon -7566196 true true 195 90 240 150 225 180 165 105 Polygon -7566196 true true 105 90 60 150 75 180 135 105 plant false 0 Rectangle -7566196 true true 135 90 165 300 Polygon -7566196 true true 135 255 90 210 45 195 75 255 135 285 Polygon -7566196 true true 165 255 210 210 255 195 225 255 165 285 Polygon -7566196 true true 135 180 90 135 45 120 75 180 135 210 Polygon -7566196 true true 165 180 165 210 225 180 255 120 210 135 Polygon -7566196 true true 135 105 90 60 45 45 75 105 135 135 Polygon -7566196 true true 165 105 165 135 225 105 255 45 210 60 Polygon -7566196 true true 135 90 120 45 150 15 180 45 165 90 square false 0 Rectangle -7566196 true true 30 30 270 270 square 2 false 0 Rectangle -7566196 true true 30 30 270 270 Rectangle -16777216 true false 60 60 240 240 star false 0 Polygon -7566196 true true 60 270 150 0 240 270 15 105 285 105 Polygon -7566196 true true 75 120 105 210 195 210 225 120 150 75 target false 0 Circle -7566196 true true 0 0 300 Circle -16777216 true false 30 30 240 Circle -7566196 true true 60 60 180 Circle -16777216 true false 90 90 120 Circle -7566196 true true 120 120 60 tree false 0 Circle -7566196 true true 118 3 94 Rectangle -6524078 true false 120 195 180 300 Circle -7566196 true true 65 21 108 Circle -7566196 true true 116 41 127 Circle -7566196 true true 45 90 120 Circle -7566196 true true 104 74 152 triangle false 0 Polygon -7566196 true true 150 30 15 255 285 255 triangle 2 false 0 Polygon -7566196 true true 150 30 15 255 285 255 Polygon -16777216 true false 151 99 225 223 75 224 truck false 0 Rectangle -7566196 true true 4 45 195 187 Polygon -7566196 true true 296 193 296 150 259 134 244 104 208 104 207 194 Rectangle -1 true false 195 60 195 105 Polygon -16777216 true false 238 112 252 141 219 141 218 112 Circle -16777216 true false 234 174 42 Rectangle -7566196 true true 181 185 214 194 Circle -16777216 true false 144 174 42 Circle -16777216 true false 24 174 42 Circle -7566196 false true 24 174 42 Circle -7566196 false true 144 174 42 Circle -7566196 false true 234 174 42 turtle true 0 Polygon -11352576 true false 215 204 240 233 246 254 228 266 215 252 193 210 Polygon -11352576 true false 195 90 225 75 245 75 260 89 269 108 261 124 240 105 225 105 210 105 Polygon -11352576 true false 105 90 75 75 55 75 40 89 31 108 39 124 60 105 75 105 90 105 Polygon -11352576 true false 132 85 134 64 107 51 108 17 150 2 192 18 192 52 169 65 172 87 Polygon -11352576 true false 85 204 60 233 54 254 72 266 85 252 107 210 Polygon -7566196 true true 119 75 179 75 209 101 224 135 220 225 175 261 128 261 81 224 74 135 88 99 wheel false 0 Circle -7566196 true true 3 3 294 Circle -16777216 true false 30 30 240 Line -7566196 true 150 285 150 15 Line -7566196 true 15 150 285 150 Circle -7566196 true true 120 120 60 Line -7566196 true 216 40 79 269 Line -7566196 true 40 84 269 221 Line -7566196 true 40 216 269 79 Line -7566196 true 84 40 221 269 x false 0 Polygon -7566196 true true 270 75 225 30 30 225 75 270 Polygon -7566196 true true 30 75 75 30 270 225 225 270 @#$#@#$#@ NetLogo 2.1.0 @#$#@#$#@ @#$#@#$#@ @#$#@#$#@