社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

ABM | Mesa 3 (Python) - 学习笔记

复杂系统与计算社会学 • 2 周前 • 41 次点击  


一、框架概览

Mesa 是 Python 语言实现的开源 ABM (基于个体模型) 框架,自 2014 年首次发布以来,已成为复杂系统动态模拟领域重要工具。Mesa 3.2.0 是最新系列,对原有功能进行了重构与提升。

Mesa 三大核心模块

  1. ABM 核心组件:Model 、Agent 、Space 、Time

  2. 数据收集与实验设计:DataCollector 、参数扫描

  3. 可视化系统:SolaraViz 编写的 Web UI


二、ABM 核心组件详解

1. Model 类

  • 作为模型的主类,包括以下内容:

    • agent 初始化

    • space 初始化

    • random seed 和 scheduler

from mesa import Modelfrom mesa.space import MultiGridfrom my_agent import MyAgent  # 定义好的 agent 类
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

# 选择持有财富大于 1000 的 agentwealthy = model.agents.select(lambda a: a.wealth > 1000)avg_wealth = wealthy.agg("wealth", func=np.mean)

4. Spaces

from mesa.space import ContinuousSpacespace = ContinuousSpace(100100, torus=True)agent = MyAgent(0, model)space.place_agent(agent, (5.05.0))

5. 时间控制

# tick-based 执行 100 步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(105110)},    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, Modelfrom mesa.datacollection import DataCollectorimport matplotlib.pyplot as pltimport 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
GIS/地理空间建模扩展
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 Software10(107), 7668.


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/183684
 
41 次点击