Innovation

No preview image

1 collaborator

Uri_dolphin3 Uri Wilensky (Author)

Tags

(This model has yet to be categorized with any tags)
Model group CCL | Visible to everyone | Changeable by group members (CCL)
Model was written in NetLogo 4.0pre7 • Viewed 1325 times • Downloaded 87 times • Run 9 times
Download the 'Innovation' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


VERSION

$Id: Innovation.nlogo 37529 2008-01-03 20:38:02Z craig $

WHAT IS IT?

This is a model of the diffusion of innovations, part of an overall Innovation Process that covers invention, R&D, production of innovations, dissemination of those innovations, and various life cycle activities through obsolescence and retirement of old technologies. 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 selected at runtime. The same holds true for "Potentials" interacting with "Disrupters." Other rules control the interaction of "Adopters" and "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 (colored orange for the "Adopter" technology and cyan for the "Disrupter" technology).

Toggle switches are provided to control each simulation so that a study may focus on internal or external influences of one technology in isolation.

HOW IT WORKS

The model can be divided into three parts, each of which is described below:

(1) Individuals - The modeler selects an initial number of "Potentials," "Adopters" and "Disrupters" from the "Demographic Parameters" section of the interface. When the "setup" button is pressed, "Potentials" are created as blue figures. "Adopters" are red figures, but they will only appear in the model if the "adopter-switch" is ON. "Disrupters" will be green, but again, they only appear if the "disrupter-switch" is ON.

When the simulation begins, individuals move around the display, occasionally (depending on parameters) meeting other individuals of the same or different "type." They may engage in conversation, which may or may not lead to one of the individuals changing "type" (e.g., from a "Potential" to an "Adopter.") Or, they may change "type" based on the length of time they have listened to a mass media presentation.

(2) Internal Influence Diffusion ("word-of-mouth")

People 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-adoption-to-potential," "prob-adoption-to-disruption," "prob-disruption-to-potential" and "prob-disruption-to-adoption."

