;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; DECLARATIONS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;extensions [sound] ;;only included for fun. Turned off for now breed [ people ] globals [ time ;Counters and statistics for person-to-person conversations (internal influence) contacts ;; number of contacts made with other individuals old-contacts ;; previous total contacts-per-time ;; how many contacts made this time period conversation-starts ;; total number of conversations old-conversation-starts ;; previous total starts-per-time ;; how many conversations made this time period - number ended conversation-ends ;; total number ended old-conversation-ends ;; previous total ends-per-time ;; how many conversations made this time period - number ended active-conversations ;; total number of conversations currently active friend-total ;; keep track of conversations - strangers, acquaintences, buddies ;External influence counters and statistics externals ;; total number of external mass media contacts ] ;Attributes for patches (other than Netlogo-defined attributes patches-own [ intensity ;; used to create "fitness"-like component for external influence original-color ;; used in conjunction with external influence ] ;People have attributes people-own [ kind ;; 1 - 5 are "innovator","early-tech1","early-majority","late-majority","laggard" (Rogers). Added 0 & 6 extremes. acceptance ;; arbitrary units change-agent? ;; change agent can meet with multiple people - (NOT YET MODELED) initiator? ;; keep track of who initiates the conversation partner ;; The person that is our current partner in a conversation media? ;; Keep track of whether listening to mass media presentation start-time ;; when current conversation starts end-time ;; when current conversation will end num-conversations ;; cumulative number of conversations total-interact-time ;; cumulative time spent in conversation num-externals ;; cumulative number of interactions with external media total-external-time ;; cumulative time spent with external media memory ;; list of partners ] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; SETUP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to setup ca setup-globals ;initialize to 0 setup-env ;patches setup-people ;individuals setup-plot ;output parameters end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to setup-globals random-seed seed set time 0 ;internal influence globals set contacts 0 set old-contacts 0 set contacts-per-time 0.0 set conversation-starts 0 set old-conversation-starts 0 set starts-per-time 0 set conversation-ends 0 set old-conversation-ends 0 set ends-per-time 0 set active-conversations 0 set friend-total 0 ;external influence globals set externals 0 end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to setup-env ;all patches set to default initially - intensity not used on black patches in current version of model ask patches [ set pcolor black set intensity (random 100) set original-color black ] ;Mass media center for first new technology if turned on by switch - Set up as a square of color violet if External-Tech1? [ let x int(x-adopt / 100 * max-pxcor) let y int(y-adopt / 100 * max-pycor) let s int(s-adopt / 100 * (max-pxcor + 1)) ask patches [ if (pxcor > x - s) and (pxcor < x + s) and (pycor > y - s) and (pycor < y + s) [ set pcolor violet set original-color violet ] ] ] ;Mass media center for second new technology (if switch turned on) to challenge first technological innovation - magenta square if External-Tech2? [ let x int(x-disrupt / 100 * max-pxcor) let y int(y-disrupt / 100 * max-pycor) let s int(s-disrupt / 100 * (max-pxcor + 1)) ask patches [ if (pxcor > x - s) and (pxcor < x + s) and (pycor > y - s) and (pycor < y + s) [ set pcolor magenta set original-color magenta ] ] ] ; Patch intensity is randomly assigned to each patch. To make more realistic, ; use the diffuse function to spread the value of each intensity to its nearest ; neighbors; the value 1 is the max. diffusion coefficient. Repeat this ; diffusion step "Smoothness" times (set by user) to create a smooth topology. ; This applies to all patches. ; ; Rescale is like converting between degrees Centigrade and Fahrenheit - scale ; range from min to max => 0 to 100. Then recolor the patches. Only do this for ; non-black patches. Thus, the intensity topology exists over the entire grid ; but it is only observed and used in the external patch areas. if Smoothness > 0 [ repeat Smoothness [ diffuse intensity 1 ] ;smoothness function rescale recolor ] end to rescale ;adapted from fitness model in Netlogo Community Models let highest max [ intensity ] of patches let lowest min [ intensity ] of patches ask patches [ set intensity (((intensity - lowest) * 100) / (highest - lowest)) ] let nhighest max [ intensity ] of patches let nlowest min [ intensity ] of patches print (word "intensity range from " lowest " to " highest " shifted to " nlowest " to " nhighest) end to recolor ask patches [ ifelse original-color = violet [ set pcolor scale-color violet intensity 0 100 ] [ ifelse original-color = magenta [ set pcolor scale-color magenta intensity 0 100 ] [ set pcolor original-color ] ;ignore for black patches ] ] end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to setup-people create-people total-population [ setxy random-pxcor random-pycor ; centers on patch set end-time 0 set total-interact-time 0 set num-conversations 0 set total-external-time 0 set num-externals 0 set partner nobody set shape "person" set change-agent? FALSE set initiator? FALSE set media? FALSE set memory [] ;determine kind of individual - from technology fanatic to hopeless. Change agents not used yet in Version 10 of model let kind-prob (random 100) ifelse (kind-prob < cumulative-prob-tech2) [ set-tech2 if random 100 < tech2-agent [ set-change-agent ] ] ;have to have latest technology [ ifelse (kind-prob < cumulative-prob-tech1) [ set-tech1 if random 100 < tech1-agent [ set-change-agent ] ] ;innovator [ ifelse (kind-prob < cumulative-prob-early-adopter) [ set-early-adopter ] ;accept easily [ ifelse (kind-prob < cumulative-prob-early-majority) [ set-early-majority ] ;accept fairly easily [ ifelse (kind-prob < cumulative-prob-late-majority) [ set-late-majority ] ;reluctant [ifelse (kind-prob < cumulative-prob-laggard) [ set-laggard ] ;very reluctant [ set-hopeless ] ; ignore setting for cumulative-prob-hopeless & just place remainder here ] ] ] ] ] ] end to set-tech2 set kind 0 set acceptance tech2 set color red end to set-tech1 set kind 1 set acceptance tech1 set color orange end to set-early-adopter set kind 2 set acceptance earlyadopter set color yellow end to set-early-majority set kind 3 set acceptance earlymajority set color lime end to set-late-majority set kind 4 set acceptance latemajority set color cyan end to set-laggard set kind 5 set acceptance laggard set color blue end to set-hopeless set kind 6 set acceptance hopeless set color violet end to set-change-agent set change-agent? TRUE set shape "face happy" end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; OUTPUT PROCEDURES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; PLOTTING PROCEDURES ;;; to setup-plot ;Histogram - don't set limits - let model autoset set-current-plot "Adoption Type" set-histogram-num-bars 7 update-plot-type end to update-plot-pop ;update time series let total count people let t2 count people with [kind = 0] let t1 count people with [kind = 1] let potentials ( total - t2 - t1 ) set-current-plot "Populations" set-current-plot-pen "Total" plot total set-current-plot-pen "Potentials" plot potentials set-current-plot-pen "Adopters" plot (t1 + t2) set-current-plot-pen "Tech2" plot count people with [kind = 0] set-current-plot-pen "Tech1" plot count people with [kind = 1] set-current-plot-pen "EarlyAdopter" plot count people with [kind = 2] set-current-plot-pen "EarlyMajority" plot count people with [kind = 3] set-current-plot-pen "LateMajority" plot count people with [kind = 4] set-current-plot-pen "Laggard" plot count people with [kind = 5] set-current-plot-pen "Hopeless" plot count people with [kind = 6] end to update-plot-stat ;contacts, conversations and meetings set-current-plot "Acquaintance Level" set-current-plot-pen "Acquaintance Level" ifelse (conversation-starts > 0) [ plot friend-total / conversation-starts ] [ plot 0 ] end to update-plot-meet ;update meetings histogram set-current-plot "Conversations per Person" set-current-plot-pen "Internal" histogram [num-conversations] of people ;Don't care about externals yet ;set-current-plot-pen "External" ;histogram [num-externals] of people end to update-plot-type ;update tech1 type histogram set-current-plot "Adoption Type" set-current-plot-pen "kind" histogram [kind] of people end ;;; ;;; MONITOR PROCEDURES ;;; to update-monitors ;reset counters for each year set contacts-per-time (contacts - old-contacts) set starts-per-time (conversation-starts - old-conversation-starts) set ends-per-time (conversation-ends - old-conversation-ends) set active-conversations (conversation-starts - conversation-ends) set old-contacts contacts set old-conversation-starts conversation-starts set old-conversation-ends conversation-ends end ;;; ;;; Movie ;;; to make-movie ;where to store movie user-message "Save movie file with a .mov extension" let path user-new-file if not is-string? path [ stop ] ;;terminate if user cancels ;run model setup movie-start path movie-grab-view repeat movie-frames [ go movie-grab-view ] ;export movie-close user-message (word "Movie exported to" path) ;for fun ;sound:play-drum "ACOUSTIC SNARE" 64 ;sound:play-note "TRUMPET" 60 64 1 ;note 60 is middle C with 0 - 127 as range, velocity is volume from 0 - 127, duration in seconds end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; RULES OF INTERACTION ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to check-external-adoption ;adoption check (Tech1) ifelse ( media? = FALSE ) [ ;Keep track of total number of externals made set externals (externals + 1) set media? TRUE set partner self set start-time time set end-time round( random-exponential listening-time ) + time print (word time ": external influenced adoption initiated for " who " to last until " end-time) ][ ifelse time >= end-time [ set media? FALSE set partner nobody let prob-to-adopt (([intensity] of patch-here / 100) * prob-to-adopt-tech1-external) if random-float 100 < (1.0 / acceptance) * prob-to-adopt [ set-tech1 ] move-away set num-externals (num-externals + 1) set total-external-time (end-time - start-time + total-external-time) print (word time ": " who " of type " kind " has finished adoption mass media session with probability of adopting " prob-to-adopt ) ][ print (word time ": " who " is listening to mass media presentation for tech1-type innovation") ] ] end to check-external-disruption ;disruption check (Tech2) ifelse ( media? = FALSE ) [ ;Keep track of total number of externals made set externals (externals + 1) set media? TRUE set partner self set start-time time set end-time round( random-exponential listening-time ) + time print (word time ": external influenced disruption initiated for " who " to last until " end-time) ][ ifelse time >= end-time [ set media? FALSE set partner nobody let prob-to-adopt (([intensity] of patch-here / 100) * prob-to-adopt-tech1-external) if random-float 100 < (1.0 / acceptance) * prob-to-adopt [ set-tech2 ] move-away set num-externals (num-externals + 1) set total-external-time (end-time - start-time + total-external-time) print (word time ": " who " of type " kind " has finished disruption mass media session with probability of adopting " prob-to-adopt ) ][ print (word time ": " who " is listening to mass media presentation for tech2-type disruptive innovation") ] ] end to move rt random-float 360 fd movement setxy pxcor pycor ;centers on patch end to move-away rt random-float 180 jump int(s-adopt / 100 * max-pxcor) ;move away from media center setxy pxcor pycor ;centers on patch end to initiate ;partner with someone on own patch who it not already partnered ifelse (any? other people-here with [partner = nobody]) [ ;Keep track of total number of contacts made set contacts (contacts + 1) ;may not actually strike up a conversation with this partner. The contact rate is adjusted ;with the "movement" parameter and the "prob-conversation" parameter. Note also that the ;user controls the length of each conversation which will also impacts contact rate. ifelse (random-float 100) < prob-conversation [ converse ][ print (word time ": no conversation initiated by " who) ] ][ print (word time ": no possible parters for " who) ] end to converse let friend 0 let me self ;Choose one of the eligible people to partner with - may want to consider other partnering strategies ;here - such as all on one's patch for a facilitator / hub or one of patch + neighborhood. Change agents, etc. set partner one-of other turtles-here with [partner = nobody] ;Set partner's attribute to me. ask partner [ set partner me ] ;Put in memory and partner's memory if not already there ifelse (member? partner memory = true) [ set friend friend + 1 ] [ set memory lput partner memory ] ifelse (member? self [memory] of partner = true) [ set friend friend + 1 ] [ ask partner [ set memory ( lput self [memory] of partner ) ]] ;This person is the initiator, automating rendering the partner to a subordinate role set initiator? TRUE ask partner [ set initiator? FALSE ] ;keep track of time conversation started set start-time time ask partner [ set start-time time ] ;set time to end conversation. For future changes, might consider multiple person interactions ;with some partners leaving early and not adopting technology let conversation-end round((random-float conversation-length) + time ) set end-time conversation-end ask partner [ set end-time conversation-end ] ;Set patch of conversation - since xcor and ycor are real numbers, patches may not exactly ;coincide with position of partners ifelse (friend = 2) [ ask patch-here [ set pcolor sky ]] [ ifelse (friend = 1) [ ask patch-here [ set pcolor blue ]] [ ask patch-here [ set pcolor pink ]] ] ;keep track of conversations started in simulation and the level of acquaintance set conversation-starts (conversation-starts + 1) set friend-total (friend-total + friend) print (word time ": conversation between ID " who " of type " kind " with memory list " memory " and ID " [who] of partner " of type " [kind] of partner " with memory list " [memory] of partner " at level " friend " until " end-time " at [" xcor "," ycor "]") end to interact ifelse (time <= end-time) [ ifelse (time > start-time) [ print (word time ": ongoing conversation between " who " and " [who] of partner) ][ print (word time ": match already established between " who " and " [who] of partner) ] ][ ;Decide whether to adopt as conversation comes to a close ifelse kind > 1 and [kind] of partner = 1 [ if tech1-switch [ if random-float 100 < (1.0 / acceptance) * tech1-coefficient-acceptance [ set-tech1 ] ] ][ ifelse kind > 1 and [kind] of partner = 0 [ if tech2-switch [ if random-float 100 < (1.0 / acceptance) * tech2-coefficient-acceptance [ set-tech2 ] ] ] [ print (word time ": No changes for ID " who " of type " kind " as partner " [who] of partner " with type " [kind] of partner) ] ] ;stat collection set num-conversations (num-conversations + 1) set total-interact-time (end-time - start-time + total-interact-time) ifelse initiator? [ set conversation-ends (conversation-ends + 1) ask patch-here [ set pcolor original-color ] print (word time ": initiator " who " ends conversation with " [who] of partner) ][ print (word time ": recipient " who " ended conversation with initiator " [who] of partner) ] set partner nobody rt random-float 360 jump 5 * movement ] end to rethink-adoption ifelse random-float 100 < prob-tech1-to-potential [ set-early-adopter print (word time ": " who " reneged tech1 to early adopter") ][ if tech2-switch and random-float 100 < prob-tech1-to-tech2 [ set-tech2 print (word time ": " who " changed from tech1 to tech2 innovation") ] ] end to rethink-disruption ifelse random-float 100 < prob-tech2-to-potential [ set-early-adopter print (word time ": " who " reneged on tech2 back to early adopter ") ][ if tech1-switch and random-float 100 < prob-tech2-to-tech1 [ set-tech1 print (word time ": " who " changed back from tech2 to tech1 innovation") ] ] end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; RUNTIME ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to go set time time + 1 ;People who are not currently in a conversation will: ; (a) think about their current adoption status, possibly changing their mind about an adoption or disruption. They may ; return to a potential, whereby they are subject to the influences of internal or external factors. ; If they are already a "technologist," they may adopt the disruption if they are already an tech1 or adopt ; the adoption if already a tech2. Note that this latter case is based on "personal reflection" rather than ; due to external or internal influences. ; (b) move a little ; (c) check to see if they are on a "media center" patch, in which case they may adopt after hearing the message ; (d) they check to see if someone is around to talk to about technologies ;If already paired, they update their type. ask people [ without-interruption [ ;external influence is only for those whose kind is not the same as the media center. if External-Tech1? and [pcolor] of patch-here >= 110.0 and [pcolor] of patch-here < 120.0 and kind != 1 [ check-external-adoption ] if External-Tech2? and [pcolor] of patch-here >= 120.0 and [pcolor] of patch-here < 130.0 and kind != 0 [ check-external-disruption ] ;internal influence - if partner = self, mass media is in effect, so internal influence is ignored in ;areas of mass media. May need to reconsider this assumption. ifelse partner = nobody [ if kind = 1 [rethink-adoption] if kind = 0 [rethink-disruption] move if [pcolor] of patch-here = black [ initiate ] ][ if partner != self [ interact ] ] ] ] update-plot-pop update-plot-stat update-plot-meet update-plot-type update-monitors end @#$#@#$#@ GRAPHICS-WINDOW 389 64 903 599 17 17 14.4 1 10 1 1 1 0 1 1 1 -17 17 -17 17 0 0 1 ticks CC-WINDOW 5 694 1124 789 Command Center 0 MONITOR 964 10 1238 55 Time time 0 1 11 BUTTON 502 12 557 56 NIL Setup NIL 1 T OBSERVER NIL NIL NIL NIL BUTTON 728 12 790 55 On/Off go T 1 T OBSERVER NIL NIL NIL NIL BUTTON 558 12 613 56 Step go NIL 1 T OBSERVER NIL NIL NIL NIL SLIDER 416 607 632 640 total-population total-population 0 1000 200 1 1 people HORIZONTAL SLIDER 17 33 326 66 prob-conversation prob-conversation 0 100 100 0.1 1 percent HORIZONTAL SLIDER 16 69 325 102 conversation-length conversation-length 0 100 1 1 1 time units HORIZONTAL PLOT 964 55 1238 249 Populations Simulated Time Number of People 0.0 10.0 0.0 10.0 true true PENS "Tech2" 1.0 2 -2674135 true "Tech1" 1.0 2 -955883 true "EarlyAdopter" 1.0 2 -6459832 true "EarlyMajority" 1.0 2 -13840069 true "LateMajority" 1.0 2 -11221820 true "Laggard" 1.0 2 -13345367 true "Hopeless" 1.0 2 -8630108 true "Potentials" 1.0 0 -7500403 true "Adopters" 1.0 0 -2064490 true "Total" 1.0 0 -16777216 true PLOT 962 372 1236 492 Conversations per Person Number of Interactions Frequency 0.0 100.0 0.0 10.0 true false PENS "Internal" 1.0 1 -13791810 true "External" 1.0 1 -5825686 true SLIDER 345 684 538 717 cumulative-prob-tech1 cumulative-prob-tech1 0 100 5 1 1 % HORIZONTAL SLIDER 345 646 538 679 cumulative-prob-tech2 cumulative-prob-tech2 0 100 0 1 1 % HORIZONTAL SLIDER 345 18 494 51 seed seed 0 100000000 73880597 1 1 NIL HORIZONTAL SLIDER 16 144 326 177 tech1-coefficient-acceptance tech1-coefficient-acceptance 0 100 100 1 1 NIL HORIZONTAL SLIDER 15 292 325 325 tech2-coefficient-acceptance tech2-coefficient-acceptance 0 100 0 1 1 NIL HORIZONTAL SLIDER 796 16 949 49 movement movement 0 10 1 1 1 patches/move HORIZONTAL SLIDER 15 219 326 252 prob-tech1-to-tech2 prob-tech1-to-tech2 0 5 0 0.1 1 percent HORIZONTAL SLIDER 15 182 326 215 prob-tech1-to-potential prob-tech1-to-potential 0 5 0 0.1 1 percent HORIZONTAL SWITCH 17 109 170 142 tech1-switch tech1-switch 0 1 -1000 SWITCH 174 109 326 142 tech2-switch tech2-switch 1 1 -1000 SLIDER 14 328 324 361 prob-tech2-to-potential prob-tech2-to-potential 0 5 0 0.1 1 percent HORIZONTAL SLIDER 13 364 324 397 prob-tech2-to-tech1 prob-tech2-to-tech1 0 5 0 0.1 1 percent HORIZONTAL TEXTBOX 92 440 241 458 External Influence Parameters 11 0.0 0 PLOT 1034 543 1235 663 Acquaintance Level Simulated Time No. 0.0 100.0 0.0 2.0 true false PENS "Acquaintance Level" 1.0 0 -10899396 true MONITOR 963 494 1025 539 Contacts contacts-per-time 0 1 11 MONITOR 1032 494 1094 539 Starts starts-per-time 0 1 11 MONITOR 1172 493 1235 538 Ongoing active-conversations 0 1 11 SLIDER 14 254 325 287 tech1-agent tech1-agent 0 100 0 0.1 1 percent HORIZONTAL SLIDER 14 398 324 431 tech2-agent tech2-agent 0 100 0 0.1 1 percent HORIZONTAL SLIDER 173 646 324 679 x-disrupt x-disrupt -100 100 35 1 1 NIL HORIZONTAL SLIDER 16 645 166 678 x-adopt x-adopt -100 100 -51 1 1 NIL HORIZONTAL SLIDER 173 683 324 716 y-disrupt y-disrupt -100 100 57 1 1 NIL HORIZONTAL SLIDER 16 682 166 715 y-adopt y-adopt -100 100 -51 1 1 NIL HORIZONTAL SLIDER 17 534 325 567 prob-to-adopt-tech1-external prob-to-adopt-tech1-external 0 100 100 1 1 % HORIZONTAL SLIDER 17 570 326 603 prob-to-adopt-tech2-external prob-to-adopt-tech2-external 0 100 0 1 1 % HORIZONTAL SLIDER 15 719 166 752 s-adopt s-adopt 0 100 54 1 1 NIL HORIZONTAL SLIDER 173 720 324 753 s-disrupt s-disrupt 0 100 40 1 1 NIL HORIZONTAL SWITCH 17 607 166 640 External-Tech1? External-Tech1? 1 1 -1000 SWITCH 173 609 325 642 External-Tech2? External-Tech2? 1 1 -1000 SLIDER 17 497 325 530 listening-time listening-time 0 50 1 1 1 time units HORIZONTAL PLOT 963 250 1236 370 Adoption Type Savvy|Innov|Adopt|Early|Later|Lagrd|Never Frequency 0.0 7.0 0.0 50.0 true false PENS "kind" 1.0 1 -13345367 true SLIDER 345 722 538 755 cumulative-prob-early-adopter cumulative-prob-early-adopter 0 100 15 1 1 % HORIZONTAL SLIDER 639 606 833 639 cumulative-prob-early-majority cumulative-prob-early-majority 0 100 46 1 1 % HORIZONTAL SLIDER 640 645 834 678 cumulative-prob-late-majority cumulative-prob-late-majority 0 100 85 1 1 % HORIZONTAL SLIDER 640 683 835 716 cumulative-prob-laggard cumulative-prob-laggard 0 100 100 1 1 % HORIZONTAL SLIDER 17 460 325 493 Smoothness Smoothness 0 50 50 1 1 repeitions HORIZONTAL TEXTBOX 99 14 249 32 Internal Influence Parameters 11 0.0 1 SLIDER 541 646 633 679 tech2 tech2 1 25 1 1 1 NIL HORIZONTAL SLIDER 542 685 634 718 tech1 tech1 1 25 1 1 1 NIL HORIZONTAL SLIDER 542 722 635 755 earlyadopter earlyadopter 1 25 1 1 1 NIL HORIZONTAL SLIDER 836 606 932 639 earlymajority earlymajority 1 25 5 1 1 NIL HORIZONTAL SLIDER 837 645 932 678 latemajority latemajority 1 25 10 1 1 NIL HORIZONTAL SLIDER 838 682 932 715 laggard laggard 1 25 15 1 1 NIL HORIZONTAL SLIDER 838 720 932 753 hopeless hopeless 1 25 25 1 1 NIL HORIZONTAL SLIDER 640 722 834 755 cumulative-prob-hopeless cumulative-prob-hopeless 0 100 100 1 1 % HORIZONTAL TEXTBOX 346 609 415 638 Demographic Parameters 11 0.0 1 BUTTON 963 667 1018 707 MOVIE! make-movie NIL 1 T OBSERVER NIL NIL NIL NIL MONITOR 964 710 1238 755 NIL movie-status 17 1 11 SLIDER 1021 671 1236 704 movie-frames movie-frames 0 1000 100 50 1 frames HORIZONTAL BUTTON 615 12 671 56 Step 10 go go go go go go go go go go NIL 1 T OBSERVER NIL NIL NIL NIL BUTTON 672 12 727 56 Step 50 go go go go go go go go go go go go go go go \ngo go go go go go go go go go go go go go go \ngo go go go go go go go go go go go go go go \ngo go go go go NIL 1 T OBSERVER NIL NIL NIL NIL MONITOR 1103 494 1166 539 Ends ends-per-time 0 1 11 MONITOR 963 544 1026 589 Familiarity friend-total / conversation-starts 1 1 11 @#$#@#$#@ WHAT IS IT? ----------- This is a model of the DIFFUSION OF INNOVATIONS, one segment of the entire INNOVATION PROCESS that includes (1) invention, (2) R&D, (3) production of innovations, (4) dissemination of these innovations, and (5) various stages of a product's life cycle such as obsolescence and eventual retirement. It focuses on the diffusion and adoption of new technologies based on "internal influences" (e.g., word-of-mouth) and "external influences" (e.g., mass media). Individuals are divided into three groups: "Potentials" who have not yet adopted any new technologies, "Adopters" who are using a new technology and "Disrupters" who are using an even newer technology than "Adopters." Individuals move through the state space, where they meet and interact with other individuals. If a "Potential" interacts with an "Adopter," he or she may become an "Adopter" based on probabilities set by the modeler. The same holds true for "Potentials" interacting with "Disrupters." There are also parameters for "Adopters" to "renege" and return to "Potentials" or to accept the even newer "Disrupter" technology and discard their "Adopter" innovation. Similar parameters are available for "Disrupters." Mass media impacts may also be studied. The impact of mass media is based on the length of time a user spends in a particular region (using different colors to represent "strength" of the influence, as well as differences between "Adopter" technologies and "Disrupter" technologies.) Toggle switches are provided to control each simulation so that a study may focus on internal or external influences of one technology in isolation. Note that interactions between individuals will not occur inside a "mass media" region. HOW IT WORKS ------------ (1) Demography The population size is set by the modeler and does not change during each run. What changes are the percentages of each type of user: (a) "Tech2" super-geeks who must have the latest of everything (b) "Tech1" geeks, or "Innovators" in the typical parlance of innovation theory (c) "Early Adopters" who will decide to adopt if the idea or technology sounds good (d) "Early Majority" who are a little hesitant and wait to see what others are doing (e) "Late Majority" who are very hesitant (f) "Laggards" who basically wait until the technology is no longer considered innovative (g) "Hopeless" who will never adopt the technology or idea. Note that (b) through (f) correspond to the categories commonly seen in the literature; I have added a new category on either end for more flexibility. These people will be created by pressing the SETUP button and will move around the display interacting with other folks ("internal diffusion") or examining mass media or other general forms of information about the innovation ("external diffusion"). (2) Individual Behavior Individuals who are not currently in a "conversation" will perform a number of steps: (a) Think about their current status, possibly changing their mind after accepting a new technology: they may return to a "Potential," whereby they are subject to the influences of internal or external factors. If they are a technologist ("Adopter" or "Disrupter"), they may become a "Disrupter" if they are currently an "Adopter" or an "Adopter" if currently a "Disrupter." Note that these changes are based on "personal reflection" rather than due to external or internal influences. These changes are based on slider values "prob-tech1-to-potential," "prob-tech1-to-tech2," "prob-tech2-to-potential" and "prob-tech2-to-tech1." (b) Move a little based on the "movement" slider set in the interface. (c) Check to see if they are on a "media center" patch, in which case they may accept a new technology after hearing a "mass media presentation." (d) Finally, they check to see if someone is around to talk to about technologies. The "movement" parameter" and "prob-conversation" sliders help determine how often conversations occur - just meeting someone does not guarantee that a conversation about technology occurs. If a conversation does occur, one individual is the initiator and the other the recipient of information. If an individual is already paired, he or she will update his or her status. Whether to accept the new technology is based on the slider probability for each technology. This is only checked at the end of the conversation, not once per time unit. These sliders are "tech1-coefficient-acceptance" and "tech2-coefficient-acceptance." However, each of these values is divided by a factor set for each individual's type (see Demographic Parameters below). For example, an "Innovator" may accept the new technology at the general "coefficient-acceptance" level, where as a "laggard" may be given a high resistance factor, say 10, meaning that acceptance is 1/10th of the general "coefficient-acceptance" level. (3) Statistics Output graphs provide a number of summaries for the modeler's use. In addition, debugging statements are printed to the screen. These may be saved in other tools (e.g., Excel) for later analysis. HOW TO USE IT ------------- This section describes the model in a little more detail, highlighting each of the buttons and sliders. (1) Demographic Parameters These are set by sliders located below the runtime display. The modeler sets the total population (which remains fixed in size throughout the model run). This population is divided into 7 categories, with a cumulative distribution used to determine the number in each group. For example, "cumulative-prob-tech2" are the "super-geeks" or "Disrupters" who absolutely have to have the latest technology. The slider is set to 0 if there aren't any of these folks in the model. If it is set to some percentage, say 5%, then 5% of the total population will be "super-geeks." The next segment, "cumulative-prob-tech1" are the Adopters. If the first group is set to 5, and the modeler wants 8% of the population to be Adopters, then set this slider to 13%. Similarly, set all of the cumulative probabilities so that the last category desired is set to 100%. If there are no "hopeless" members of the population, then both the laggard and hopeless sliders will be at 100%. Note that Rogers and others identify 5 categories of people - Innovators, Early Adopters, Early Majority, Late Majority and Laggards. In this model, these five categories are supplemented by new categories on either end of the spectrum - the "tech2" super-geeks on one side and "hopeless" on the other. Next to the "cumulative-prob-*" sliders are sliders for each category indicating a factor that affects the acceptance of a new idea or technology when meeting with other individuals. There are acceptance factors for internal diffusion called "tech1-coefficient-acceptance" and "tech2-coefficient-acceptance" for Adopter and Disrupter technologies, respectively. This value will be divided by the factor for each individual user type, so that a "1" means accept the technology at the general "tech1" or "tech2" rate, whereas a user value of 5 means only accept the technology at 1/5th of the general rate. (2) Internal Influence Parameters (a) prob-conversation - Just because individuals meet, it doesn't mean they will exchange information. The combination of this parameter (a percentage) and the movement parameter (see Runtime Setup below) can be used to calibrate the model against analytical or system dynamics models of diffusion. (b) conversation-length - This parameter decides how long people are "tied up" in a conversation, but it does not affect the probability of accepting a new technology. It basically just adds a delay factor to the model since the acceptance/rejection of a technology or idea doesn't occur until the end of the conversation. (c) tech1-switch and tech2-switch - these determine if any internal diffusion will occur in a given model run. The recommendation is to stick to only one innovation ("tech1") until the inner workings of the model are well understood. (d) tech1-coefficient-acceptance and tech2-coefficient-acceptance - this is a generic number for accepting the innovation at the end of a conversation, with values from 0 to 100. However, this number is divided by a factor for each demographic category. The higher the demographic category number, the lower the chance of accepting the innovation. (e) prob-tech1-to-poential and prob-tech2-to-potential - a "renege" factor (f) prob-tech1-to-tech2 and prob-tech2-to-tech1 - probability of switching from one technology to the other (g) tech1-agent and tech2-agent - not yet incorporated into model (3) External Influence Parameters (a) Smoothness - this parameter is used to create the background for external diffusion of tech1 and tech2 innovations. (b) listening-time - how long the user stays inside the mass media area. Again, this is just a delay factor since acceptance/rejection of the innovation is determined at the end of the period of time the user remains in the area. (c) prob-to-adopt-tech1-external and prob-to-adopt-tech2-external - acceptance factors (d) External-Tech1? and External-Tech2? - turn external diffusion on and off (e) x-adopt, y-adopt, s-adopt and x-disrupt, y-disrupt, s-disrupt - used to set the bounds for the region of mass media. (x,y) places the center of the region, while (s) builds an area from (x-s,y-s),(x+s,y-s),(x+s,y+s),(x-s,y+s). (4) Outputs (a) Simulated Time - keeps track of time steps (b) Populations - total number of individuals of each type (7 types of individuals plus potentials vs adopters/disrupters, as well as total) (c) Adopter Type - histogram of types of users (d) Meetings - histogram of two-person conversations (with counters for the number of contacts made in a time period, how many started in that time period, how many ended, and number of active conversations. (e) Acquaintance Level (and counter) - measure of familiarity of the individuals in a conversation. (5) Setup (a) Setup - initializes model based on the parameters described above (b) Step - increment model one step at a time (c) Step N - move model N steps forward (d) On/Off - run model until clicked again (e) Seed - random number seed for each run (f) Movement - how far individuals move in each step (6) Movie Use slider to set number of frames to collect. Then press movie button to create a movie. This does not work in the Applet form of the model. THINGS TO NOTICE ---------------- Best idea is to run one technology at a time ("Adopter") in word-of-mouth mode, followed by external mode, followed by a mixed mode. These results can be compared to analytical models discussed in the REFERENCES section below. It is recommended that the "tech2" innovation not be used until the modeler is well versed on the behavior of simpler cases. THINGS TO TRY ------------- Note change in rate of technology adoption based on parameters. The "expected" behavior is a logistic curve for a single technology introduced by word-of-mouth. A strictly "mass media" introduction will spread more rapidly, shooting up to the maximum after a small delay (depending upon parameter settings). To see this, turn on "tech1" internal diffusion while turning off "tech2" and all "external diffusion" switches. Run the model for a set length of time with the Step 50 button. Then turn off "tech1" internal diffusion, turn on "tech1" external diffusion with the entire screen representing mass media (x and y parameters set to 0, s parameter set to 100). Run for the same period of time and note the differences in the shape of the population graphs. Adding a second technology after a short delay leads to all sorts of interesting behavior. In some cases, the newer technology will not be able to gain a foothold. If reneging is added, or if "Adopters" can switch to the "Disrupter" technology, the technology curves become quite complex. According to theory, at least, a "Disrupter" technology often needs to hit a specific niche in order to gain a foothold once an "Adopter" technology has saturated the market (e.g., "WII" vs Playstation 3 vs. Xbox 360 marketing strategies). EXTENDING THE MODEL ------------------- (1) Change agents - Rogers (see references) talks about the importance of change agents to facilitate adoption of new technologies or ideas. In the current model, two individuals will meet; adoption is based on parameters such as length of time of the conversation. However, some users could be initialized as change agents, in which case they might require much less time to convince certain categories of users. (2) Internet - The classic diffusion models differentiate individual contacts from mass media. The Internet, however, is really a combination of the two, providing "intimate" conversations with a single user, but marketing to a wide audience. NETLOGO FEATURES ---------------- Early versions of the model set the "adoption category" of individuals directly in code. The technique was suggested to me on the Community Web Pages, and so I have included it here because I thought it was an interesting programming construct. (It is actually not used for this purpose any more, so the code segment below has not been updated to the latest version of Netlogo.) The idea is that some folks are "innovators" and will try anything new. Some will never adopt anything new, and others are spread out into other groups. Rogers (see references below) discusses a normal distribution with 5 categories such as 1 & 2 (the early adopters) = 5 (adopt with a lot of resistance) and two middle categories, 3 & 4. This is referred to as the "kind-structure" in the model. Category 1 is set by the number of "adopters" + "disrupters" - those who already have the new innovation at the start of the simulation. To determine the rest of the population, an array is set up in the initialization part of the model: ============= set kind-structure [ [ 2 12 ] [ 3 47 ] [ 4 81 ] [ 5 100 ] ] ============= The first entry is the category type; the second is a probability. This is used in the following reporter routine: ============= to-report determine-kind [ probability-index ] let this_kind first ( first ( filter [ last ? >= probability-index ] kind-structure ) ) print this_kind+":"+probability-index+":"+filter [last ? >= probability-index] kind-structure report (this_kind) end ============= The "let" statement was graciously explained to me through the community web pages. It took awhile to convince myself it was working, but it is a very useful structure for this and similar demographic modeling in which the inputs are often categories assigned probabilities. This routine is called during setup in this model to determine the kind of adopter: ============= to setup-people cct-people initial-potentials [ set total-population initial-potentials + total-population setup-people-parms setup-potential set kind determine-kind ( random 100 ) ] end ============= A good use of the "kind" attribute is to assign different adoption rates based on the kind of person under consideration. TODO ---- Some thoughts on future versions: (1) As noted above, change agents that impact several colleagues simultaneously. Sliders are provided for change agents, but the behavior has not yet been added to the model. (2) Making use of memory - acceptance changes with familiarity of partner. A familiarity graph is included in the model, but the behavioral changes due to familiarity have not been added. (3) Mixed mode diffusion - e.g., web-based diffusion seems like a mixture of internal and external diffusion models. (4) Social Network Analysis - how fast innovations spread depends on network structure and dynamics ("6 degrees of separation" idea). (5) Mathematical models of diffusion - idea here is to be able to correlate parameters in various math models of diffusion to the parameters in this simulation. CREDITS AND REFERENCES ---------------------- (1) Other Models The framework for this model is based on two great models on the Netlogo web site: (a) AIDS - Copyright 1997 Uri Wilensky. All rights reserved. This provided the basic idea of pairing individuals on the same patch. (b) Fitness Landscape - Copyright 2006 David McAvity. This model, from the Community Models section of the Netlogo web site, was created at the Evergeen State College, in Olympia Washington as part of a series of applets to illustrate principles in physics and biology. (2) References This model is actually a small portion of an ongoing effort to understand the "Innovation Process" from the invention of ideas and technologies to their development, diffusion, use and obsolescence. The overall model is being developed through System Dynamics, but agent-based modeling has been very helpful in clarifying ideas concerning the competition and spread of technologies. The background for this work comes from three sources: (a) Mahajan, Vijay and Robert A. Peterson, "MODELS FOR INNOVATION DIFFUSION," Quantitative Applications in the Social Sciences, Sage Publications, 88 pages. (b) Bass, F. M. (1969). "A NEW PRODUCT GROWTH MODEL FOR CONSUMER DURABLES," Management Science, 15, 215-227. (c) Rogers, Everett M., DIFFUSION OF INNOVATIONS, 5th Edition, Free Press, 512 pp. COPYRIGHT INFORMATION --------------------- Copyright 2009 The MITRE Corporation. All rights reserved. Approved for Public Release: Distribution Unlimited (Tracking #09-1575) "The author's affiliation with The MITRE Corporation is provided for identification purposes only, and is not intended to convey or imply MITRE's concurrence with, or support for, the positions, opinions or viewpoints expressed by the author." The model may be freely used, modified and redistributed provided the copyright and Public Release statements are included and the resulting models are not used for profit. Contact Michael Samuels at mijujoel@ieee.org if you have questions or comments. ======================== Last updated: 05/19/2009 @#$#@#$#@ default true 0 Polygon -7500403 true true 150 5 40 250 150 205 260 250 airplane true 0 Polygon -7500403 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 -7500403 true true 150 0 0 150 105 150 105 293 195 293 195 150 300 150 box false 0 Polygon -7500403 true true 150 285 285 225 285 75 150 135 Polygon -7500403 true true 150 135 15 75 150 15 285 75 Polygon -7500403 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 -7500403 true true 96 182 108 Circle -7500403 true true 110 127 80 Circle -7500403 true true 110 75 80 Line -7500403 true 150 100 80 30 Line -7500403 true 150 100 220 30 butterfly true 0 Polygon -7500403 true true 150 165 209 199 225 225 225 255 195 270 165 255 150 240 Polygon -7500403 true true 150 165 89 198 75 225 75 255 105 270 135 255 150 240 Polygon -7500403 true true 139 148 100 105 55 90 25 90 10 105 10 135 25 180 40 195 85 194 139 163 Polygon -7500403 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 -7500403 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 -7500403 true true 47 195 58 Circle -7500403 true true 195 195 58 circle false 0 Circle -7500403 true true 0 0 300 circle 2 false 0 Circle -7500403 true true 0 0 300 Circle -16777216 true false 30 30 240 cow false 0 Polygon -7500403 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 -7500403 true true 73 210 86 251 62 249 48 208 Polygon -7500403 true true 25 114 16 195 9 204 23 213 25 200 39 123 cylinder false 0 Circle -7500403 true true 0 0 300 dot false 0 Circle -7500403 true true 90 90 120 face happy false 0 Circle -7500403 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 -7500403 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 -7500403 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 -7500403 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 -7500403 true true 60 15 75 300 Polygon -7500403 true true 90 150 270 90 90 30 Line -7500403 true 75 135 90 135 Line -7500403 true 75 45 90 45 flower false 0 Polygon -10899396 true false 135 120 165 165 180 210 180 240 150 300 165 300 195 240 195 195 165 135 Circle -7500403 true true 85 132 38 Circle -7500403 true true 130 147 38 Circle -7500403 true true 192 85 38 Circle -7500403 true true 85 40 38 Circle -7500403 true true 177 40 38 Circle -7500403 true true 177 132 38 Circle -7500403 true true 70 85 38 Circle -7500403 true true 130 25 38 Circle -7500403 true true 96 51 108 Circle -16777216 true false 113 68 74 Polygon -10899396 true false 189 233 219 188 249 173 279 188 234 218 Polygon -10899396 true false 180 255 150 210 105 210 75 240 135 240 house false 0 Rectangle -7500403 true true 45 120 255 285 Rectangle -16777216 true false 120 210 180 285 Polygon -7500403 true true 15 120 150 15 285 120 Line -16777216 false 30 120 270 120 leaf false 0 Polygon -7500403 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 -7500403 true true 135 195 135 240 120 255 105 255 105 285 135 285 165 240 165 195 line true 0 Line -7500403 true 150 0 150 300 line half true 0 Line -7500403 true 150 0 150 150 link true 0 Line -7500403 true 150 0 150 300 link direction true 0 Line -7500403 true 150 150 30 225 Line -7500403 true 150 150 270 225 pentagon false 0 Polygon -7500403 true true 150 15 15 120 60 285 240 285 285 120 person false 0 Circle -7500403 true true 109 6 80 Polygon -7500403 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 -7500403 true true 127 79 172 94 Polygon -7500403 true true 195 90 240 150 225 180 165 105 Polygon -7500403 true true 105 90 60 150 75 180 135 105 Circle -1184463 true false 126 33 14 Circle -1184463 true false 156 34 13 Line -1184463 false 158 70 167 62 Polygon -1184463 true false 141 63 148 40 154 63 Rectangle -1184463 true false 135 70 160 75 Line -1184463 false 134 70 126 61 Polygon -1184463 true false 58 162 34 196 37 190 Rectangle -16777216 true false 30 180 45 195 Rectangle -16777216 true false 45 180 60 165 Rectangle -16777216 true false 60 180 45 165 Rectangle -16777216 true false 45 165 60 180 plant false 0 Rectangle -7500403 true true 135 90 165 300 Polygon -7500403 true true 135 255 90 210 45 195 75 255 135 285 Polygon -7500403 true true 165 255 210 210 255 195 225 255 165 285 Polygon -7500403 true true 135 180 90 135 45 120 75 180 135 210 Polygon -7500403 true true 165 180 165 210 225 180 255 120 210 135 Polygon -7500403 true true 135 105 90 60 45 45 75 105 135 135 Polygon -7500403 true true 165 105 165 135 225 105 255 45 210 60 Polygon -7500403 true true 135 90 120 45 150 15 180 45 165 90 square false 0 Rectangle -7500403 true true 30 30 270 270 square 2 false 0 Rectangle -7500403 true true 30 30 270 270 Rectangle -16777216 true false 60 60 240 240 star false 0 Polygon -7500403 true true 151 1 185 108 298 108 207 175 242 282 151 216 59 282 94 175 3 108 116 108 target false 0 Circle -7500403 true true 0 0 300 Circle -16777216 true false 30 30 240 Circle -7500403 true true 60 60 180 Circle -16777216 true false 90 90 120 Circle -7500403 true true 120 120 60 tree false 0 Circle -7500403 true true 118 3 94 Rectangle -6459832 true false 120 195 180 300 Circle -7500403 true true 65 21 108 Circle -7500403 true true 116 41 127 Circle -7500403 true true 45 90 120 Circle -7500403 true true 104 74 152 triangle false 0 Polygon -7500403 true true 150 30 15 255 285 255 triangle 2 false 0 Polygon -7500403 true true 150 30 15 255 285 255 Polygon -16777216 true false 151 99 225 223 75 224 truck false 0 Rectangle -7500403 true true 4 45 195 187 Polygon -7500403 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 -7500403 true true 181 185 214 194 Circle -16777216 true false 144 174 42 Circle -16777216 true false 24 174 42 Circle -7500403 false true 24 174 42 Circle -7500403 false true 144 174 42 Circle -7500403 false true 234 174 42 turtle true 0 Polygon -10899396 true false 215 204 240 233 246 254 228 266 215 252 193 210 Polygon -10899396 true false 195 90 225 75 245 75 260 89 269 108 261 124 240 105 225 105 210 105 Polygon -10899396 true false 105 90 75 75 55 75 40 89 31 108 39 124 60 105 75 105 90 105 Polygon -10899396 true false 132 85 134 64 107 51 108 17 150 2 192 18 192 52 169 65 172 87 Polygon -10899396 true false 85 204 60 233 54 254 72 266 85 252 107 210 Polygon -7500403 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 -7500403 true true 3 3 294 Circle -16777216 true false 30 30 240 Line -7500403 true 150 285 150 15 Line -7500403 true 15 150 285 150 Circle -7500403 true true 120 120 60 Line -7500403 true 216 40 79 269 Line -7500403 true 40 84 269 221 Line -7500403 true 40 216 269 79 Line -7500403 true 84 40 221 269 x false 0 Polygon -7500403 true true 270 75 225 30 30 225 75 270 Polygon -7500403 true true 30 75 75 30 270 225 225 270 @#$#@#$#@ NetLogo 4.0.4 @#$#@#$#@ @#$#@#$#@ @#$#@#$#@ @#$#@#$#@ @#$#@#$#@ default 0.0 -0.2 0 0.0 1.0 0.0 1 1.0 0.0 0.2 0 0.0 1.0 link direction true 0 Line -7500403 true 150 150 90 180 Line -7500403 true 150 150 210 180 @#$#@#$#@