ProjectMesa/Mesa 教程:动态代理可视化与Boltzmann财富模型

ProjectMesa/Mesa 教程:动态代理可视化与Boltzmann财富模型

引言

在基于代理的建模(ABM)中,可视化是理解模型动态行为的关键工具。ProjectMesa/Mesa框架提供了强大的可视化功能,本教程将重点介绍如何为Boltzmann财富模型创建动态代理可视化效果。通过本教程,您将学习如何根据代理属性动态调整可视化表现形式,从而更直观地观察财富分布的变化。

模型概述

Boltzmann财富模型是一个经典的ABM示例,它模拟了代理之间财富的随机转移过程。模型核心机制包括:

  • 代理在网格上随机移动
  • 当代理相遇时,财富会随机转移
  • 通过基尼系数衡量财富不平等程度

准备工作

依赖安装

确保已安装以下Python库:

import numpy as np  # 数值计算
import pandas as pd  # 数据处理
import seaborn as sns  # 数据可视化
import mesa  # ABM框架核心
from mesa.discrete_space import CellAgent, OrthogonalMooreGrid
from mesa.visualization import SolaraViz, make_plot_component, make_space_component

核心模型实现

代理类(MoneyAgent)

class MoneyAgent(CellAgent):
    def __init__(self, model, cell):
        super().__init__(model)
        self.cell = cell
        self.wealth = 1  # 初始财富
    
    def move(self):
        self.cell = self.cell.neighborhood.select_random_cell()
    
    def give_money(self):
        if self.wealth > 0:
            cellmates = [a for a in self.cell.agents if a is not self]
            if cellmates:
                other = self.random.choice(cellmates)
                other.wealth += 1
                self.wealth -= 1
    
    def step(self):
        self.move()
        self.give_money()

模型类(MoneyModel)

class MoneyModel(mesa.Model):
    def __init__(self, n=10, width=10, height=10, seed=None):
        super().__init__(seed=seed)
        self.num_agents = n
        self.grid = OrthogonalMooreGrid((width, height), random=self.random)
        
        # 创建代理
        MoneyAgent.create_agents(
            self,
            self.num_agents,
            self.random.choices(self.grid.all_cells.cells, k=self.num_agents),
        )
        
        # 数据收集器配置
        self.datacollector = mesa.DataCollector(
            model_reporters={"Gini": compute_gini}, 
            agent_reporters={"Wealth": "wealth"}
        )
    
    def step(self):
        self.agents.shuffle_do("step")
        self.datacollector.collect(self)

动态可视化实现

代理表现定制

关键创新点在于根据代理财富动态调整可视化属性:

def agent_portrayal(agent):
    # 根据财富值调整大小和颜色
    size = 10 if agent.wealth == 0 else 50
    color = "tab:red" if agent.wealth == 0 else "tab:blue"
    return {"size": size, "color": color}

可视化组件配置

# 创建空间和图表组件
SpaceGraph = make_space_component(agent_portrayal)
GiniPlot = make_plot_component("Gini")

# 模型参数配置(用户可调)
model_params = {
    "n": {
        "type": "SliderInt",
        "value": 50,
        "label": "Number of agents:",
        "min": 10,
        "max": 100,
        "step": 1,
    },
    "width": 10,
    "height": 10,
}

# 创建可视化页面
page = SolaraViz(
    MoneyModel(n=50, width=10, height=10),
    components=[SpaceGraph, GiniPlot],
    model_params=model_params,
    name="Boltzmann Wealth Model",
)

可视化效果说明

  1. 空间视图

    • 蓝色大圆点:有财富的代理(wealth > 0)
    • 红色小圆点:破产代理(wealth = 0)
  2. 时间序列图

    • 实时显示基尼系数变化
    • 反映财富不平等程度
  3. 交互控件

    • 步进按钮:单步执行模型
    • 播放/暂停按钮:控制模型连续运行
    • 滑块:调整代理数量

进阶练习

  1. 形状自定义: 尝试修改agent_portrayal函数,使用不同形状表示不同财富级别:

    shapes = ["o", "s", "^", "D"]  # 圆形、方形、三角形、菱形
    
  2. 多级颜色渐变: 使用连续颜色映射反映财富值:

    color = plt.cm.viridis(agent.wealth/max_wealth)
    
  3. 动态标签: 添加财富值文本标签:

    return {"size": size, "color": color, "text": str(agent.wealth)}
    

学术背景

Boltzmann财富模型受到统计物理学的启发,将货币交换类比为分子间的能量交换。模型展示了即使从完全平等的初始条件出发,随机交换也会导致财富不平等(Dragulescu & Yakovenko, 2002)。可视化这类模型有助于理解复杂系统中的涌现现象。

总结

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧桔好Victor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值