(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." (see comments below under "External Diffusion.")

(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 "prob-adoption" and "prob-disruption."

NOTE: The "Change Agent" sliders are not yet used. For now, every "Adopter" and "Disrupter" is set as a Change Agent, but this has no impact. The intent is to have a subset of each technology group be "Change Agents" that can "grab" individuals in the surrounding patches and exert influence on a number of other individuals at once. In the current model, conversations only occur between pairs, and the pairs must be on the same patch.

(3) External Diffusion - The user chooses an (x,y) coordinate for the "Adopter" and "Disrupter" mass media centers, noting that (0,0) is the center of the diagram, with values ranging from -100 to 100 for each axis. The user then chooses a "half-width" from this point, establishing a square "media center" from (x-s,y-s) to (x+s,y+s). Whether the media center is active or not is set by an ON/OFF toggle switch. The media centers should not overlap in space.

If a media center is active, sliders are set for "listening time," the mean of an exponential distribution used to determine how long the user will listen to the message in the media center. In addition, the modeler will set a "time to accept new technology" for the "Adopter Media Center" and a separate time for the "Disrupter Media Center."

When a person is in a media center, they do not pair with anyone; they just listen to the message for an amount of time set by EXPON("listening_time"). When they are about to leave the media center, the total time spent is compared to the slider values for each technology. The individual's status will change to that technology if the time spent in the media center is greater than the time set by the modeler. Nothing happens to an individual of the same type as the media center, but individuals may switch types in the current model. When they are done, they "jump" to the edge of the media center and begin to interact with others again.

HOW TO USE IT

Buttons

(1) Setup - uses startup parameters to establish a set of individuals of different technology classes, along with media centers.

(2) Step - can move one step at a time - very slow at beginning of model. Can run for awhile, stop, and then step.

(3) Start-Stop - toggles between "GO" state and "STOP" state.

Sliders

(1) Model Parameters

(a) Seed - change the initial random number seed to run a new "experiment" with the same inputs

(b) adopter-switch - ON/OFF toggle switch for "Adopter" technology and its diffusion through word-of-mouth

(c) disruption-switch - ON/OFF toggle switch for "Disrupter" technology

(d) e-adopt - ON/OFF switch for mass media external influences for "Adopter" technology

(e) e-disrupt - ON/OFF toggle switch for mass media messages of "Disrupter" technology

(2) Demographic Parameters

(a) initial-potentials - starting number of potential adopters

(b) initial-adopters - starting number of "Adopters" who already use a new technology. These, along with "Disrupters," constitute "Innovators," the most tech-saavy user group using Rogers' parlance.

(c) initial-disrupters - initial number of "Disrupters" who already use technology even newer than "Adopters." As noted, these individuals are part of the "Innovators" group.

(3) Contact Parameters

(a) movement - this parameter determines how many patches an individual will move in a single "step."

(b) 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 can be used to calibrate the model against analytical or system dynamics models of diffusion.

(c) conversation-length - This parameter decides how long people are "tied up" in a converstation, but it does not affect the probability of accepting a new technology.

(4) Internal Influence Parameters

(a) prob-adoption - At the end of a conversation, there is a probability that a user will adopt the new technology - assuming that the individuals in question are supporters of different levels of technology

(b) prob-adoption-to-potential - "Adopters" can renege and return to being "Potentials"

(c) prob-adoption-to-disruption - "Adopters" may decide to accept a newer technology

(d) prob-disruption - probability of accepting the latest technology

(e) prob-disruption-to-potential - renege case for "Disrupters"

(f) prob-disruption-to-adoption - "Disrupters" may decide the earlier innovation is better after all

(5) Change Agents - not yet used

(a) adapter-agent - percentage of total number of "Adopters" who can act as Change Agents, impacting multiple "Potentials" at once

(b) disrupter-agent - similar percentage for "Disrupters"

(6) External Influence Parameters

(a) x-adopt - x-coordiante of center of square media center for "Adopters"

(b) y-adopt - y-coordinate of center of "Adopter" media center

(c) s-adopt - "Adopter" media center ranges from (x-s,y-s) to (x+s,y-s) to (x+s,y+s) to (x-s,y+s)

(d) x-disrupt - "Disrupter" media center x-coordinate

(e) y-disrupt - "Disrupter" media center y-coordinate

(f) s-disrupt - "Disrupter" media center ranges from (x-s,y-s) to (x+s,y-s) to (x+s,y+s) to (x-s,y+s)

Outputs

(1) Simulated Time - keeps track of time steps

(2) Populations - total number of individuals of each type

(3) Statistics - number of contacts made, number of started conversations and number of finished conversations, number of individuals who listen in media centers.

(4) Adopter Type - histogram of types of users.

(5) Meetings - histograph of two-person conversations and media center meetings

(6) 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.

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.

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).

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) Innovation Group - Innovators, Early Adopters, Early Majority, Late Majority, Laggards.

(3) 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

The most interesting feature has to do with setting the "adoption category" of individuals. Some folks are "early adopters" 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. This will hopefully be added in the future.

RELATED MODELS

This "Innovation Model" took many of the two-person interaction concepts from the "AIDS Model" in the Netlogo Library. In addition, a Vensim model was created to help verify the results of this agent-based version.

CREDITS AND REFERENCES

The background for this work comes from a small monograph put out by Sage Publications:

(1) Mahajan, Vijay and Robert A. Peterson, "MODELS FOR INNOVATION DIFFUSION," Quantitative Applications in the Social Sciences, Sage Publications, 88 pages.

F. Bass is given credit for one of the earliest models of the diffusion process:

(2) Bass, F. M. (1969). "A new product growth model for consumer durables". Management Science, 15, 215-227.

The "Bible" of Innovation is Rogers work, now in its 5th edition:

(3) Rogers, Everett M., Diffusion of Innovations, 5th Edition, Free Press, 512 pp.

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.

=================================

Copyright 2007 Michael L. Samuels

Last updated: 01/08/2007

Comments and Questions

