Spatial Opinion Dynamics with Two Types of Mixing

Spatial Opinion Dynamics with Two Types of Mixing preview image

1 collaborator

Tags

(This model has yet to be categorized with any tags)
Visible to everyone | Changeable by the author
Model was written in NetLogo 6.0.1 • Viewed 182 times • Downloaded 8 times • Run 0 times
Download the 'Spatial Opinion Dynamics with Two Types of Mixing' modelDownload this modelEmbed this model

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


Comments and Questions

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

Click to Run Model

extensions [rnd]

globals [
  fizz ; measures the frequency of attitudes that change at each step
  L2 ;frequency of -2 attitudes
  L1 ;frequency of -1 attitudes
  R1 ;frequency of 1 attitudes
  R2 ;frequency of 2 attitudes
  interface-density
  relocate-timer
  telephone-timer
  num-turtles
  last-cross ;this is the last time step where the centers cross (1 if they never did)
  last-op-cross ; this is the last time step where the opinions cross (1 if they never did)
  higher-center ; this keeps track of which center has the higher frequency
  higher-op
]

turtles-own [
  old-attitude
  new-attitude
]

to setup
  clear-all
  ask patches [set pcolor gray]
  set-default-shape turtles "square"
  make-turtle-distribution
  ask turtles [
    set size 1.2
    set old-attitude new-attitude
    set color 5 - ((old-attitude / max-entrench) * 4.9)
  ] ; in order to do synchronous updating, we need to delay when agents update their attitudes, so we separate attitudes into new and old
  set fizz 0
  measure-frequency-over-time
  set num-turtles count turtles
  ifelse L1 > R1 [set higher-center "L1"] [set higher-center "R1"]
  ifelse (L1 + L2) > (R1 + R2) [set higher-op "L"] [set higher-op "R"]
  set last-cross 1
  if measure-interface-density [measuring-interface-density]
  reset-ticks
end 

to go
  if not any? turtles with [old-attitude >= 1] or not any? turtles with [old-attitude <= -1] [stop]
  ask turtles [ local-interactions ]
  if relocation [ relocate ]
  if telephone? [
    ifelse telephone-timer = 0 [set telephone-timer telephone-freq] [set telephone-timer telephone-timer - 1 ]
  ]
  set fizz (count turtles with [old-attitude != new-attitude]) / count turtles
  ask turtles [
    set old-attitude new-attitude
    set color 5 - ((old-attitude / max-entrench) * 4.9)
  ]
  measure-frequency-over-time
  check-last-cross
  if measure-interface-density [measuring-interface-density]
  tick
end 

to local-interactions
  let j nobody ; j will be the other agent, which we initially set as nobody
  ifelse influence = "max-inf" or influence = "min-inf" [
    if influence = "max-inf" [
      set j max-one-of turtles-on neighbors [abs old-attitude] ]
    if influence = "min-inf" [
      set j min-one-of turtles-on neighbors [abs old-attitude] ]
  ]
  [
    ifelse telephone? and telephone-timer = 0 and random-float 1 < frac-to-telephone [
      set j one-of turtles
    ]
    [
      set j rnd:weighted-one-of (turtles-on neighbors) [abs influence-function [old-attitude] of self]
    ]
  ]
  if is-turtle? j [ ;it is possible that no agent ends up getting picked in the line above, so this checks that someone has
    ifelse random-float 1 < opinion-amplification [
      if [old-attitude] of j > 0 [
        if abs old-attitude < max-entrench [
          ifelse old-attitude = -1 [set new-attitude 1] [ set new-attitude old-attitude + 1 ]]
      ]
      if [old-attitude] of j < 0 [
        if abs old-attitude < max-entrench [
          ifelse old-attitude = 1 [set new-attitude -1] [set new-attitude old-attitude - 1 ]]
    ]]
    [
      if [old-attitude] of j > old-attitude [
        ifelse old-attitude = -1 [set new-attitude 1] [ set new-attitude old-attitude + 1]]
      if [old-attitude] of j < old-attitude [
        ifelse old-attitude = 1 [ set new-attitude -1][set new-attitude old-attitude - 1 ]]
    ]
  ]
