Fukuyama Great Disruption

Fukuyama Great Disruption preview image

1 collaborator

Default-person Artem Serdyuk (Author)

Tags

(This model has yet to be categorized with any tags)
Visible to everyone | Changeable by the author
Model was written in NetLogo 7.0.0 • Viewed 7 times • Downloaded 0 times • Run 0 times
Download the 'Fukuyama Great Disruption' 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?

This is an evolutionary biology model. In it, agents (cows) compete for natural resources (grass). Cows that are more successful in getting grass reproduce more often, and will thus be more evolutionarily successful. This model includes two kinds of cows, greedy and cooperative. It shows how these two different strategies do when competing against each other within a population that evolves over time.

This model (and Altruism and Divide the Cake) are part of the EACH unit ("Evolution of Altruistic and Cooperative Habits: Learning About Complexity in Evolution"). See http://ccl.northwestern.edu/rp/each/index.shtml for more information on the EACH unit. The EACH unit is embedded within the BEAGLE (Biological Experiments in Adaptation, Genetics, Learning and Evolution) evolution curriculum. See http://ccl.northwestern.edu/rp/beagle/index.shtml.

HOW IT WORKS

Every turn, each cow looks at the patch that it is currently on, and eats a unit of grass. The greedy cows eat the grass regardless of the length of the grass on the current patch. The cooperative cows won't eat the grass below a certain height. This behavior is significant because below a certain height (called the "growth threshold"), the grass grows at a far slower rate than above it. Thus, the cooperative agents leave more food for the overall population at a cost to their individual well-being, while the greedy agents eat the grass down to the nub, regardless of the effect on the overall population.

HOW TO USE IT

GO: Starts and stops the model.

SETUP: Resets the simulation according to the parameters set by the sliders.

INITIAL-COWS: Sets the number of initial cows.

COOPERATIVE-PROBABILITY: Sets the chance an initial cow will be of the cooperative breed

STRIDE-LENGTH: This value determines the movement of the cows. Each cow will move forward a distance of STRIDE-LENGTH each turn. As the value is increased, the cows will move to other patches more frequently.

GRASS-ENERGY: Each time a cow can eat some grass from the patch that it currently occupies, it increases its energy by the value of this slider.

METABOLISM: Every time step, each cow loses the amount of energy set by this slider. If the cows energy dips below 0, it dies. Every cow starts with a default energy of 50, which means it can go 50 / METABOLISM turns without eating.

REPRODUCTION-THRESHOLD: If a cow's energy reaches the value of this slider, it reproduces. This value represents the food-gathering success that a cow would have to have in order to be able to reproduce.

REPRODUCTION-COST: Each time a cow reproduces, it loses the amount of energy set by this slider. This value represents the energy cost of reproduction.

LOW-GROWTH-CHANCE: This value is the percentage chance that the grass below the growth threshold will grow back. The higher this value, the less the discrepancy between the behaviors of the cooperative and greedy cows.

HIGH-GROWTH-CHANCE: This value is the percentage chance that the grass above the growth threshold will grow back. The lower this value, the less the discrepancy between the behaviors of the cooperative and greedy cows.

MAX-GRASS-HEIGHT: This value sets the highest length to which the grass can grow.

LOW-HIGH-THRESHOLD: This value sets the grass growth threshold. At, or above this value, the grass grows back with HIGH-GROWTH-CHANCE. Below this value, the grass grows back with LOW-GROWTH-CHANCE.

THINGS TO NOTICE

Run the model with the default settings. Watch the different growth curves on the population plot. Which population expands first? Which population wins in the end?

THINGS TO TRY

Slowly decrease the STRIDE-LENGTH slider. What happens to the populations?

At what value of STRIDE-LENGTH do the populations' growth rates change dramatically? What does this indicate about the evolutionary advantages of cooperating versus being greedy? What are the important environmental factors?

Change the METABOLISM and the GRASS-ENERGY values. How do these values affect the model?

Change the LOW-GROWTH-CHANCE and the HIGH-GROWTH-CHANCE values. How do these values affect the model?

