python

您所在的位置:网站首页 abm怎么登录 python

python

2024-07-13 12:23| 来源: 网络整理| 查看: 265

python-mesa:Agent Based Model 简单教程

教程链接:https://mesa.readthedocs.io/en/latest/tutorials/intro_tutorial.html

Mesa是用于构建,分析和可视化基于代理的模型(Agent Based Model)的模块化框架。

基于代理的模型是一种计算机模拟,涉及多个实体(代理),这些实体根据它们的编程行为互相作用和交互。代理可以用来代表活细胞,动物,个人,甚至整个组织或抽象实体。有时,我们可能会对系统中各个组件的行为有所认识,并希望研究各个部分在系统整体层面上产生的行为和效果;而在其他时候,我们可能希望研究系统的整体行为。 它适合研究各种模型仿真主体(代理人,也就是Agent)的合作与竞争关系。

安装:

pip install mesa 示例1:随机发红包游戏

假设有一个群,里面有十个人,游戏规则是这样的: 每个人初始有一元钱,游戏开始后,每轮每人随机选定群里的一个人(可以是自己)发一个1元红包。如果钱数为0,本轮就不用发。 游戏进行10轮,试着用代码描述这样的过程。 过程有三步:设置模型,添加调度器,进行仿真。 仿真主要有Agent和Model两类,一般在Agent中用面向对象的方式定义不同Agent中的竞争合作关系;而Model类用来管理若干个Agent,

本文完整代码链接:https://gitee.com/hzy15610046011/python_code_collection/tree/master/%E7%AE%97%E6%B3%95%E4%B8%8E%E5%BB%BA%E6%A8%A1/%E4%BB%BF%E7%9C%9F/mesa

from mesa import Agent, Model from mesa.time import RandomActivation class MoneyAgent(Agent): "带有固定初始财富的代理人Agent。" def __init__(self, id, model): super().__init__(id, model) # 自身的id和归属的模型。 self.wealth = 1 def step(self): if (self.wealth == 0): return otherAgent = self.random.choice(self.model.schedule.agents) # 在模型的多个Agent中,随机选出一个Agent otherAgent.wealth += 1 # 给他一块钱的红包。相当于是蒙特卡洛仿真一下。当然,过程结束之后谁得到多少钱是随机的。 self.wealth -= 1 class MoneyModel(Model): # 管理代理人的模型。 def __init__(self, N): self.agentNum = N self.schedule = RandomActivation(self) # 创建Agents for i in range(self.agentNum): a = MoneyAgent(i, self) self.schedule.add(a) def step(self): self.schedule.step()

最后调用matplotlib进行绘图。绘出的图像是每位代理人的财富(纵轴)与人数(横轴)关系的直方图。

import matplotlib.pyplot as plt agent_wealth = [a.wealth for a in model.schedule.agents] plt.hist(agent_wealth)

这是输出的直方图 如果将这样的游戏反复进行一百次,每次游戏进行十轮。将每次游戏后每个人的钱数看做观察的样本,那么应该会产生100次×10人=1000个样本。这一千个样本中,金钱是怎样分布的?

我们不妨按照程序编一下,这部分完整代码见链接。 本文完整代码链接:https://gitee.com/hzy15610046011/python_code_collection/tree/master/%E7%AE%97%E6%B3%95%E4%B8%8E%E5%BB%BA%E6%A8%A1/%E4%BB%BF%E7%9C%9F/mesa 一千个样本频数分布。可见大概40%的人亏到0了 上面就是一千个样本频数分布。可见大概40%的人亏到0了

示例2:基于MESA的Web可视化模块的排队论模型(原创)

mesa库与netlogo类似,在内部的基础上,还有一个创建仿真界面的功能。这个仿真界面前端使用web技术,后端是基于python的tornado开发的,可以说是适应了Web技术大行其道的潮流吧。

当然这种技术也有缺点。缺点之一就是python和javascript的速度都不怎么样,比起基于java的netlogo还是力有不逮;其次,网络通信的速度也一般,最高仿真速率只有20fps,也就是说一秒钟刷新20次。

不多说了,先上代码吧。

from mesa import Agent from mesa import Model from mesa.datacollection import DataCollector from mesa.space import Grid from mesa.time import RandomActivation import numpy as np from mesa.visualization.modules import CanvasGrid, ChartModule, PieChartModule, TextElement from mesa.visualization.ModularVisualization import ModularServer from mesa.visualization.UserParam import UserSettableParameter import mesa print(mesa.__file__) # 可以修改服务器函数中的一些功能. class StatusElement(TextElement): ''' 显示当前服务的状态。. ''' def __init__(self): pass def render(self, model): return "目前已经服务的人数: " + str(model.count_type(model, 'served')) class QueueModel(Model): """ 一个简单的排队论模型。 """ def __init__(self, height=100, width=100, meanServiceTime=10, mtba=10): # mtba的意思是平均到达的时间间隔 # Initialize model parameters self.height = height self.width = width self.mtba = mtba self.meanServiceTime = meanServiceTime self.customerNum = 0 self.interval = 0 # Set up model objects self.schedule = RandomActivation(self) self.grid = Grid(width, height, torus=False) self.datacollector = DataCollector( {"serving": lambda m: self.count_type(m, "serving"), "served": lambda m: self.count_type(m, "served"), "waiting": lambda m: self.count_type(m, "waiting")}) self.running = True self.datacollector.collect(self) def generateCustomer(self): c = Customer(self.customerNum, self, meanServiceTime=self.meanServiceTime) self.schedule.add(c) self.grid.place_agent(c, (0, 0)) self.customerNum += 1 def step(self): #for i in range(10): self.schedule.step() self.datacollector.collect(self) if (self.interval


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3