Wisdom of Crowd vs. Unpopular Norm

No preview image

1 collaborator

Default-person Kashif Zia (Author)

Tags

(This model has yet to be categorized with any tags)
Visible to everyone | Changeable by everyone
Model was written in NetLogo 6.0 • Viewed 163 times • Downloaded 12 times • Run 0 times
Download the 'Wisdom of Crowd vs. Unpopular Norm' modelDownload this modelEmbed this model

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


WHAT IS IT?

A model of bystanders' effect on volunteering (in case of an observed crime or critical situation) is extended to incorporate the possibility of a sense of guilt (after nonintervention). Based on sound theoretical and experimental foundations, an existing model of the spread of unpopular norms is used to allow dispersion of an unpopular norm (a mild crime) so that a population of agents may follow or accept it. The question asked is why a society (as a whole) is not able to overturn an unpopular norm through interventions. The model and simulation reveal that a sense of guilt of bystanders improves the volunteering tendency. The simulation results also provide pieces of evidence of clear differentiation between the individual and societal perception of a crime. This is an important result as it suggests that, in a certain situation and community, we can predict how people will react against an unpopular norm.

HOW IT WORKS

A model to study dynamics of co-evolution of the spread of Unpopular norms and guilt-driven volunteering (to intervene). In addition to the time dynamics, we have also introduced spatial dynamics, which allow the agents to have the capability to move (along with their states). The form of mobility introduced is random-walk.

HOW TO USE IT

  • Set Models parameters (UN, VD, Combined)
  • Set simulation parameters population, interaction range (radius), are agents mobile, should the guilt be incorporated in volunteering model and model to run (Centola, Gerritsen or Combined)
  • press Setup, press Go

THINGS TO NOTICE

UN alone

  1. As the radius of interaction increase, the DBs who end up complying the UN increase.
  2. Within a radius, as the initial \% age of TBs increase, the DBs who end up complying the UN increase.
  3. Compliance jumps to highest level right at the start and then keep fluctuating across this highest level.
  4. As the population density increases, the DBs who end up complying the UN increase.

VD alone

  1. As the radius of interaction increase, the believers who end up as being neutralized by the volunteering effect decrease substantially.
  2. Within a radius, as the initial \% age of TBs increase, the neutralization is rather unclear (no relationship can be drawn).
  3. Neutralization happens progressively (and in phases) with time and then stays constant.
  4. As the population density increases, neutralization tendency decreases.

Combined

A sense of guilt of bystanders improves the volunteering tendency as the spread of UN happens.

THINGS TO TRY

EXTENDING THE MODEL

NETLOGO FEATURES

RELATED MODELS

CREDITS AND REFERENCES

