Innovation
Model was written in NetLogo 6.1.1
•
Viewed 1393 times
•
Downloaded 104 times
•
Run 0 times
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
Comments and Questions
Click to Run Model
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; DECLARATIONS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; breed [ people person ] ;; use people instead of turtles globals [ ;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 ;Color tech0-color tech1-color tech2-color ;time time-units ] ;Attributes for patches (other than Netlogo-defined attributes) patches-own [ intensity ;; used to create degrees of influence (rather than a static background) original-color ;; used in conjunction with external influence ] ;People have attributes people-own [ status ;; 0 for a potential, 1 for type 1 innovation (adoption), 2 for type 2 innovation (disruption) kind ;; 1 - 5 are "innovator","early-tech1","early-majority","late-majority","laggard" (using Rogers' terms). acceptance ;; general acceptance level, where "acceptance" gives probability of someone accepting technology 1 or 2 initiator? ;; keep track of who initiates the conversation partner ;; The person that is our current partner in a conversation media? ;; Keep track of whether individual is listening to mass media presentation, such as billboard or magazine ad 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 that can be used for altering rules of interaction in a future model ] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; SETUP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to setup ;; (for this model to work with NetLogo's new plotting features, ;; __clear-all-and-reset-ticks should be replaced with clear-all at ;; the beginning of your setup procedure and reset-ticks at the end ;; of the procedure.) clear-all ;;Check inputs let total-prob prob-innovator + prob-early-adopter + prob-early-majority + prob-late-majority + prob-laggard if (total-prob != 100 ) [ print (word "Adoption types must sum to 100, but instead sum to " total-prob) stop ] setup-globals ;initialize to 0 setup-env ;patches setup-people ;individuals setup-histo1 ;initialize graph needed at time 0 setup-histo2 ;initialize graph needed at time 0 reset-ticks set time-units 0 end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to setup-globals ;set random seed to user number unless 0 chosen let my-seed select-seed ;set once at beginning of model if random-seed-switch? [ set my-seed new-seed ] random-seed my-seed output-print my-seed ;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 ;color set tech0-color black set tech1-color magenta set tech2-color violet 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 tech0-color set intensity (random 100) set original-color tech0-color ] ;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 tech1-color set original-color tech1-color ] ] ] ;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 tech2-color set original-color tech2-color ] ] ] ; 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 = tech1-color [ set pcolor scale-color tech1-color intensity 0 100 ] [ ifelse original-color = tech2-color [ set pcolor scale-color tech2-color intensity 0 100 ] [ set pcolor tech0-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 status 0 ;default is potential set initiator? FALSE set media? FALSE set memory [] ;determine kind of individual - from innovator to laggard. let kind-prob (random 100) let cumulative-prob prob-innovator ifelse (kind-prob < cumulative-prob) [ set-innovator ] [ set cumulative-prob cumulative-prob + prob-early-adopter ifelse (kind-prob < cumulative-prob) [ set-early-adopter ] [ set cumulative-prob cumulative-prob + prob-early-majority ifelse (kind-prob < cumulative-prob) [ set-early-majority ] [ set cumulative-prob cumulative-prob + prob-late-majority ifelse (kind-prob < cumulative-prob) [ set-late-majority ] [ set cumulative-prob cumulative-prob + prob-laggard ifelse (kind-prob < cumulative-prob) [ set-laggard ] [ print (word "Adoption Group Error: Cumulative probability of " cumulative-prob " is less than 100%") ] ] ] ] ] ] end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;These are the kinds of people in a population. Each has a factor by which the acceptance rate (overall) is divided ;in order to determine how quickly the technology or idea is accepted. The innovators will have already adopted the ;technology - either all tech1 or all tech2 or divided between them at the start of the simulation to set-innovator set-change-agent set kind 1 set acceptance innovator set color red end ;To load some members of the population with the new technology. to set-change-agent ifelse (Internal-Tech1?) [ ifelse (Internal-Tech2?) [ ifelse (random 100 < change-agent) [ set-tech1 ] [ set-tech2 ] ] [ set-tech1 ] ] [ if (Internal-Tech2?) [ set-tech2 ] ] end ;These are the two technologies or ideas introduced into the population. ;Tech-1 is the adoption - i.e., the first new technology. Tech-2 is a disruptive technology, something that ;comes in at a later time, but while Tech-1 is still fresh in people's minds. to set-tech1 set status 1 set size 2 ;set shape "triangle" end to set-tech2 set status 2 set size 2 ;set shape "dot" end to set-early-adopter set kind 2 set acceptance earlyadopter set color green end to set-early-majority set kind 3 set acceptance earlymajority set color cyan end to set-late-majority set kind 4 set acceptance latemajority set color blue end to set-laggard set kind 5 set acceptance laggard set color magenta end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; OUTPUT PROCEDURES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; PLOTTING PROCEDURES ;;; to setup-histo1 ;Initial Histogram - don't set limits - let model autoset set-current-plot "Initial Adoption Type" set-histogram-num-bars 5 update-plot-type end to setup-histo2 ;Variable Histogram set-current-plot "Category of Adopters" set-histogram-num-bars 5 update-plot-type-current end to setup-histomem ;Memory of individuals set-current-plot "Memory" set-histogram-num-bars 100 update-plot-mem end to update-plot-pop ;update time series let total count people let t2 count people with [status = 2] let t1 count people with [status = 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 set-current-plot-pen "Disruptors" plot t2 set-current-plot "Groups" set-current-plot-pen "Innovators" plot count people with [ kind = 1 and status > 0 ] set-current-plot-pen "EarlyAdopter" plot count people with [ kind = 2 and status > 0 ] set-current-plot-pen "EarlyMajority" plot count people with [ kind = 3 and status > 0 ] set-current-plot-pen "LateMajority" plot count people with [ kind = 4 and status > 0 ] set-current-plot-pen "Laggard" plot count people with [ kind = 5 and status > 0 ] end to update-plot-type ;update type histogram - potentials and adopters set-current-plot "Initial Adoption Type" set-current-plot-pen "kind" histogram [kind] of people end to update-plot-type-current ;update type histogram - indicates adopters set-current-plot "Category of Adopters" set-current-plot-pen "adopted" histogram [kind] of people with [status > 0] end to update-plot-mem ;update memory histogram - indicates connectivity set-current-plot "Memory" set-current-plot-pen "mem" histogram [length memory] 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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; RULES OF INTERACTION ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; External influence rules are described here - adoption of type-1 and of type-2 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 ticks set end-time round( random-exponential listening-time ) + ticks print (word ticks ": external influenced adoption initiated for " who " to last until " end-time) ][ ;adoption probability based on intensity of patch with white as highest, black as lowest, and color in ;between. Then divide this value by the acceptance value for that person type ifelse ticks >= 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 ] ;Once done with mass media, move out of the zone move-away set num-externals (num-externals + 1) set total-external-time (end-time - start-time + total-external-time) print (word ticks ": " who " of type " kind " has finished adoption mass media session with probability of adopting " prob-to-adopt ) ][ print (word ticks ": " who " is listening to mass media presentation for tech1-type innovation") ] ] end to check-external-disruption ;disruption check (Tech2) - works same way as adoption external ifelse ( media? = FALSE ) [ ;Keep track of total number of externals made set externals (externals + 1) set media? TRUE set partner self set start-time ticks set end-time round( random-exponential listening-time ) + ticks print (word ticks ": external influenced disruption initiated for " who " to last until " end-time) ][ ifelse ticks >= end-time [ set media? FALSE set partner nobody let prob-to-adopt (([intensity] of patch-here / 100) * prob-to-adopt-tech2-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 ticks ": " who " of type " kind " has finished disruption mass media session with probability of adopting " prob-to-adopt ) ][ print (word ticks ": " 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 ;conversations are set up here 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 ticks ": no conversation initiated by " who) ] ][ print (word ticks ": 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 me memory ] ] ;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 ticks ask partner [ set start-time ticks ] ;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) + ticks ) 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 ticks ": 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 (ticks <= end-time) [ ifelse (ticks > start-time) [ print (word ticks ": ongoing conversation between " who " and " [who] of partner) ][ print (word ticks ": match already established between " who " and " [who] of partner) ] ][ ;Decide whether to adopt the new technology when the conversation comes to a close ifelse status = 0 [ ifelse Internal-Tech1? and [status] of partner = 1 [ if random-float 100 < (1.0 / acceptance) * tech1-coefficient-acceptance [ set-tech1 if link-switch [ create-link-with partner] print (word ticks ": ID " who " of type " kind " with status " status " accepted partner " [who] of partner " of type " [kind] of partner " with status " [status] of partner) ] ] [ print (word ticks ": ID " who " of type " kind " with status " status " rejected partner " [who] of partner " of type " [kind] of partner " with status " [status] of partner) ] ifelse Internal-Tech2? and [status] of partner = 2 [ if random-float 100 < (1.0 / acceptance) * tech2-coefficient-acceptance [ set-tech2 if link-switch [ create-link-with partner ] print (word ticks ": ID " who " of type " kind " with status " status " accepted partner " [who] of partner " of type " [kind] of partner " with status " [status] of partner) ] ] [ print ( word ticks ": ID " who " of type " kind " with status " status " rejected partner " [who] of partner " of type " [kind] of partner " with status " [status] of partner) ] ] [ print ( word ticks ": ID " who " of type " kind " with status " status " ignored partner " [who] of partner " of type " [kind] of partner " with status " [status] 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 ticks ": initiator " who " ends conversation with " [who] of partner) ][ print (word ticks ": 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 ticks ": " who " reneged tech1") ][ if Internal-Tech2? and random-float 100 < prob-tech1-to-tech2 [ set-tech2 print (word ticks ": " who " changed from tech1 to tech2 innovation") ] ] end to rethink-disruption ifelse random-float 100 < prob-tech2-to-potential [ set-early-adopter print (word ticks ": " who " reneged on tech2 back to early adopter ") ][ if Internal-Tech1? and random-float 100 < prob-tech2-to-tech1 [ set-tech1 print (word ticks ": " who " changed back from tech2 to tech1 innovation") ] ] end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; RUNTIME ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to go if (simlength > 0) [ if (ticks >= simlength) [ stop ] ] ;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. ; ;In latest versions of Netlogo, "without interruption" directive no longer needed ask people [ ;external influence is only for those whose kind is not the same as the media center. if External-Tech1? and [pcolor] of patch-here > tech1-color - 5 and [pcolor] of patch-here < tech1-color + 5 [ check-external-adoption ] if External-Tech2? and [pcolor] of patch-here > tech2-color - 5 and [pcolor] of patch-here < tech2-color + 5 [ 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 ] ] ] ;plots are controlled by specific routines, not by update-plots primitive (which is run by tick now) update-plot-pop update-plot-type update-plot-type-current update-plot-mem update-monitors ;clock update tick set time-units time-units + 1 end
There are 3 versions of this model.
Attached files
File | Type | Description | Last updated | |
---|---|---|---|---|
Innovation.png | preview | Preview for 'Innovation' | over 11 years ago, by Michael Samuels | Download |
This model does not have any ancestors.
This model does not have any descendants.
Yoonsik Yu
I have a question! (Question)
Hello Thanks for sharing your awesome model Currently, I'm trying to learn Netlogo I think your model is really nice to study but it is bit complicated for me. So if you have a basic model that you used for this, can you share for me?? I want to develop from the bottom so that I can learn Or can you let me know that which sample model you used (within model library) and I think I want to build up this model with data flow. So if you have any advices or any model might be helpful for me please recommend or give me any advises it will be really helpful Thank you so much! here is my email : sengwun2@naver.com
Posted over 5 years ago