How does the LOW-HIGH-THRESHOLD value affect the growth of the populations?

Can you find settings that maximize the advantage of the cooperative cows?

EXTENDING THE MODEL

This model explores only one type of cooperative behavior, namely eating the grass above the growth threshold (the LOW-HIGH-THRESHOLD value). What other cooperative, or altruistic, behaviors could be modeled that hurt individual fitness, while helping the group overall? What environmental conditions other than grass length could be used to affect the health of a population?

This model relies primarily upon population "viscosity" (the STRIDE-LENGTH slider) to alter the behavior of the cows to allow for the success of the cooperative agents. What other variables could have such a drastic effect on the evolutionary success of populations?

Also, consider that in this model the behaviors are fixed. What would happen if the agents learned, or changed their behavior based on food availability?

NETLOGO FEATURES

Breeds are used to represent the two different kinds of agents. The turtles primitive is used to refer to both breeds together.

RELATED MODELS

  • Altruism
  • Divide the Cake

CREDITS AND REFERENCES

This model, the Altruism model and the Divide the Cake model are part of the curriculum unit "Evolution of Altruistic and Cooperative Habits: Learning About Complexity in Evolution". See http://ccl.northwestern.edu/rp/each/index.shtml for more information. The EACH unit is embedded within the BEAGLE (Biological Experiments in Adaptation, Genetics, Learning and Evolution) evolution curriculum. See http://ccl.northwestern.edu/rp/beagle/index.shtml.

Thanks to Damon Centola, Eamon McKenzie, Josh Mitteldorf, and Scott Styles.

HOW TO CITE

If you mention this model or the NetLogo software in a publication, we ask that you include the citations below.

For the model itself:

Please cite the NetLogo software as:

COPYRIGHT AND LICENSE

Copyright 1997 Uri Wilensky.

CC BY-NC-SA 3.0

This model is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License. To view a copy of this license, visit https://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

NetLogo itself is free software for non-commercial use under the terms of the GNU General Public License (see full license information here).

To inquire about commercial licenses for either NetLogo or specific models from the models library, please contact netlogo-commercial-admin@ccl.northwestern.edu.

This model was created as part of the project: CONNECTED MATHEMATICS: MAKING SENSE OF COMPLEX PHENOMENA THROUGH BUILDING OBJECT-BASED PARALLEL MODELS (OBPML). The project gratefully acknowledges the support of the National Science Foundation (Applications of Advanced Technologies Program) -- grant numbers RED #9552950 and REC #9632612.

This model was converted to NetLogo as part of the projects: PARTICIPATORY SIMULATIONS: NETWORK-BASED DESIGN FOR SYSTEMS LEARNING IN CLASSROOMS and/or INTEGRATED SIMULATION AND MODELING ENVIRONMENT. The project gratefully acknowledges the support of the National Science Foundation (REPP & ROLE programs) -- grant numbers REC #9814682 and REC-0126227. Converted from StarLogoT to NetLogo, 2001.

Comments and Questions

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

Click to Run Model

;; ============================================================================
;; DISRUPTION NETLOGO MODEL
;; Based on Francis Fukuyama's "The Great Disruption" (1999)
;; ============================================================================
;;
;; FIXES:
;; 1. Trust/cooperation no longer artificially inflated
;; 2. Phase transitions based on emergent cooperation clusters (theory-grounded)
;; 3. Gradual, realistic recovery through local trust formation
;; 4. Added cooperative cluster detection
;; ============================================================================

globals [
  cooperation-payoff
  sucker-payoff
  temptation-payoff
  defection-payoff
  current-phase
  cooperation-rate
  avg-wellbeing
  avg-trust
  
  ;; Track emergence indicators
  cooperative-clusters        ;; Number of stable cooperation clusters
  avg-cluster-size           ;; Average size of cooperative groups
  norm-strength              ;; Strength of emergent cooperative norms
  ticks-in-phase             ;; How long in current phase
]

