Online Community Simulator

Online Community Simulator preview image

1 collaborator

Alberto_smile_avatar Alberto Cottica (Author)

Tags

communities 

Tagged by Alberto Cottica over 2 years ago

community management  

Tagged by Alberto Cottica over 2 years ago

networks 

Tagged by Alberto Cottica over 2 years ago

online 

Tagged by Alberto Cottica over 2 years ago

Visible to everyone | Changeable by everyone
Model was written in NetLogo 5.3.1 • Viewed 425 times • Downloaded 7 times • Run 0 times
Download the 'Online Community Simulator' modelDownload this modelEmbed this model

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


Info tab cannot be displayed because of an encoding error

Comments and Questions

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

Click to Run Model

globals [ total-membership-strength decay total-comments gini-index-membership lorenz-points gini-index-comms ]

turtles-own [my-comments]

breed [ members member ]
members-own [ extra-chattiness membership-strength join-date latest-interaction active?]

breed [ managers manager ]

directed-link-breed [ intimacy-links intimacy-link ]
intimacy-links-own [ strength ]

directed-link-breed [ interaction-links interaction-link ]
interaction-links-own [ comments latest ] ;; NetLogo does not support multiple edges! The "latest" property keeps
                                         ;; track of the last time member i communicated with members j

to setup
  ca
  reset-ticks
  set decay 1 / 100
  set-default-shape turtles "circle"
  ;; the initial network is a clique of numerosity founders + 1 manager
  create-managers 1 [ set color red  set my-comments 0]
  create-members founders [ set color white set join-date -1 set active? True set my-comments 0]
  ask members [ create-intimacy-links-to other members ]
  ask intimacy-links [ set strength 1 ]
  ask members [ set extra-chattiness 0 ]
  layout
  update-membership-strength
  update-lorenz-and-gini
  repeat count members [ tick ]
  reset-timer
end 

to go
  create-members 1 [
    set color white
    setxy random-xcor random-ycor
    set join-date ticks
    set active? True
    set my-comments 0
    ]
  converse
  update-intimacy-links
  update-membership-strength
  if count members > num-members [ show ( word "Time elapsed: " timer " seconds.") stop ]
  manage-community
  update-lorenz-and-gini
  update-gini-comms
  tick
end 

to converse
  ;; each member must decide whether to engage in interaction.
  ;; probability of engaging increases if member received communication the previous period.
  ask members with [ active? ] [
    if my-in-interaction-links with [ latest = ticks - 1 ] != nobody [ ;; need to distinguish between in-interaction-links of community managers and those of members. Need an agentset with two "with" conditions!
      set extra-chattiness 0.2
      ]
    if random-float 1.0 <= chattiness + extra-chattiness [
      connect
    ]
    set extra-chattiness 0 ;; after the decision to connect reset the extra chattiness
  ]
  ;; layout
end 

to connect
  ;; the member has decided to engage, now she must select the target of her communication.
  ;; average number of targets is 1
  ;; iterate over other members. Prob of creating an interaction-link with another member depends
  ;; on (relative) strength of intimacy-links with it
  ;; compute each numerator and decide whether to engage.
  let denominator count members ;; the denominator of equation (1) in the PDF file is at least count members
  let connect? False
  ask other members [
    let strength1 0
    let strength2 0
    if in-intimacy-link-from myself != nobody [
      ask in-intimacy-link-from myself [ set strength1 strength ]
      if out-intimacy-link-to myself != nobody [
        ask out-intimacy-link-to myself [ set strength2 strength ]
        set denominator denominator + 1 + intimacy-strength * strength1 * strength2
      ]
    ]
  ]
  ask other members [
    let numerator 1
    let strength1 0
    let strength2 0
    if in-intimacy-link-from myself != nobody [
      ask in-intimacy-link-from myself [ set strength1 strength ]
      if out-intimacy-link-to myself != nobody [
        ask out-intimacy-link-to myself [ set strength2 strength ]
        set numerator 1 + intimacy-strength * strength1 * strength2
      ]
    ]
    if numerator / denominator > random-float 1.0 [  ;; roll the dice for connecting each other member
      set connect? True  ;; keep track that at least one connection happened
      set my-comments my-comments + 1
      set total-comments total-comments + 1
      create-interaction-link-from myself [ set color 93 ] ;; if there already was one, the instruction is ignored
      ask in-interaction-link-from myself [
          set latest ticks
          set comments comments + 1
        ]
        create-intimacy-link-from myself ;; if there already was one, the instruction is ignored
        ask in-intimacy-link-from myself [ set strength strength + 1]
      ]
  ]
  if connect? = True [ set latest-interaction ticks ]
end 

to update-intimacy-links
  ask intimacy-links [
    set strength strength / ( 1 + decay )
  ]
end 