To appear: "When the Wisdom of Crowd is able to overturn an Unpopular Norm? Lessons learned from an Agent-Based Simulation" in ACM SIGSIM PADS 2021 scheduled on June 2021 (https://www.acm-sigsim-pads.org/).

Comments and Questions

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

Click to Run Model

extensions [table]

breed [believers believer] ; True blievers of an unpopular norm
breed [disbelievers disbeliever] ; Disblievers of an unpopular norm

turtles-own[observe belief
  strength compliance  complying-for property  believe  offender-index  perform_intervention my-thresholds
   neighbor-list Enforcement enforcement-Need desire intention]

globals [DBComp DBEnf cnt-inter cnt-offenders cnt-neutralized curr-oi]

to setup
  __clear-all-and-reset-ticks
  ask patches [set pcolor white]

  let total_number population * count patches / 100 ; total population in terms of percentage of space to be acquired
  let number_of_TB total_number * tb-perc / 100 ; number of TBs in the population
  let number_of_DB total_number - number_of_TB ; the rest are DBs in the population

;//////////////////////////////////;
;creating TBs, color = red, placed randomly at empty patches only (no overlapping)
  create-believers number_of_TB [
    set color red
    setxy random-pxcor random-pycor
    while [any? other turtles-here] [ let empty_patch one-of patches with [any? turtles-here = false] move-to empty_patch ]
  ]
;//////////////////////////////////;

;//////////////////////////////////;
; setting up TBs
  ask believers[
     set belief 1 ; a TB really believes in UN
     set compliance 1 ; a TB is also complying the UN initially
     set strength 1 ; a TB is quite strong
     set heading 0 ; visual representation of compliance
     set complying-for 0 ; for how many continuous iterations a TB is complying
     set property "offender" ; in addition of being believer, a TB is also offender initially
     set observe table:make set believe table:make ; table of various observations
     set offender-index 1 ; since TB is offender so it offends with highest possible value of 1

     set size 1
     set shape "arrow"
   ]
;//////////////////////////////////;

;//////////////////////////////////;
; creating DBs color = green, placed randomly at empty patches only (no overlapping)
  create-disbelievers number_of_DB [
    set color green
    setxy random-pxcor random-pycor
    while [any? other turtles-here] [ let empty_patch one-of patches with [any? turtles-here = false] move-to empty_patch ]
  ]
;//////////////////////////////////;

;//////////////////////////////////;
; setting up DBs
  ask disbelievers
   [
     set belief -1 ; a DB does not believe in UN
     set compliance -1 ; a DB is also not complying the UN initially
     set strength random-float 0.3 ; a DB is NOT strong
     set heading 180 ; visual representation of NOT compliance
     set complying-for 0 ; for how many continuous iterations a DB is complying

     set property "bystanders" ; in addition of being DB, a DB is also a bystander initially
     set observe table:make set believe table:make ; table of various observations

     set perform_intervention "no" ; definately not to perform intervention initially
     set my-thresholds threshold ; the changeable my-thresholds initialized with variable threshold

     set size 1
     set shape "arrow"
   ]
;//////////////////////////////////;

; table of observations; IRRESPECTIVE of TB or DB. first observation is number_intervention_by_others = 0, and crime seriousness = parameter crime-intensity / 3 (from enumeration to index from 0.33 to 1)
  ask turtles [table:put observe "no_intervention_by_others" 0 table:put believe "seriousness" crime-intensity / 3]

;Global counting variables
  set cnt-offenders 0 ; number of offenders
  set cnt-inter 0 ; number of bystanders intervening
  set cnt-neutralized 0 ; number of offenders neutralized
  set curr-oi 0 ; average offending index in the system
end 

to go
  if ticks = stop-at [stop]

  if models = "Centola"
  [
    ED  ; Apply model of emporer dilemma applied to all agents
    reportdata ; save data for analysis
    ;VD  ; Apply model of volunteering dilemma applied to all agents
    draw-graphs
  ]

  if models = "Gerritsen"
  [
    ;ED  ; Apply model of emporer dilemma applied to all agents
    reportdata ; save data for analysis
    VD  ; Apply model of volunteering dilemma applied to all agents
    draw-graphs
  ]

  if models = "Combined"
  [
    ED  ; Apply model of emporer dilemma applied to all agents
    reportdata ; save data for analysis
    VD  ; Apply model of volunteering dilemma applied to all agents
    draw-graphs
  ]

  if mobility [ask turtles [random-walk]] ; let the agents move random walk if enabled
  tick
end 

to ED
  ask turtles [
    let N_Neighbors turtle-set turtles in-radius radius ; set of agents in the neighborhood of an agent (regular network within parameter radius)
    let Ni_list (list N_Neighbors)
    let Ni count N_Neighbors
    if Ni = 0 [set Ni 0.001]

    let Bi [belief] of self
    let NCi count N_Neighbors with [Compliance != Bi] ; how many agents in the neighborhood whose compliance is not equal to belief (self)

    ; enfocement need = (1 - (belief (self)/total number of neighbors)) x NCi (above) / 2
    set enforcement-Need (1 - Bi / Ni) * NCi ; enfocement need = (1 - (belief (self)/total number of neighbors)) x NCi (above) / 2
    set enforcement-need enforcement-Need / 2

    COMPLY? ; do compliance sub-routine
    ENFORCE? ; do enforcement sub-routine
  ]
end 

TO COMPLY?
  ;; disbeliever complies if the proportion of neighbors enforcing compliance is greater than the strength of disbeliever's belief;
   let Si [strength] of self
   let Bi [belief] of self
   let N_Neighbors turtle-set turtles in-radius radius
   let Ej count N_Neighbors with [Enforcement = -1 * Bi] ;; neighbors enforcing opposite belief
   let Ni count N_Neighbors
   if Ni = 0 [set Ni 0.001] ; just to aboid division by 0
   ; the equation implementation
   ifelse ((-1 * Bi / Ni) * Ej ) > Si [set compliance -1 * Bi] [set compliance Bi]
   if Compliance = 1 [set complying-for complying-for + 1]
   if Compliance = -1 [set complying-for 0]
end 

to VD

  let in-range nobody
  let current-intervener nobody
  ask turtles with [property = "offender"] ; only TBs which are offenders will be affecting an agent to intervene
  [
    ifelse (offender-index <= 0) [set color black set heading 180] ; nuetralized !!!!!!!!!!!!!!!!!!!!
    [
      set in-range other turtles with [property != "offender" and complying-for < crime-intensity] in-radius radius ; not offender and recently compyling or no complying
      if (count in-range != 0)
      [
        set current-intervener one-of in-range ; if such an agent exist, choose one of these as potential interviener
        ask current-intervener [set property "intervener" set color blue] ; set its propoerty to intervener and color to blue
        ask current-intervener [ ; now the chosen potential intervener woudl see who are related neighbors
          set neighbor-list turtles with [ property != "offender"] in-radius radius
        ]
        if (current-intervener != nobody) [applyrules current-intervener who] ; VD apply rules call on the current potential inteverner
      ]
    ]
  ]
end 

to ENFORCE?

   let Si [strength] of self
   let Bi [belief] of self
   let Ci [compliance] of self
   let Wi Enforcement-Need
   ;let N_Neighbors turtle-set turtles-on neighbors
   let N_Neighbors turtle-set turtles in-radius radius

   let Ej count N_Neighbors with [Enforcement = -1 * Bi] ;; neighbors enforcing opposite belief
   let Ni count N_Neighbors
   if Ni = 0 [set Ni 0.001]
   ifelse ((-1 * Bi / Ni) * Ej) > (Si + K) AND Bi != Ci
   [
     ;RELATIONSHIP
     set Enforcement -1 * Bi
     ;set shape "circle"

     set belief 1
     set strength 1
     set compliance 1
     set complying-for 0
     set size 1
     set shape "arrow"
     set heading 0
     set property "offender"
     ;set observe table:make set believe table:make
     set offender-index 1

   ]
   [
     ifelse (Si * Wi) > K AND Bi = Ci
     [
       set Enforcement Bi
     ]
     [
       set Enforcement 0
     ]
   ]
end 

to applyrules [current-intervener w]

let off turtle w ; the aggressor agent / offender

;step 1; count m
let m 0 ; m = the number of neighbors who already have performed intervention

;step 2. if there is no intervention already, the belief is that 'intervention will be evaluated negatively', otherwise not
ask current-intervener [set m count neighbor-list with [perform_intervention = "yes" ]]
ask current-intervener [ifelse (m = 0) [table:put believe "intervention-evaluated-negatively" true] [table:put believe "intervention-evaluated-negatively" false]]

;step 3. ;setting belief with another attribute 'other_observe_me' n with value neighbors list count
ask current-intervener [table:put believe "other-observe-me" count neighbor-list]

;step 4. 'audience inhibition' = n or n - m depending on of intervention will be evulated negatively
ask current-intervener [ifelse (table:get believe "intervention-evaluated-negatively") [table:put believe "audience-inhibation" table:get believe "other-observe-me"] [table:put believe "audience-inhibation" table:get believe "other-observe-me" - m]]

;step 5. ;setting belief 'intervention_cost' =  n - m [there is not much difference in rule 3 and 4 practically, with many agents]
ask current-intervener [table:put believe "intervention-cost" count neighbor-list - m]

;step 6. ; gettting speific values from table belief and comparing them with those thresholds , when the threshold values will be greater than of given beliefs then put another attribute to the table belief 'personal-responsibility' and its value 'true'
ask current-intervener
  [  ifelse (table:get believe "intervention-cost" < my-thresholds and  table:get believe "audience-inhibation" < my-thresholds ) ; no change in two threshold values
    [ table:put believe "personal_responsibility" true ]
    [table:put believe "personal_responsibility" false ]
  ]

;step 7. Determine belief about seriousness of the event; that is, seriousness=๐‘ ๐‘’๐‘Ÿ๐‘–๐‘œ๐‘ข๐‘ ๐‘›๐‘’๐‘ ๐‘ /(n-m) power ๐›ผ, where, initial value of seriousnessis normalized against crime_intensity enumerated as
;mild,medium and strong. Both crime_intensity and ๐›ผ are simulation parameters.
let x 0
  ask current-intervener [
    let y count neighbor-list - m
    if y = 0 [set y 0.001] ; to avoid division by 0
    set x table:get believe "seriousness"/ (y ^ alpha) table:put believe "seriousness" x
  ]

;step 8. Determine belief if it is an emergency situation or not; ifseriousness is greater thannormthenemergency= yes, other-wise, emergency = no, where norm is a simulation parameter.
ask current-intervener [ifelse (table:get believe "seriousness" > norm ) [ table:put believe  "Emergency"  true] [ table:put believe  "Emergency"  false] ]

;step 9. Know desire; if it is an emergency, the agent has a desire tointervene, otherwise, it has not
ask current-intervener [ ifelse (table:get believe "Emergency") [ set desire  "intervention"  ] [ set desire  "no_need_of_intervention" ]]

;step 10. Know Intention; if an agent feel_personal_responsibility andhas a desire, it has an intention to intervene, otherwise, ithas not.
ask current-intervener[ ifelse ( table:get believe "personal_responsibility" and desire = "intervention")
    [ set intention  "help" ] [ set intention  "not_to_intervene" ]  ]

;by default the intervener is capable and has resource.
ask current-intervener [table:put believe "capable" true table:put believe "resources" true]

;step 11.  ;when the belief contain the attributes 'capable' and 'resources' as true then the belief have another value 'opportunity_for' as true
  ask current-intervener[ if (table:get believe "capable" and table:get believe "resources" ) [table:put believe "opportunity_for" true ] ]

let guilt 0
ask current-intervener[
;step 12. Decide to intervene; if an agent has an intention and oppor-tunity it will perform.
  ifelse (intention = "help" and table:get believe "opportunity_for" =  true)
    [
      set perform_intervention "yes" set color brown
    ]
;step 13. Update threshold; if an agent does not perform, a guilt will be developed (guilt=๐‘๐‘Ÿ๐‘–๐‘š๐‘’_๐‘–๐‘›๐‘ก๐‘’๐‘›๐‘ ๐‘–๐‘ก๐‘ฆโˆ’๐‘š/๐‘›), and threshold(of this agent i) will be updated (๐‘กโ„Ž๐‘Ÿ๐‘’๐‘ โ„Ž๐‘œ๐‘™๐‘‘๐‘–+=๐‘”๐‘ข๐‘–๐‘™๐‘ก)
    [
      ifelse incorporate-guilt ; only if this flag is enabled
      [
        set perform_intervention "no" set guilt crime-intensity - (m / count neighbor-list) set my-thresholds my-thresholds + guilt
      ]
      [
        set perform_intervention "no"
      ]
    ]
]

;step 14. Update  offender_index  of  the  offender;  if  agent  has  per-formed (in above), the offender_index of offender is updatedas:๐‘œ๐‘“ ๐‘“๐‘’๐‘›๐‘‘๐‘’๐‘Ÿ_๐‘–๐‘›๐‘‘๐‘’๐‘ฅโˆ’=(๐‘š/๐‘๐‘Ÿ๐‘–๐‘š๐‘’_๐‘–๐‘›๐‘ก๐‘’๐‘›๐‘ ๐‘–๐‘ก๐‘ฆ).
    let what? false
    ask current-intervener[ if (perform_intervention = "yes") [set what? true]]
    if what? [
      ask off [
        set offender-index offender-index - (m / crime-intensity)
       ; This is not part of VD model
        if (offender-index <= 0) [set property "neutralized" set color black set heading 180]]
    ]
end 

to random-walk
  rt random 360               ; set random heading
  forward   1        ; advance one step
end 

to reportdata
  set DBComp count disbelievers with [compliance = -1 * belief] / count disbelievers * 100
  set DBEnf count disbelievers with [enforcement = -1 * belief] / count disbelievers * 100
end 

to draw-graphs
  set curr-oi 0
  ask turtles with [property = "offender"] [set curr-oi curr-oi + offender-index]
  set curr-oi curr-oi / count turtles
  set cnt-inter count turtles with [property = "intervener"] / count disbelievers * 100
  set cnt-offenders count turtles with [property = "offender"] / count believers * 100
  set cnt-neutralized count turtles with [property = "neutralized"] / count believers * 100
end 

There is only one version of this model, created about 3 years ago by Kashif Zia.

Attached files

No files

This model does not have any ancestors.

This model does not have any descendants.