turtles-own [
  strategy 
  score 
  wellbeing 
  trust-level
  times-cooperated 
  times-defected 
  cooperative-neighbors
  recovery-rate 
  max-trust-level 
  max-wellbeing-level 
  times-disrupted
  cooperation-bias      ; -0.5 to 0.5: pull toward cooperate (positive) or defect (negative)
  trust-disposition     ; 0.3 to 1.0: how easily trusts (affects trust growth/decay)

  
  ;; NEW: For cluster tracking
  in-cooperative-cluster?     ;; Is agent part of stable coop group?
  cluster-id                  ;; Which cluster belongs to
  local-norm-strength         ;; Local strength of cooperation norms
]

;; ============================================================================
;; SETUP
;; ============================================================================

to setup
  clear-all
  set temptation-payoff 5
  set cooperation-payoff 3
  set defection-payoff 1
  set sucker-payoff 0
  
  set current-phase "stable"
  set ticks-in-phase 0
  set cooperative-clusters 0
  set norm-strength 50
  
ask patches [
  sprout 1 [
    ;; OPTION 1: Traits influenced by initial-cooperation-rate
    ;; Higher cooperation-rate → more cooperation-biased population
    let society-bias (initial-cooperation-rate - 50) / 100  ; -0.5 to +0.5
    set cooperation-bias society-bias + random-float 0.6 - 0.3     ; centered on society norm
    set trust-disposition 0.4 + (initial-cooperation-rate / 200) + random-float 0.4
    
    ;; Starting conditions reflect societal cooperation level
    let base-wellbeing 30 + (initial-cooperation-rate / 2)
    let base-trust 30 + (initial-cooperation-rate / 2)
    set wellbeing max list 0 min list 100 random-normal base-wellbeing 15
    set trust-level max list 0 min list 100 random-normal base-trust 15
    
    ;; Strategy still varies around the rate
    let coop-chance initial-cooperation-rate + (cooperation-bias * 20)
    ifelse random-float 100 < coop-chance 
      [set strategy "cooperate"]
      [set strategy "defect"]
    
    set score 0
    set times-cooperated 0
    set times-defected 0
    
    ;; MORE DIVERSE recovery rates
    set recovery-rate 0.2 + random-float 1.3            ; 0.2 to 1.5 (wider range)
    
    ;; DIVERSE capacity limits
    set max-trust-level 60 + random-float 40            ; 60 to 100
    set max-wellbeing-level 60 + random-float 40        ; 60 to 100
    
    set times-disrupted 0
    set in-cooperative-cluster? false
    set cluster-id -1
    set local-norm-strength 50
      set shape "person"
  ]
]
  
  ask turtles [update-appearance]
  
  calculate-metrics
  detect-cooperative-clusters

  reset-ticks
end 

;; ============================================================================
;; MAIN LOOP
;; ============================================================================

to go
  set ticks-in-phase ticks-in-phase + 1
  
  ;; Theory-based phase transitions
  check-phase-transition-theory-based
  
  if current-phase = "disruption" and ticks-in-phase < 50 [apply-disruption-pressure]
  
  ;; Update local norms BEFORE strategy decisions
  ask turtles [update-local-norms]
  
  ask turtles [    
    update-strategy
    play-game
    update-wellbeing
    update-trust
  ]
  
  calculate-metrics
  detect-cooperative-clusters
  
  ask turtles [ update-appearance ]
  
  tick
end 

;; ============================================================================
;; PHASE TRANSITIONS (THEORY-GROUNDED)
;; ============================================================================