end 

to relocate ; much faster then using "ask turtles []"
  let allagents [self] of n-of (floor (frac-to-relocate * num-turtles)) turtles ; create a list of all agents
  let total ((length allagents) - 1)
  let i 0
  while [i < total] ; for each 2 agents in a list
  [
    let tempx [xcor] of item i allagents
    let tempy [ycor] of item i allagents
    ask (item i allagents) [
      set xcor [xcor] of item (i + 1) allagents
      set ycor [ycor] of item (i + 1) allagents]
    ask (item (i + 1) allagents) [set xcor tempx set ycor tempy]
    set i (i + 2) ; increment index by 2
  ]
end 

to-report influence-function [item1]
  if influence = "linear" [
    ifelse item1 = 0 [report 1] [report item1] ]  ; this is the linear update function
  if influence = "square" [
    ifelse item1 = 0 [report 1] [report (item1 ^ 2)]] ; this weighs extreme attitudes more than moderate ones
  if influence = "uniform" [
    if item1 < 0 [report -1]
    if item1 > 0 [report 1] ]
  if influence = "co-linear" [
    ifelse item1 = 0 [report 1] [report (max-entrench + 1 - abs item1) ] ]
  if influence = "co-square" [
    ifelse item1 = 0 [report 1] [report (max-entrench + 1 - abs item1) ^ 2 ] ]
end 

to make-turtle-distribution
  ifelse rnd-initial [
    ask patches [;; every patch will either have a positive or negative attitude placed on them. The probability of one over the other is set by polluter-to-nonpolluter-ratio
      ifelse random-float 1 < positive-to-negative-ratio [
        sprout 1 [
          set new-attitude (random init-attitude) + 1
        ]
      ]
      [
        sprout 1 [
          set new-attitude 0 - (random init-attitude) - 1
        ]
      ]
    ]
  ][;;otherwise, the positive attitudes are arranged to form a circle, with a radius set by radius-size
    ask patches [
      ifelse (abs pxcor) ^ 2 + (abs pycor) ^ 2 <= radius-size ^ 2 [
        sprout 1 [
          set new-attitude max-entrench
        ]
      ]
      [
        sprout 1 [
          set new-attitude (0 - max-entrench)
        ]
      ]
    ]
  ]
end 

to check-last-cross
  let hc ""
  ifelse L1 > R1 [set hc "L1"] [set hc "R1"]
  if higher-center != hc [
    set higher-center hc
    set last-cross ticks
  ]
  let ho ""
  ifelse (L1 + L2) > (R1 + R2) [set ho "L"] [set ho "R"]
  if higher-op != ho [
    set higher-op ho
    set last-op-cross ticks
  ]
end 

to measuring-interface-density
  let g []
  ask turtles [
    let d 0
    ask turtles-on neighbors [
      if ([old-attitude] of self * [old-attitude] of myself) < 0 [set d d + 1]
    ]
  set g fput (d / 8) g
  ]
  set interface-density mean g
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; STATISTICS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to measure-frequency-over-time
  set L2 count turtles with [old-attitude = -2] / count turtles
  set L1 count turtles with [old-attitude = -1] / count turtles
  set R1 count turtles with [old-attitude = 1] / count turtles
  set R2 count turtles with [old-attitude = 2] / count turtles
end 

;; Copyright Bert Baumgaertner
;; See info tab for credits

There are 3 versions of this model.

Uploaded by When Description Download
Bert Baumgaertner 3 months ago Updated to work with NetLogo 6 Download this version
Bert Baumgaertner over 1 year ago Added instruction for rnd extension Download this version
Bert Baumgaertner over 1 year ago Initial upload Download this version

Attached files

File Type Description Last updated
rnd.jar extension Copy this extension into a folder you create called "rnd" in the extensions folder. 3 months ago, by Bert Baumgaertner Download
Spatial Opinion Dynamics with Two Types of Mixing.png preview Preview for 'Spatial Opinion Dynamics with Two Types of Mixing' over 1 year ago, by Bert Baumgaertner Download

This model does not have any ancestors.

This model does not have any descendants.