Agent-Based Modeling with Mesa 3 — Micro Rules, Macro Emergence
Skill type: ANALYSIS MODULE. Builds ABMs where macro patterns emerge from local agent
rules (Schelling segregation, opinion dynamics, diffusion, cooperation). The discipline: use the
current Mesa 3 API, and treat the model as a generative explanation that must be validated
(swept, replicated, compared to a target pattern), not a toy that merely runs.
Core Mission
THE MODEL IS A THEORY OF HOW MACRO EMERGES FROM MICRO. USE MESA 3 CORRECTLY, THEN VALIDATE.
When to Use This Skill
- "Build an agent-based model / Mesa model of [segregation, diffusion, opinion, cooperation]."
- "Simulate many interacting heterogeneous agents and watch what emerges."
- "Do a parameter sweep over my ABM and collect outcomes."
Does NOT Trigger
| The request is really about… |
Route to |
Why not this skill |
| Discrete-event / queueing / process simulation |
alterlab-simpy |
Event-driven processes, not interacting agents on a grid/network. |
| Reinforcement learning (an agent learning a policy) |
alterlab-stable-baselines3 |
Policy optimization, not generative social simulation. |
| Whether ABM is the right method at all |
alterlab-ssci-design-gate |
Design routing, upstream. |
| System-dynamics / ODE compartment models |
alterlab-statistical-analysis |
Aggregate dynamics, not agent-level. |
The Mesa 3 API (verified — do not ship Mesa 2 patterns)
Mesa 3 removed mesa.time schedulers (RandomActivation, etc.). Agents auto-register into
model.agents; unique_id is auto-assigned; the model must call super().__init__(seed=...).
import mesa
class MoneyAgent(mesa.Agent):
def __init__(self, model): # NO unique_id argument in Mesa 3
super().__init__(model)
self.wealth = 1
def step(self):
if self.wealth > 0:
other = self.random.choice(self.model.agents)
other.wealth += 1
self.wealth -= 1
class MoneyModel(mesa.Model):
def __init__(self, n=10, seed=None):
super().__init__(seed=seed) # mandatory in Mesa 3
MoneyAgent.create_agents(self, n) # bulk creation helper
self.datacollector = mesa.DataCollector(
model_reporters={"Gini": compute_gini},
agent_reporters={"Wealth": "wealth"})
def step(self):
self.datacollector.collect(self)
self.agents.shuffle_do("step") # replaces RandomActivation
- Scheduling:
model.agents.shuffle_do("step") (random activation),
model.agents.do("step") (fixed order), do("step") then do("advance") (simultaneous),
model.agents_by_type[Type].shuffle_do("step") (staged). model.steps auto-increments.
- Space: classic
mesa.space.MultiGrid/SingleGrid/NetworkGrid (maintenance mode) with
place_agent/move_agent; new cell space mesa.discrete_space.OrthogonalMooreGrid((w,h), torus=...) / OrthogonalVonNeumannGrid / HexGrid.
- Batch sweeps:
mesa.batch_run(MoneyModel, parameters={"n":[10,50,100]}, iterations=20, max_steps=100, data_collection_period=-1) → list of dicts.
- Visualization:
from mesa.visualization import SolaraViz, make_space_component, make_plot_component.
Full validated skeleton (Schelling + a network model), the space-API choice, and the validation
checklist: references/mesa_patterns.md.
The validation discipline
An ABM that runs is not evidence. Report:
- Replication — multiple runs with different seeds; report the distribution of the macro
outcome, not one run (fix
seed= for reproducibility, vary it for the distribution).
- Parameter sweep —
batch_run across the key parameters; show how the emergent outcome
depends on them (phase transitions, tipping points).
- Pattern-oriented validation — does the model reproduce the target stylized fact it was built
to explain (e.g. Schelling's high segregation from mild preferences)?
- Sensitivity — which assumptions drive the result; state them.
Output Template
MODEL: <agents, their state, the local step rule; space = grid/network/none>
SCHEDULE: <shuffle_do / do / staged> (Mesa 3 AgentSet)
MACRO OUTCOME: <the emergent quantity the DataCollector tracks>
VALIDATION: <n seeds -> distribution; batch_run sweep; target pattern reproduced?>
CLAIM SCOPE: generative (a sufficient micro mechanism), NOT the unique/true mechanism
References
references/mesa_patterns.md — validated Mesa 3 skeletons (grid + network), space-API selection, batch_run sweep, validation checklist.
Part of the AlterLab Academic Skills suite.
1---2name: alterlab-abm-mesa3description: Builds agent-based models of social systems with Mesa 3 — the current AgentSet API (model.agents.shuffle_do('step'), auto-assigned unique_id, mandatory super().__init__(seed=...)), cell spaces (mesa.discrete_space OrthogonalMooreGrid / classic mesa.space grids), the DataCollector, batch_run parameter sweeps, and SolaraViz — for emergence, segregation, diffusion, opinion dynamics, and cooperation models. It uses the Mesa 3.x API (the old mesa.time schedulers like RandomActivation are removed) and treats the model as a generative theory to be validated, not just run. Use when the request mentions an agent-based model, Mesa, simulating interacting agents, or emergent macro behavior from micro rules. For discrete-event (queueing/process) simulation prefer alterlab-simpy; for reinforcement learning prefer alterlab-stable-baselines3. Part of the AlterLab Academic Skills suite.4license: MIT5---67# Agent-Based Modeling with Mesa 3 — Micro Rules, Macro Emergence89**Skill type: ANALYSIS MODULE.** Builds ABMs where macro patterns *emerge* from local agent10rules (Schelling segregation, opinion dynamics, diffusion, cooperation). The discipline: use the11**current Mesa 3 API**, and treat the model as a generative explanation that must be validated12(swept, replicated, compared to a target pattern), not a toy that merely runs.1314## Core Mission1516```17THE MODEL IS A THEORY OF HOW MACRO EMERGES FROM MICRO. USE MESA 3 CORRECTLY, THEN VALIDATE.18```1920## When to Use This Skill2122- "Build an agent-based model / Mesa model of [segregation, diffusion, opinion, cooperation]."23- "Simulate many interacting heterogeneous agents and watch what emerges."24- "Do a parameter sweep over my ABM and collect outcomes."2526### Does NOT Trigger2728| The request is really about… | Route to | Why not this skill |29|---|---|---|30| Discrete-event / queueing / process simulation | `alterlab-simpy` | Event-driven processes, not interacting agents on a grid/network. |31| Reinforcement learning (an agent learning a policy) | `alterlab-stable-baselines3` | Policy optimization, not generative social simulation. |32| Whether ABM is the right method at all | `alterlab-ssci-design-gate` | Design routing, upstream. |33| System-dynamics / ODE compartment models | `alterlab-statistical-analysis` | Aggregate dynamics, not agent-level. |3435## The Mesa 3 API (verified — do not ship Mesa 2 patterns)3637Mesa 3 removed `mesa.time` schedulers (`RandomActivation`, etc.). Agents auto-register into38`model.agents`; `unique_id` is auto-assigned; the model **must** call `super().__init__(seed=...)`.3940```python41import mesa4243class MoneyAgent(mesa.Agent):44 def __init__(self, model): # NO unique_id argument in Mesa 345 super().__init__(model)46 self.wealth = 14748 def step(self):49 if self.wealth > 0:50 other = self.random.choice(self.model.agents)51 other.wealth += 152 self.wealth -= 15354class MoneyModel(mesa.Model):55 def __init__(self, n=10, seed=None):56 super().__init__(seed=seed) # mandatory in Mesa 357 MoneyAgent.create_agents(self, n) # bulk creation helper58 self.datacollector = mesa.DataCollector(59 model_reporters={"Gini": compute_gini},60 agent_reporters={"Wealth": "wealth"})6162 def step(self):63 self.datacollector.collect(self)64 self.agents.shuffle_do("step") # replaces RandomActivation65```6667- **Scheduling**: `model.agents.shuffle_do("step")` (random activation),68 `model.agents.do("step")` (fixed order), `do("step")` then `do("advance")` (simultaneous),69 `model.agents_by_type[Type].shuffle_do("step")` (staged). `model.steps` auto-increments.70- **Space**: classic `mesa.space.MultiGrid/SingleGrid/NetworkGrid` (maintenance mode) with71 `place_agent`/`move_agent`; new cell space `mesa.discrete_space.OrthogonalMooreGrid((w,h),72 torus=...)` / `OrthogonalVonNeumannGrid` / `HexGrid`.73- **Batch sweeps**: `mesa.batch_run(MoneyModel, parameters={"n":[10,50,100]}, iterations=20,74 max_steps=100, data_collection_period=-1)` → list of dicts.75- **Visualization**: `from mesa.visualization import SolaraViz, make_space_component,76 make_plot_component`.7778Full validated skeleton (Schelling + a network model), the space-API choice, and the validation79checklist: `references/mesa_patterns.md`.8081## The validation discipline8283An ABM that runs is not evidence. Report:84851. **Replication** — multiple runs with different seeds; report the *distribution* of the macro86 outcome, not one run (fix `seed=` for reproducibility, vary it for the distribution).872. **Parameter sweep** — `batch_run` across the key parameters; show how the emergent outcome88 depends on them (phase transitions, tipping points).893. **Pattern-oriented validation** — does the model reproduce the target stylized fact it was built90 to explain (e.g. Schelling's high segregation from mild preferences)?914. **Sensitivity** — which assumptions drive the result; state them.9293## Output Template9495```96MODEL: <agents, their state, the local step rule; space = grid/network/none>97SCHEDULE: <shuffle_do / do / staged> (Mesa 3 AgentSet)98MACRO OUTCOME: <the emergent quantity the DataCollector tracks>99VALIDATION: <n seeds -> distribution; batch_run sweep; target pattern reproduced?>100CLAIM SCOPE: generative (a sufficient micro mechanism), NOT the unique/true mechanism101```102103## References104105- `references/mesa_patterns.md` — validated Mesa 3 skeletons (grid + network), space-API selection, batch_run sweep, validation checklist.106107Part of the AlterLab Academic Skills suite.