to check-phase-transition-theory-based
  
  ;; DISRUPTION → RECONSTRUCTION
  ;; Trigger: Multiple stable cooperative clusters form (voluntary associations)
  if current-phase = "disruption" [
    if cooperative-clusters >= 3 and 
       avg-cluster-size >= 5 and
       ticks-in-phase > 30 [
      
      let stable-cooperators count turtles with [
        in-cooperative-cluster? and 
        strategy = "cooperate" and
        times-cooperated > times-defected * 2
      ]
      
      if stable-cooperators > (count turtles * 0.15) [
        set current-phase "reconstruction"
        set ticks-in-phase 0
      ]
    ]
  ]
  
  ;; RECONSTRUCTION → STABLE
  if current-phase = "reconstruction" [
    if cooperation-rate > 65 and 
       norm-strength > 65 and
       ticks-in-phase > 90 [
      set current-phase "stable"
      set ticks-in-phase 0
    ]
    
    ;; Safety valve: Accept lower equilibrium after long reconstruction
    if ticks-in-phase > 500 [
      if cooperation-rate > 50 and norm-strength > 50 [
        set current-phase "stable"
        set ticks-in-phase 0
      ]
    ]
  ]
end 

;; ============================================================================
;; COOPERATIVE CLUSTER DETECTION
;; ============================================================================

to detect-cooperative-clusters
  ;; Reset cluster membership
  ask turtles [
    set cluster-id -1 
    set in-cooperative-cluster? false  ;; Clear old markings
  ]
  
  let current-cluster-id 0
  let cluster-sizes []
  
  ask turtles with [strategy = "cooperate" and cluster-id = -1] [
    ;; Start new cluster
    set cluster-id current-cluster-id
    
    let cluster-members (turtle-set self)
    let frontier (turtle-set self)
    
    ;; Flood-fill to find all connected cooperators
    while [any? frontier] [
      let new-frontier turtle-set nobody
      ask frontier [
        let coop-neighbors (turtles-on neighbors) with [
          strategy = "cooperate" and cluster-id = -1
        ]
        ask coop-neighbors [
          set cluster-id current-cluster-id
          set cluster-members (turtle-set cluster-members self)
          set new-frontier (turtle-set new-frontier self)
        ]
      ]
      set frontier new-frontier
    ]
    
    let cluster-size count cluster-members
    
    ;; NEW: Only mark as "in cluster" if cluster is meaningful size
    if cluster-size >= 3 [
      ask cluster-members [set in-cooperative-cluster? true]
      set cluster-sizes lput cluster-size cluster-sizes
    ]
    ;; If cluster too small, agents remain with in-cooperative-cluster? = false
    
    set current-cluster-id current-cluster-id + 1
  ]
  
  set cooperative-clusters length cluster-sizes
  ifelse empty? cluster-sizes
    [set avg-cluster-size 0]
    [set avg-cluster-size mean cluster-sizes]
  
  ;; Calculate social organization correctly
  set norm-strength mean [local-norm-strength] of turtles
end 

;; ============================================================================
;; UPDATE LOCAL NORMS
;; ============================================================================

to update-local-norms
  ;; Fukuyama: norms emerge from repeated local interactions
  let coop-proportion 0
  let my-neighbors turtles-on neighbors
  
  if any? my-neighbors [
    set coop-proportion (count my-neighbors with [strategy = "cooperate"]) / 
                        (count my-neighbors)
  ]
  
  ;; Local norm strengthens when cooperation is common and sustained
  if in-cooperative-cluster? [
    set local-norm-strength min list 100 (local-norm-strength + 0.5)
  ]
  
  ;; Norms weaken in defection-dominated areas
  if coop-proportion < 0.3 [
    set local-norm-strength max list 0 (local-norm-strength - 0.3)
  ]
  
  ;; During disruption, norms erode faster
  if current-phase = "disruption" [
    set local-norm-strength max list 0 (local-norm-strength - 0.5)
  ]
end 

;; ============================================================================
;; STRATEGY UPDATE
;; ============================================================================

