python中的mesa包预制了一些类,提供了一些基础模型,可以大大简化abm建模的工作量。在python中实现,也有利于和其它算法相结合。本文是一次作业,按照个人理解把mesa包教程整理,代码压缩成了两大部分。如果是新手上手,建议查看下方的官方链接,在jupyter notebook里一步一步运行代码。
https://mesa.readthedocs.io/en/latest/tutorials/intro_tutorial.html
模型构造
建模一个简单的模型:
强假设(只要有钱就把钱给邻居)下财富的流动,观察基尼系数变化
主要的类与类图
一个未明确任何功能的,简单的agent模型,含有如下类,分别是:
- 实例化的模型,对于每一个具体问题应当是唯一的
- 主体或智能体(agent),在启动模型前应对其进行实例化,通常一个模型有多个agent(实现观察涌现性等功能)
- 调度器(schedule),控制每一个时间步(ticks)里agent的动作(step())顺序,如同时(即并行),随机串行运行。随机串行是最常见也是最简单的控制方式
- 网格(grids)提供两种SingleGrid和MultiGrid,前者一个格子空间上只能有一个agent,而后者一个格子上可以由多个agent
- 数据收集类(DataCollector),收集模型级变量, agent级别变量和其它变量(下图省略)
- 控制模型运行类(BatchRunner),使用固定的参数多次生成和运行模型,查看结果的情况。可消除随机误差(下图省略)
类图:
代码
不考虑agent的位置,随机把钱给其它agent
注意,下面的代码使用的是jupyter notebook,可以复制到自己的jupyter里面按顺序运行
from mesa import Agent, Model
from mesa.time import RandomActivation
先定义MoneyModel类,因为下面MoneyAgent类实现时要调用,具体参见上方类图,二者存在一对多的组合关系
class MoneyModel(Model):
"""A model with some number of agents."""
def __init__(self, N):
self.num_agents = N
self.schedule = RandomActivation(self)
# Create agents
for i in range(self.num_agents):
a = MoneyAgent(i, self)
self.schedule.add(a)
def step(self):
'''Advance the model by one step.'''
self.schedule.step()
定义MoneyAgent类
class MoneyAgent(Agent):
""" An agent with fixed initial wealth."""
def __init__(self, unique_id, model):
super().__init__(unique_id, model)
self.wealth = 1
def step(self):
# The agent's step will go here.
# For demonstration purposes we will print the agent's unique_id
if self.wealth == 0:
return
other_agent = self.random.choice(self.model.schedule.agents) # 需要随机从所有agent中选择,同时可能会选中自己
other_agent.wealth += 1
self.wealth -= 1
创建10个agent,并运行10步
model = MoneyModel(10)
for i in range(10):
model.<