to update-membership-strength
  ask members with [ active? ] [
    let ms 0
    ask my-in-intimacy-links [
      set ms ms + strength
    ]
    set membership-strength ms
    if membership-strength < threshold and ticks - join-date > 50 [
      set active? False
      set color grey
      set membership-strength 0
      ]
    set total-membership-strength total-membership-strength + ms
  ]
end 

to manage-community
  if onboard = True [
    ask managers [ do-onboarding ]
  ]
  if engage = True [
    ask managers [ do-engagement ]
  ]
end 

to do-onboarding
  if ticks > 0 [
    create-interaction-links-to members with [ join-date = ticks - 1 ] [
      set latest ticks
      set comments 1
    ]
    create-intimacy-links-to members with [ join-date = ticks - 1  ] [
      set strength 1
    ]
    set my-comments my-comments + count members with [ join-date = ticks - 1 ] ;; in this model this is always 1.
  ]
end 

to do-engagement
  if ticks > 0 [ ;; to avoid generalized engagement in the first tick
    create-interaction-links-to members with [ latest-interaction = ticks - 1 ] [ set color 93 ] ;; if it's already there, it will be ignored
    create-intimacy-links-to members with [ latest-interaction = ticks - 1 ] ;; ditto
    let this-tick-comms 0
    ask members with [ latest-interaction = ticks - 1 ] [
      ask in-interaction-link-from myself [
        set latest ticks
        set comments comments + 1
        set this-tick-comms this-tick-comms + 1
      ]
      ask in-intimacy-link-from myself [ set strength strength + 1 ]
    ]
    set my-comments my-comments + this-tick-comms
  ]
end 

;; ============ REPORTERS ========================

;; COMPUTE LORENZ CURVE AND GINI COEFFICIENT
;; adapted from Wilensky, U. (1998). NetLogo Wealth Distribution model.
;; http://ccl.northwestern.edu/netlogo/models/WealthDistribution.
;; this procedure recomputes the value of gini-index-reserve
;; and the points in lorenz-points for the Lorenz and Gini-Index plots

to update-lorenz-and-gini
  let sorted-ms sort [membership-strength] of members
  let total-ms sum sorted-ms
  let ms-sum-so-far 0
  let index 0
  set gini-index-membership 0
  set lorenz-points []

  ;; now actually plot the Lorenz curve -- along the way, we also
  ;; calculate the Gini index.
  ;; (see the Info tab for a description of the curve and measure)
  repeat count members [
    set ms-sum-so-far (ms-sum-so-far + item index sorted-ms)
    set lorenz-points lput ((ms-sum-so-far / total-ms) * 100) lorenz-points ;; lput is like append in Python
    set index (index + 1)
    set gini-index-membership
    gini-index-membership +
    (index / count members ) -
    (ms-sum-so-far / total-ms )
  ]
end 

to-report dropouts
  report count members -  count members with [ active? ]
end 

to update-gini-comms ;
  let sorted-mc sort [my-comments] of members
  let total-mc sum sorted-mc
  let mc-sum-so-far 0
  let index-comms 0
  set gini-index-comms 0

  ;; calculate the Gini index.
  repeat count members [
    set mc-sum-so-far (mc-sum-so-far + item index-comms sorted-mc)
    set index-comms (index-comms + 1)
    set gini-index-comms
    gini-index-comms +
    (index-comms /  count members ) -
    (mc-sum-so-far / (total-mc + 0.000001 ))
  ]
end 


;; =============================================================
;; LAYOUT PROCEDURE
;; stolen from the preferential attachment model by Uri Wilensky

to layout
  ;; the number 3 here is arbitrary; more repetitions slows down the
  ;; model, but too few gives poor layouts
  repeat 3 [
    ;; the more turtles we have to fit into the same amount of space,
    ;; the smaller the inputs to layout-spring we'll need to use
    let factor sqrt count turtles
    ;; numbers here are arbitrarily chosen for pleasing appearance
    layout-spring turtles links (1 / factor) (15 / factor) (4 / factor)
    display  ;; for smooth animation
  ]
  ;; don't bump the edges of the world
  let x-offset max [xcor] of turtles + min [xcor] of turtles
  let y-offset max [ycor] of turtles + min [ycor] of turtles
  ;; big jumps look funny, so only adjust a little each time
  set x-offset limit-magnitude x-offset 0.1
  set y-offset limit-magnitude y-offset 0.1
  ask turtles [ setxy (xcor - x-offset / 2) (ycor - y-offset / 2) ]
end 

to-report limit-magnitude [number limit]
  if number > limit [ report limit ]
  if number < (- limit) [ report (- limit) ]
  report number
end 

to-report manager-comms
  report [my-comments] of turtle 0
end 
;; =================================================

There is only one version of this model, created over 2 years ago by Alberto Cottica.

Attached files

File Type Description Last updated
Online Community Simulator.png preview Preview for 'Online Community Simulator' over 2 years ago, by Alberto Cottica Download

This model does not have any ancestors.

This model does not have any descendants.