to update-strategy
  let my-neighbors turtles-on neighbors
  
  if any? my-neighbors [
    set cooperative-neighbors count my-neighbors with [strategy = "cooperate"]
    
    ;; 1. Imitate successful neighbors (social learning)
    let best-neighbor max-one-of my-neighbors [score]
    if best-neighbor != nobody and [score] of best-neighbor > score 
    [
      let exploration-rate (15 + (100 - trust-level) * 0.3) * (1.5 - trust-disposition)
      if random-float 100 < exploration-rate [set strategy [strategy] of best-neighbor]
    ]
    
    ;; 2. High trust + strong local norms → cooperation (Fukuyama: internalized norms guide behavior)
    if strategy = "defect" and trust-level > 70 and local-norm-strength > 60 [
      if random-float 100 < ((trust-level + local-norm-strength) / 3) [
        set strategy "cooperate"
      ]
    ]
    
    let wellbeing-cutoff avg-wellbeing * 0.4
    ;; 3. Desperation leads to EXPLORATION, not forced cooperation
    if wellbeing < wellbeing-cutoff [
      if random-float 100 < 30 [
        ;; Try the OPPOSITE strategy as experiment
        set strategy ifelse-value (strategy = "cooperate") ["defect"]["cooperate"]
      ]
    ]
    
    ;; 4. Positive cluster effects (Fukuyama: voluntary associations). Being in cooperative cluster makes cooperation more attractive
    if in-cooperative-cluster? and cooperative-neighbors >= 4 [
      if strategy = "defect" and random-float 100 < (local-norm-strength / 2) [set strategy "cooperate"]
    ]
    
    ;; cooperation-bias creates gentle pull toward preferred strategy
    if random-float 1.0 < abs cooperation-bias * 0.15 [
      if cooperation-bias > 0 and strategy = "defect" and cooperative-neighbors >= 2  [set strategy "cooperate"]
      if cooperation-bias < 0 and strategy = "cooperate" and cooperative-neighbors < 3 [set strategy "defect"]
    ] 
  ]
end 

;; ============================================================================
;; TRUST UPDATE
;; ============================================================================

to update-trust
  let trust-change 0
  
  ;; Trust grows from SUSTAINED cooperative experiences
  if strategy = "cooperate" and cooperative-neighbors >= 2 [
    ;; Scale by local norm strength (trust easier in normative environment)
   set trust-change trust-change + (trust-growth-rate * (local-norm-strength / 100) * trust-disposition)

  ]
  
  if cooperative-neighbors >= 5 [
    set trust-change trust-change + trust-growth-rate * 0.3
  ]
  
  ;; Trust erodes from defection or isolation
  if strategy = "defect" or cooperative-neighbors < 1 [
  set trust-change trust-change - (trust-decay-rate * (1.5 - trust-disposition))
  ]
  
  ;; recovery happens naturally through cluster formation
  ;; Fukuyama: trust regenerates through daily interactions, not policy
  if current-phase = "reconstruction" [
    ;; Only slightly faster recovery if in cooperative cluster (positive feedback from supportive environment)
    if in-cooperative-cluster? and trust-change > 0 [
      set trust-change trust-change * 1.2  ;; 20% boost
    ]
  ]
  
  ;; Apply bounds with scar effects
  set trust-level max list 0 (min list max-trust-level (trust-level + trust-change))
end 

;; ============================================================================
;; WELLBEING UPDATE (BALANCED & INERTIAL)
;; ============================================================================

to update-wellbeing
  ;; Wellbeing depends on: trust (35%), social connections (30%), 
  ;; social order (20%), AND economic success (15%)
  
  ;; === 1. Trust component (35 points max) ===
  let trust-component (trust-level / 100) * 35
  
  ;; === 2. Social connection (30 points max) ===
  let social-component 0
  if strategy = "cooperate" [
    set social-component (cooperative-neighbors / 8) * 30
  ]
  
  ;; === 3. Social order (20 points max) ===
  let order-component ((local-norm-strength / 100) * 10) + ((cooperation-rate / 100) * 10)
  
  ;; === 4. Economic success (15 points max)
  let economic-component 0
  let avg-score mean [score] of turtles
  if avg-score > 0 [
    ;; What matters is doing better/worse than average, not absolute score
    let relative-performance (score / avg-score)
    set economic-component min list 15 (relative-performance * 7.5)
  ]
  
  ;; === PENALTIES ===
  let penalty 0
  if trust-level < 25 [
    set penalty penalty + (25 - trust-level) * 0.4
  ]
  if strategy = "cooperate" and cooperative-neighbors < 2 [
    set penalty penalty + 8
  ]
  if current-phase = "disruption" [
    set penalty penalty + 5
  ]
  
  ;; === TARGET WELLBEING ===
  let target-wellbeing max list 0 min list 100 (trust-component + social-component + order-component + economic-component - penalty)
  
  ;; === VERY INERTIAL: 0.5% per tick ===
  set wellbeing max list 0 (min list max-wellbeing-level (wellbeing * 0.995 + target-wellbeing * 0.005))
  
  ;; === SCORE DECAY ===
  if ticks mod 20 = 0 [
    ifelse current-phase = "disruption"
      [set score score * 0.5]
      [set score score * 0.9]
  ]
