Fukuyama Great Disruption
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:
- Wilensky, U. (1997). NetLogo Cooperation model. http://ccl.northwestern.edu/netlogo/models/Cooperation. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.
Please cite the NetLogo software as:
- Wilensky, U. (1999). NetLogo. http://ccl.northwestern.edu/netlogo/. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.
COPYRIGHT AND LICENSE
Copyright 1997 Uri Wilensky.

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
;; ============================================================================ ;; 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 17 hours ago by Artem Serdyuk.
Attached files
| File | Type | Description | Last updated | |
|---|---|---|---|---|
| Fukuyama Great Disruption.png | preview | Preview for 'Fukuyama Great Disruption' | about 17 hours ago, by Artem Serdyuk | Download |
This model does not have any ancestors.
This model does not have any descendants.
Download this model