Updated Civil Unrest Model
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
CIVIL UNREST UPDATED MODEL
WHAT IS IT?
This project models the dynamics of civil unrest and protest movements in the United States, with a particular focus on the sociological factors driving protest waves. It is an extension of Joshua Epstein's model of civil violence (2002), incorporating contemporary sociological research on protest movements.
The model includes a more nuanced representation of population demographics, protest triggers, and wave dynamics. It tracks different causes of protest (immigration, women's rights, geopolitics, and corporate/economic issues), reflecting real-world patterns of social mobilization.
HOW IT WORKS
The model operates on two fundamental populations: "agents" (general population who may become protesters) and "cops" (law enforcement). Agents wander around and may decide to actively protest based on their grievance levels, perceived risks, and individual characteristics.
Core Mechanisms
Each agent has several key attributes: - PERCEIVED-HARDSHIP: Assigned randomly at startup, representing individual economic or social difficulties - RISK-AVERSION: Individual tolerance for risk in protest situations - GENDER: Demographic characteristic influencing protest participation (sociology data shows 60-70% female participation in certain protests) - PROTEST-CAUSES: List of causes the agent cares about (immigration, women's rights, geopolitics, corporate/economic) - DIASPORA: Specific community membership (e.g., Ukrainian) that may influence protest decisions - HOME-PATCH: Where the agent typically returns to, creating more realistic movement patterns
Social Tension Parameters
The model tracks four types of social tension: - IMMIGRATION-TENSION: Reflecting immigration-related social issues - WOMENS-RIGHTS-TENSION: Tracking gender-related social issues - GEOPOLITICAL-TENSION: Related to international relations, especially Ukraine - CORPORATE-TENSION: Reflecting economic and corporate power concerns
Crisis Indicators
Three crisis types may trigger or amplify protests: - COMMUNICATION-CRISIS: Poor international communication (e.g., disputes with Europe) - POLICY-CRISIS: Controversial policy implementations (e.g., deportations, DEI rollbacks) - ECONOMIC-CRISIS: Economic hardship indicators
Wave Dynamics
The model simulates protest waves with the following characteristics: - WAVE-INTENSITY: Strength of current protest wave - WAVE-DURATION: How long the wave persists - WAVE-CAUSE: The primary cause driving the current wave
Based on sociological data, the model assumes that 20-25% of the active population is ready to protest under normal conditions, which can increase to 30-35% during crises.
Behavior Rules
The model cycles through three main rules: 1. Movement Rule: Each agent and cop moves to a random unoccupied site within VISION radius, with non-protesting agents preferring to stay near their home patch. 2. Agent Rule: Agents decide whether to protest based on: - If GRIEVANCE - (RISK-AVERSION * estimated arrest probability) > THRESHOLD, they become active protesters - GRIEVANCE is calculated based on perceived hardship, government legitimacy, and cause-specific tension levels - Different demographic groups have different protest thresholds 3. Cop Rule: Each cop arrests nearby active protesters, prioritizing those causing more disturbance.
HOW TO USE IT
Setting Up the Model
Use the sliders to set initial parameters: - INITIAL-COP-DENSITY and INITIAL-AGENT-DENSITY: Determine the density of cops and agents - VISION: How far agents and cops can see - GOVERNMENT-LEGITIMACY: Perceived legitimacy of the government - MAX-JAIL-TERM: Maximum number of time steps an arrested agent stays in jail - GRIEVANCE-MULTIPLIER: How intensely perceived hardship translates to grievance - THRESHOLD-BASE-VALUE: Minimum threshold for protest activation - RISK-WEIGHT: How much risk-aversion affects decision-making
Use cause-specific weight sliders to set relative importance: - IMMIGRATION-WEIGHT: Weight for immigration-related issues - WOMENS-RIGHTS-WEIGHT: Weight for women's rights issues - GEOPOLITICS-WEIGHT: Weight for international relations issues - CORPORATE-WEIGHT: Weight for corporate/economic issues
Running the Model
Click SETUP to initialize the population. Click GO to begin the simulation.
As the simulation runs, you can adjust parameters to see how they affect protest dynamics. The MOVEMENT? toggle controls agent mobility.
Visualization
The model offers two visualization options: - 2D: Agents are circles and cops are triangles - 3D: Agents and cops are represented with human figures
Agent colors indicate grievance levels, with darker green representing higher grievance. Red borders indicate active protesters, and black indicates jailed agents.
THINGS TO NOTICE
Wave Dynamics
Watch how protest waves emerge and dissipate over time. Notice that it exhibits "punctuated equilibrium" — periods of quiescence followed by periods of rebellion, similar to real-world protest patterns.
Gender Dynamics
Observe how female agents tend to participate more actively in protests, especially for women's rights causes, aligning with sociological data showing 60-70% female participation in certain protest movements.
Group Behavior
Watch how agents exhibit deceptive behavior by changing their public protest state when cops are present, despite consistent grievance levels.
Cause Interaction
Notice how different causes interact with each other and how crisis events can trigger multi-cause protests.
THINGS TO TRY
Policy Implementation Effects
Try introducing a policy crisis (toggle the POLICY-CRISIS switch) and observe how it affects different protest causes differently. This simulates real-world policy triggers like deportation plans or DEI rollbacks.
Communication Effects on Geopolitical Tension
Test how communication crises affect geopolitical tension by toggling the COMMUNICATION-CRISIS switch. This simulates scenarios like pressure on foreign leaders or disputes with allies.
Legitimacy Erosion
Compare the effects of gradual versus sudden drops in GOVERNMENT-LEGITIMACY. Does this match de Tocqueville's observation that "when a people that has put up with oppressive rule over a long period without protest suddenly finds the government relaxing its pressure, it takes up arms against it"?
Demographic Influence
Adjust the WOMENS-RIGHTS-WEIGHT to see how gender composition affects protest dynamics, simulating the observed 60-70% female participation in recent US protests.
EXTENDING THE MODEL
Media Influence
Add a media influence mechanism that can amplify or diminish protest waves based on coverage.
Protest Leadership
Introduce protest leader agents who can catalyze protest activity among nearby agents.
Social Network Effects
Implement social network connections between agents to model how protest participation spreads through social connections.
Regional Differences
Add regional variations to model different protest patterns in various US regions or urban vs. rural areas.
NETLOGO FEATURES
The model uses patch variables to store precomputed neighborhood agentsets, improving performance.
The model demonstrates the use of agent breeds to represent different populations (cops and civilian agents).
The model uses extensions (time) for more realistic temporal dynamics.
CREDITS AND REFERENCES
This model is adapted from Joshua M. Epstein's "Modeling civil violence: An agent-based computational approach", Proceedings of the National Academy of Sciences, Vol. 99, Suppl. 3, May 14, 2002.
The sociological assumptions are based on research data on US protest dynamics, particularly focusing on patterns observed during 2017-2025, including analysis of women's participation rates, cause-specific protest energy distribution, and wave dynamics of major protest movements.
HOW TO CITE
If you mention this model in a publication, please include these citations:
For the original model: Wilensky, U. (2004). NetLogo Rebellion model. http://ccl.northwestern.edu/netlogo/models/Rebellion. 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 2004 Uri Wilensky.
This work 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.
Comments and Questions
;extensions [ time ] breed [ agents an-agent ] breed [ cops cop ] globals [ k ; factor for determining arrest probability threshold ; by how much must G > N to make someone rebel? ; Time tracking current-date ; current simulation date wave-start-date ; start date of current wave wave-duration ; duration of current wave ; Wave parameters current-wave ; current active wave type wave-number ; which wave we're on wave-intensity ; current wave intensity ; Social tension parameters immigration-tension ; tracks immigration-related tension womens-rights-tension ; tracks women's rights related tension geopolitical-tension ; tracks international relations tension corporate-tension ; tracks corporate/economic tension ; Crisis indicators communication-crisis ; poor international communication policy-crisis ; controversial policy implementations economic-crisis ; economic hardship indicators ; Population parameters base-protest-ready-percent ; 20-25% normally crisis-protest-ready-percent ; 30-35% during crisis ; Statistics total-active-protesters female-active-protesters male-active-protesters cumulative-participants ; total participants across all waves ] agents-own [ risk-aversion ; R, fixed for the agent's lifetime perceived-hardship ; H, ranging from 0-1 active? ; if true, then the agent is actively rebelling jail-term ; how many turns in jail remain? gender ; "female" or "male" protest-causes ; list of causes they care about protest-energy ; energy for protesting (0-1) protest-threshold ; individual threshold for joining diaspora ; specific community membership activism-level ; how likely to join protests home-patch ; where agent typically returns to ] patches-own [ neighborhood ; surrounding patches within vision radius diaspora-density ; concentration of specific communities urban-center? ; is this a major city? protest-probability ; base likelihood of protest activity ] to setup clear-all reset-ticks set k 2.3 set threshold 0.1 set current-date 0 set wave-number 0 set cumulative-participants 0 ; Initialize tension levels set immigration-tension random-float 0.3 set womens-rights-tension random-float 0.3 set geopolitical-tension random-float 0.3 set corporate-tension random-float 0.3 ; Initialize crisis indicators set communication-crisis false set policy-crisis false set economic-crisis false ; Set population parameters set base-protest-ready-percent 0.225 set crisis-protest-ready-percent 0.325 setup-patches setup-agents setup-cops update-statistics end to setup-patches ask patches [ set pcolor gray - 1 set neighborhood patches in-radius vision set urban-center? (random-float 1.0 < 0.1) set protest-probability ifelse-value urban-center? [ 0.3 + random-float 0.2 ] [ 0.1 + random-float 0.1 ] set diaspora-density random-float 1.0 ] end to setup-cops create-cops round (initial-cop-density * .01 * count patches) [ move-to one-of patches with [ not any? turtles-here ] display-cop ] end to-report assign-gender ; Based on sociology data showing 60-70% female participation report ifelse-value (random-float 1.0 < 0.65) [ "female" ] [ "male" ] end to setup-agents create-agents round (initial-agent-density * .01 * count patches) [ move-to one-of patches with [ not any? turtles-here ] set heading 0 set home-patch patch-here ; Basic properties set risk-aversion random-float 1.0 set perceived-hardship random-float 1.0 set active? false set jail-term 0 ; Advanced properties set gender assign-gender set protest-causes assign-causes set protest-energy random-float 1.0 set protest-threshold calculate-protest-threshold set diaspora assign-diaspora set activism-level random-float 1.0 display-agent ] end to go ; Increment time and manage waves first manage-waves update-social-dynamics ask turtles [ if (breed = agents and jail-term = 0) or breed = cops [ move ] if breed = agents and jail-term = 0 [ determine-behavior ] if breed = cops [ enforce ] ] ask agents [ if jail-term > 0 [ set jail-term jail-term - 1 ] ] ask agents [ display-agent ] ask cops [ display-cop ] update-statistics tick end to enforce ; cop procedure ; Use in-radius instead of patch variable let active-targets agents in-radius vision with [active? and breed = agents] if any? active-targets [ let target min-one-of active-targets [ ; Prioritize closer targets and those causing more disturbance distance myself - activism-level ] if target != nobody [ move-to target ask target [ set active? false set jail-term random max-jail-term if gender = "female" [ set womens-rights-tension womens-rights-tension + 0.01 ] if diaspora != "none" [ set geopolitical-tension geopolitical-tension + 0.01 ] ] ] ] end to update-social-dynamics ; Update tension levels based on current events and conditions set immigration-tension update-tension immigration-tension policy-crisis set womens-rights-tension update-tension womens-rights-tension policy-crisis set geopolitical-tension update-tension geopolitical-tension communication-crisis set corporate-tension update-tension corporate-tension economic-crisis ; Update crisis indicators based on evolving conditions if random-float 1.0 < 0.001 [ toggle-crisis "communication" ] if random-float 1.0 < 0.001 [ toggle-crisis "policy" ] if random-float 1.0 < 0.001 [ toggle-crisis "economic" ] end to-report update-tension [current-tension crisis?] let new-tension current-tension ; Natural decay set new-tension new-tension * 0.99 ; Crisis impact if crisis? [ set new-tension new-tension + 0.05 ] ; Random fluctuation set new-tension new-tension + (random-float 0.02 - 0.01) ; Ensure bounds report max (list 0 (min (list 1 new-tension))) end to toggle-crisis [crisis-type] if crisis-type = "communication" [ set communication-crisis not communication-crisis if communication-crisis [ set geopolitical-tension geopolitical-tension + 0.2 ] ] if crisis-type = "policy" [ set policy-crisis not policy-crisis if policy-crisis [ set immigration-tension immigration-tension + 0.2 set womens-rights-tension womens-rights-tension + 0.2 ] ] if crisis-type = "economic" [ set economic-crisis not economic-crisis if economic-crisis [ set corporate-tension corporate-tension + 0.2 ] ] end to manage-waves ; Increment current date set current-date current-date + 1 ; Check for wave end conditions if current-wave != 0 [ if current-date - wave-start-date > wave-duration [ set current-wave 0 set wave-intensity 0 ] ] ; Check for new wave start conditions if current-wave = 0 and should-start-new-wave? [ set wave-number wave-number + 1 set wave-start-date current-date set current-wave select-wave-cause set wave-intensity calculate-wave-intensity set wave-duration calculate-wave-duration ] end to start-new-wave set wave-number wave-number + 1 set wave-start-date current-date set current-wave select-wave-cause set wave-intensity calculate-wave-intensity set wave-duration calculate-wave-duration ; Trigger immediate effects ask agents [ if member? current-wave protest-causes [ set perceived-hardship perceived-hardship * 1.2 ] ] end to end-current-wave set current-wave 0 set wave-intensity 0 ; Cool down effects ask agents [ set perceived-hardship perceived-hardship * 0.9 ] end to update-wave-intensity let elapsed-time current-date - wave-start-date let peak-time wave-duration / 2 ; Calculate bell curve intensity let time-factor (- ((elapsed-time - peak-time) ^ 2) / (2 * (wave-duration / 4) ^ 2)) let new-intensity wave-intensity * exp time-factor ; Add random fluctuations set wave-intensity new-intensity * (0.9 + random-float 0.2) ; Intensity affected by active protesters let active-ratio count agents with [active?] / count agents if active-ratio > 0.1 [ set wave-intensity wave-intensity * (1 + active-ratio) ] end to-report should-start-new-wave? ; Base probability from social tensions let total-tension ( immigration-tension * 0.25 + womens-rights-tension * 0.35 + geopolitical-tension * 0.2 + corporate-tension * 0.2 ) ; Wave probability increases with: ; 1. Higher tensions let wave-probability total-tension * 0.1 ; 2. Existing protest activity let active-ratio count agents with [active?] / count agents if active-ratio > 0.05 [ set wave-probability wave-probability * (1 + active-ratio * 4) ] ; 3. Crisis conditions if communication-crisis [ set wave-probability wave-probability * 1.5 ] if policy-crisis [ set wave-probability wave-probability * 1.5 ] if economic-crisis [ set wave-probability wave-probability * 1.5 ] ; 4. Time since last wave if wave-number > 0 [ let time-since-last-wave current-date - wave-start-date if time-since-last-wave > 100 [ set wave-probability wave-probability * 1.3 ] ] ; Threshold check with randomization report random-float 1.0 < wave-probability end to-report select-wave-cause ; Calculate weighted probabilities based on current tensions let total-weight ( immigration-tension * immigration-weight + womens-rights-tension * womens-rights-weight + geopolitical-tension * geopolitics-weight + corporate-tension * corporate-weight ) let r random-float total-weight let cumulative 0 set cumulative cumulative + (immigration-tension * immigration-weight) if r < cumulative [ report "immigration" ] set cumulative cumulative + (womens-rights-tension * womens-rights-weight) if r < cumulative [ report "womens-rights" ] set cumulative cumulative + (geopolitical-tension * geopolitics-weight) if r < cumulative [ report "geopolitics" ] report "corporate" end to-report calculate-wave-intensity let base-intensity 0.002 ; Base intensity for ~500K participants ; Adjust based on cause-specific tension if current-wave = "immigration" [ set base-intensity base-intensity * (1 + immigration-tension) ] if current-wave = "womens-rights" [ set base-intensity base-intensity * (1 + womens-rights-tension) ] if current-wave = "geopolitics" [ set base-intensity base-intensity * (1 + geopolitical-tension) ] if current-wave = "corporate" [ set base-intensity base-intensity * (1 + corporate-tension) ] ; Adjust for crisis conditions if communication-crisis [ set base-intensity base-intensity * 1.3 ] if policy-crisis [ set base-intensity base-intensity * 1.3 ] if economic-crisis [ set base-intensity base-intensity * 1.3 ] ; Add random variation set base-intensity base-intensity * (0.8 + random-float 0.4) report precision base-intensity 3 end to-report assign-causes let causes [] ; Check each cause based on weights from sociology data if random-float 1.0 < immigration-weight [ set causes lput "immigration" causes ] if random-float 1.0 < womens-rights-weight [ set causes lput "womens-rights" causes ] if random-float 1.0 < geopolitics-weight [ set causes lput "geopolitics" causes ] if random-float 1.0 < corporate-weight [ set causes lput "corporate" causes ] ; Ensure each agent has at least one cause if empty? causes [ set causes list (one-of ["immigration" "womens-rights" "geopolitics" "corporate"]) [] ] report causes end to-report assign-diaspora ; Based on sociology data mentioning Ukrainian diaspora specifically let r random-float 1.0 report ifelse-value (r < 0.05) ; Small percentage for specific diaspora groups [ one-of ["ukrainian" "other"] ] [ "none" ] end to-report calculate-protest-threshold let base-threshold 0.5 if gender = "female" [ set base-threshold base-threshold * 0.8 ] if diaspora != "none" [ set base-threshold base-threshold * 0.9 ] ; Fixed to use actual crisis variables: ifelse communication-crisis or policy-crisis or economic-crisis [ set base-threshold base-threshold * (1 - crisis-protest-ready-percent) ] [ set base-threshold base-threshold * (1 - base-protest-ready-percent) ] report base-threshold end to-report calculate-grievance ; agent procedure ; Use the interface slider directly let base-grievance perceived-hardship * (grievance-multiplier - government-legitimacy) ; Cap at reasonable values set base-grievance min (list 1 base-grievance) ; Rest of the function remains the same if current-wave != 0 [ if member? current-wave protest-causes [ set base-grievance base-grievance * (1 + wave-intensity) ] ] ; Identity-based grievance multipliers if gender = "female" and member? "womens-rights" protest-causes [ set base-grievance base-grievance * 1.2 ] ; Social tension effects if member? "immigration" protest-causes [ set base-grievance base-grievance * (1 + immigration-tension * 0.8) ] if member? "womens-rights" protest-causes [ set base-grievance base-grievance * (1 + womens-rights-tension * 0.8) ] if member? "geopolitics" protest-causes [ set base-grievance base-grievance * (1 + geopolitical-tension * 0.8) ] if member? "corporate" protest-causes [ set base-grievance base-grievance * (1 + corporate-tension * 0.8) ] report base-grievance end to-report estimated-arrest-probability ; agent procedure let c count cops in-radius vision let a 1 + count agents in-radius vision with [active?] ; Based on original model's formula with slight modification for dynamic scenarios report 1 - exp (- k * floor (c / a)) end to display-agent ifelse visualization = "2D" [ display-agent-2d ] [ display-agent-3d ] end to display-agent-2d set shape "circle" ifelse active? [ set color red ] [ ifelse jail-term > 0 [ set color black + 3 ] [ set color scale-color green perceived-hardship 1.5 -0.5 ] ] end to display-agent-3d ifelse active? [ set shape "person active" ] [ ifelse jail-term > 0 [ set shape "person jailed" ] [ set shape "person quiet" ] ] ; Color represents grievance level set color scale-color green perceived-hardship 1.5 -0.5 end to move if movement? or breed = cops [ ifelse breed = agents and not active? [ ; Non-protesting agents prefer to stay near home move-toward-home ] [ ; Active agents and cops look for strategic positions let potential-moves neighborhood with [ not any? cops-here and not any? agents-here with [ jail-term > 0 ] ] if any? potential-moves [ ; Cops prefer to move toward clusters of active agents ifelse breed = cops [ let active-nearby-patches neighborhood with [ any? agents-here with [ active? ] ] ifelse any? active-nearby-patches [ move-to one-of active-nearby-patches ] [ move-to one-of potential-moves ] ] [ ; Active agents try to avoid cops while staying in protest areas move-to one-of potential-moves ] ] ] ] end to move-toward-home ; Only agents have home patches, not cops if breed = agents [ let my-home [home-patch] of self if distance my-home > vision [ face my-home let target-patch min-one-of (patch-set patch-ahead 1 patch-right-and-ahead 45 1 patch-left-and-ahead 45 1) [ distance my-home ] if target-patch != nobody and not any? turtles-on target-patch [ move-to target-patch ] ] ] end to display-cop set color cyan ifelse visualization = "2D" [ set shape "triangle" ] [ set shape "person soldier" ] end to-report calculate-wave-duration let base-duration 30 ; Longer duration for higher intensity waves set base-duration base-duration * (1 + wave-intensity * 10) ; Adjust for crisis conditions if communication-crisis or policy-crisis or economic-crisis [ set base-duration base-duration * 1.2 ] ; Add random variation report base-duration + random 20 end to determine-behavior let current-grievance calculate-grievance let arrest-prob estimated-arrest-probability ; Use the interface slider directly set active? (current-grievance - (risk-aversion * risk-weight) * arrest-prob > threshold-base-value) ; Track if agent just became active if active? and not was-active? [ set cumulative-participants cumulative-participants + 1 ] end to-report was-active? report active? end ; [Rest of the original procedures remain the same: move, enforce, display-agent, etc.] to update-statistics set total-active-protesters count agents with [ active? ] set female-active-protesters count agents with [ active? and gender = "female" ] set male-active-protesters count agents with [ active? and gender = "male" ] end
There are 2 versions of this model.
Attached files
File | Type | Description | Last updated | |
---|---|---|---|---|
Updated Civil Unrest Model.png | preview | Preview for 'Updated Civil Unrest Model' | 7 months ago, by Artem Serdyuk | Download |
This model does not have any ancestors.
This model does not have any descendants.