Please start the discussion about this model! (You'll first need to log in.)

Click to Run Model

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; DECLARATIONS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
breed [ people ]


globals [
  time
  total-population

  ;internal influence counters and statistics
  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
  kind-structure          ;; used to determine type of adopter

  ;external influence counters and statistics
  externals               ;; total number of external mass media contacts
]

patches-own [
 original-color
]

people-own [
  status                 ;; "potential", "adopter" of technology, "disrupter" who adopted new technology
  kind                   ;; 1 - 5 are "innovator","early_adopter","early_majority","late_majority","laggard" assuming Rogers' percentages
  change-agent?          ;; change agent can meet with multiple people (TBD)
  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
]

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; SETUP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to setup
  ca
  setup-globals
  setup-env
  setup-people
  setup-plot
end 

to setup-globals
  random-seed seed
  set time 0
  set total-population 0

  ;internal
  ;Note that kind-structure is based on Rogers' graphs, which is a normal distribution
  ;in which categories 1 & 2 = 5, while 3 = 4.  However category 1 is set by the number
  ;of adopters + disrupters - those who already have the new innovation.  So the table
  ;here is set to category 2 being the first category.  Adopters + Disrupters are
  ;set by sliders.
  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 kind-structure [ [ 2 12 ] [ 3 47 ] [ 4 81 ] [ 5 100 ] ]

  ;external
  set externals 0
end 

to setup-env
  ;patch is default initially
  ask patches [
    set pcolor black
    set original-color black
  ]

  ;adopter mass media center
  if e-adopt [
    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 orange
         set original-color orange
      ]
    ]
  ]

  ;disrupter mass media center
  if e-disrupt [
    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 cyan
         set original-color cyan
      ]
    ]
  ]
end 

to setup-people

  create-people initial-potentials [
      set total-population initial-potentials + total-population
      setup-people-parms
      setup-potential
      set kind determine-kind ( random 100 )
    ]

  if adopter-switch [
      set total-population initial-adopters + total-population
      create-people initial-adopters[
        setup-people-parms
        setup-adopter
        set kind 1
      ]
  ]

  if disrupter-switch [
    set total-population initial-disrupters + total-population
    create-people initial-disrupters [
       setup-people-parms
       setup-disrupter
       set kind 1
    ]
  ]
end 

to setup-people-parms
    setxy random-pxcor random-pycor ; centers on patch in Version 3.1
    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
end 

to setup-potential
      set status "potential"
      set color blue
end 

to setup-adopter
      set status "adopter"
      if random-float 100 < adopter-agent [
        set change-agent? TRUE ;not yet used for anything
        set shape "face happy"
      ]
      set color red
end 

to setup-disrupter
      set status "disrupter"
      if random-float 100 < disrupter-agent [
        set change-agent? TRUE ;not yet used for anything
        set shape "face happy"
      ]
      set color lime
end 

to-report determine-kind [ probability-index ]
    let this_kind first ( first ( filter [ last ? >= probability-index ] kind-structure ) )
    print (word this_kind " : " probability-index " : " filter [ last ? >= probability-index ] kind-structure)
    report (this_kind)
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; PROCESSING
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to go
  set time time + 1

  ;People who are not currently in a conversation will:
  ; (a) think about their current 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 adopter or adopt
  ;     the adoption if already a disrupter. 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 status.
  ask people [
      without-interruption [
        ;external influence is only for those whose status is not the same as the media center.
        if e-adopt and [pcolor] of patch-here = orange and status != "adopter" [
          check-external-adoption
        ]
        if e-disrupt and [pcolor] of patch-here = cyan and status != "disrupter" [
          check-external-disruption
        ]

        ;internal influence - if partner = self, mass media is in effect, so no other pairings possible
          ifelse partner = nobody [
            if status = "adopter" [rethink-adoption]
            if status = "disrupter" [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 

to check-external-adoption
  ;adoption check
    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
        if ( time > ( start-time + time-to-adopt-external )) [
          setup-adopter
        ]
        move-away
        set num-externals (num-externals + 1)
        set total-external-time (end-time - start-time + total-external-time)
        print (word time ": " who " has finished adoption mass media session with status " status)
      ][
        print (word time ": " who " is listening to mass media presentation for adopters")
      ]
    ]
end 

to check-external-disruption
  ;disruption check
    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
        if ( time > ( start-time + time-to-disrupt-external )) [
          setup-disrupter
        ]
        move-away
        set num-externals (num-externals + 1)
        set total-external-time (end-time - start-time + total-external-time)
        print (word time ": " who " has finished disruption mass media session with status " status)
      ][
        print (word time ": " who " is listening to mass media presentation for disrupters")
      ]
    ]
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 * 2) ;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
       ;Choose one of the eligible people to partner with - may want to consider other partnering strategies
       ;here - such as all on one's patch or one of patch + neighborhood
       set partner one-of other turtles-here with [partner = nobody]

       ;Set partner's attribute to me.  May want to consider a list of partners to look at memory
       ;of who one has partnered with
       set [partner] of partner self

       ;This person is the initiator, automating rendering the partner to a subordinate role
       set initiator? TRUE
       set [initiator?] of partner FALSE

       ;keep track of time conversation started
       set start-time time
       set [start-time] of partner time

       ;set time to end conversation with mean conversation length and std. deviation set to 25% of mean
       ;in multiple person interactions, can change to have some partners leave early and not adopt technology
       let conversation-end round((random-float conversation-length) + time )
       set end-time conversation-end
       set [end-time] of partner conversation-end

       ;Set patch of conversation to different color - since xcor and ycor are real numbers, patches may not exactly
       ;coincide with position of partners
       let this-color color
       set [pcolor] of patch-here this-color

       ;keep track of total number of conversations started in simulation
       set conversation-starts (conversation-starts + 1)
       print (word time ": conversation between " kind ", " status " " who " and " [kind] of partner ", " [status] of partner
             " " [who] of partner " until " end-time " at [" xcor "," ycor "]")