end 
;; ============================================================================
;; DISRUPTION MECHANICS
;; ============================================================================

to trigger-disruption
  if current-phase = "stable" [
    set current-phase "disruption"
    set ticks-in-phase 0
    
    ask n-of (count turtles * disruption-intensity / 100) turtles [
      set strategy "defect"
      set times-disrupted times-disrupted + 1
      set trust-level max list 0 trust-level - 30
      set max-trust-level max-trust-level * (0.85 ^ times-disrupted)
      set max-wellbeing-level max-wellbeing-level * (0.90 ^ times-disrupted)
    ]
  ]
end 

to apply-disruption-pressure
  ask turtles [
    if random-float 100 < disruption-intensity [
      set trust-level max list 0 trust-level - 1.5
      set local-norm-strength max list 0 local-norm-strength - 0.5
    ]
    
    let trust-cutoff avg-trust * 0.6
    if strategy = "cooperate" and trust-level < trust-cutoff and 
       random-float 100 < (disruption-intensity / 3) [
      set strategy "defect"
    ]
  ]
end 

to play-game
  let my-neighbors turtles-on neighbors
  
  if any? my-neighbors [
    let similar-neighbors my-neighbors with [abs (trust-level - [trust-level] of myself) < 30]
    
    let partner nobody
    ifelse any? similar-neighbors
      [set partner one-of similar-neighbors]
      [set partner one-of my-neighbors]
    
    let my-payoff 0
    
    if strategy = "cooperate" and [strategy] of partner = "cooperate" [
      set my-payoff cooperation-payoff
      set times-cooperated times-cooperated + 1
    ]
    if strategy = "cooperate" and [strategy] of partner = "defect" [
      set my-payoff sucker-payoff
      set times-cooperated times-cooperated + 1
    ]
    if strategy = "defect" and [strategy] of partner = "cooperate" [
      set my-payoff temptation-payoff
      set times-defected times-defected + 1
    ]
    if strategy = "defect" and [strategy] of partner = "defect" [
      set my-payoff defection-payoff
      set times-defected times-defected + 1
    ]
    
    if current-phase = "disruption" and strategy = "defect" [
      set my-payoff my-payoff * (1 + disruption-intensity / 100)
    ]
    
    set score score + my-payoff
  ]
end 
;; ============================================================================
;; METRICS & VISUALIZATION
;; ============================================================================

to calculate-metrics
  ifelse any? turtles [
    set cooperation-rate (count turtles with [strategy = "cooperate"] / count turtles) * 100
    set avg-wellbeing mean [wellbeing] of turtles
    set avg-trust mean [trust-level] of turtles
  ] [
    set cooperation-rate 0
    set avg-wellbeing 0
    set avg-trust 0
  ]
end 

to update-appearance
  ifelse strategy = "cooperate" 
    [set color scale-color blue trust-level 120 0]
    [set color scale-color red (100 - trust-level) 120 0]
  set size 0.5 + (wellbeing / 100)
end 

There is only one version of this model, created about 13 hours ago by Artem Serdyuk.

Attached files

File Type Description Last updated
Fukuyama Great Disruption.png preview Preview for 'Fukuyama Great Disruption' about 13 hours ago, by Artem Serdyuk Download

This model does not have any ancestors.

This model does not have any descendants.