
一、框架概览
Mesa 是 Python 语言实现的开源 ABM (基于个体模型) 框架,自 2014 年首次发布以来,已成为复杂系统动态模拟领域重要工具。Mesa 3.2.0 是最新系列,对原有功能进行了重构与提升。
Mesa 三大核心模块
ABM 核心组件:Model 、Agent 、Space 、Time
数据收集与实验设计:DataCollector 、参数扫描
可视化系统:SolaraViz 编写的 Web UI
二、ABM 核心组件详解
1. Model
类
作为模型的主类,包括以下内容:
agent 初始化
space 初始化
random seed 和 scheduler
from mesa import Model
from mesa.space import MultiGrid
from my_agent import MyAgent
class MyModel(Model):
def __init__(self, N, width, height):
super().__init__()
self.grid = MultiGrid(width, height, True)
MyAgent.create_agents(self, N)
for agent in self.agents:
x = self.random.randrange(self.grid.width)
y = self.random.randrange(self.grid.height)
self.grid.place_agent(agent, (x, y))
def step(self):
self.agents.shuffle_do("step")
2. Agent
类
from mesa import Agent
class MyAgent(Agent):
def __init__(self, model):
super().__init__(model)
self.energy = 10
def step(self):
self.energy -= 1
if self.energy <= 0:
self.remove()
else:
self.move()
def move(self):
possible_steps = self.model.grid.get_neighborhood(
self.pos,
moore=True,
include_center=False
)
new_position = self.random.choice(possible_steps)
self.model.grid.move_agent(self, new_position)
3. AgentSet
wealthy = model.agents.select(lambda a: a.wealth > 1000)
avg_wealth = wealthy.agg("wealth", func=np.mean)
4. Spaces
from mesa.space import ContinuousSpace
space = ContinuousSpace(100, 100, torus=True)
agent = MyAgent(0, model)
space.place_agent(agent, (5.0, 5.0))
5. 时间控制
for _ in range(100):
model.step()
三、数据收集与实验
1. DataCollector
from mesa.datacollection import DataCollector
self.datacollector = DataCollector(
model_reporters={"Step": lambda m: m.steps},
agent_reporters={"Energy": "energy"}
)
2. 参数扫描
from mesa.batchrunner import batch_run
results = batch_run(
MyModel,
parameters={"N": range(10, 51, 10)},
fixed_parameters={"width": 10, "height": 10},
iterations=5,
max_steps=20
)
四、可视化
SolaraViz 示例
from mesa.visualization import SolaraViz, make_space_component, make_plot_component
viz = SolaraViz(
model=MyModel,
components=[
make_space_component(portrayal_function),
make_plot_component(["Step", "Energy"]),
],
model_params={"N": 10, "width": 10, "height": 10}
)
五、完整示例
积分薪资模型
from mesa import Agent, Model
from mesa.datacollection import DataCollector
import matplotlib.pyplot as plt
import pandas as pd
class WorkerAgent(Agent):
def __init__(self, model):
super().__init__(model)
self.salary = 100
self.savings = 0
def step(self):
self.savings += self.salary * 0.2
class WorkerModel(Model):
def __init__(self, N):
super().__init__()
self.datacollector = DataCollector(
model_reporters={"TotalSavings": self.compute_total_savings},
agent_reporters={"Savings": "savings"}
)
WorkerAgent.create_agents(self, N)
def compute_total_savings(self):
return sum(agent.savings for agent in self.agents)
def step(self):
self.datacollector.collect(self)
self.agents.do("step")
model = WorkerModel(10)
for _ in range(20):
model.step()
results = model.datacollector.get_model_vars_dataframe()
results.plot()
plt.title("Total Savings Over Time")
plt.xlabel("Step")
plt.ylabel("Total Savings")
plt.grid(True)
plt.show()
六、社区与扩展推荐
| |
---|
mesa-geo | |
mesa-frames | |
mesa-examples | |
mesa-tutorials | |
注:本文由AI助手改写自Hoeven, E. ter, Kwakkel, J., Hess, V., Pike, T., Wang, B., Rht, & Kazil, J. (2025). Mesa 3: Agent-based modeling with Python in 2025. Journal of Open Source Software, 10(107), 7668.