end 

to interact
    ifelse (time <= end-time) [
       ifelse (time > start-time) [
         set [pcolor] of patch-here yellow
         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 status = "potential" and [status] of partner = "adopter" [
         if adopter-switch [
           if random-float 100 < prob-adoption [setup-adopter]
         ]
       ][
         ifelse status = "potential" and [status] of partner = "disrupter" [
           if disrupter-switch [
             if random-float 100 < prob-disruption [setup-disrupter]
           ]
         ][
              print (word time ": no action for " status " " who " in conversation with " [status] of partner " " [who] 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)
          set [pcolor] of patch-here 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-adoption-to-potential [
      setup-potential
      print (word time ": reneged adoption => " who)
    ][
      if disrupter-switch and random-float 100 < prob-adoption-to-disruption [
        setup-disrupter
        print (word time ": adoption to disruption for " who)
      ]
    ]
end 

to rethink-disruption
    ifelse random-float 100 < prob-disruption-to-potential [
      setup-potential
      print (word ": reneged disruption => " who )
    ][
      if adopter-switch and random-float 100 < prob-disruption-to-adoption [
        setup-adopter
        print (word time ": disruption to adoption => " who)
      ]
    ]
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; PLOTTING PROCEDURES
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to setup-plot
  ;Histogram - don't set limits - let model autoset
  ;set-current-plot "Meetings"
  ;set-histogram-num-bars 10
  set-current-plot "Adopter Type"
  set-histogram-num-bars 5
  update-plot-type
end 

to update-plot-pop
  ;update time series
  set-current-plot "Populations"
  set-current-plot-pen "Total"
  plot count people
  set-current-plot-pen "Potentials"
  plot count people with [status = "potential"]
  set-current-plot-pen "Adopters"
  plot count people with [status = "adopter"]
  set-current-plot-pen "Disrupters"
  plot count people with [status = "disrupter"]
end 

to update-plot-stat
  ;contacts, conversations and meetings
  set-current-plot "Statistics"
  set-current-plot-pen "Contacts"
  plot contacts / time
  set-current-plot-pen "Starts"
  plot (conversation-starts / time)
  set-current-plot-pen "Ends"
  plot (conversation-ends / time)
  set-current-plot-pen "Externals"
  plot externals / time
end 

to update-plot-meet
  ;update meetings histogram
  set-current-plot "Meetings"
  set-current-plot-pen "Internal"
  histogram [num-conversations] of people
  set-current-plot-pen "External"
  histogram [num-externals] of people
end 

to update-plot-type
  ;update adopter type histogram
  set-current-plot "Adopter 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 

There is only one version of this model, created over 14 years ago by Uri Wilensky.

Attached files

No files

This model does not have any ancestors.

This model does not have any descendants.