用Python开发一个简单的基于代理的仿真模型

在之前的一篇文章中,我演示了如何在Python中使用matplotlib和pyplot来可视化一个二维网格 (文章标题为 “在Python中使用matplotlib可视化二维网格和数组”)。那篇文章的目的是作为对如何在 Python 中可视化网格的第一次介绍。可视化网格在可视化基于代理的模拟研究的结果时很有意义。

在这篇文章中,我建立了一个简单的基于代理的仿真模型的基础,使用一个二维阵列作为环境,可以由两种类型的代理填充。

这个二维阵列将作为一个战场,两组特工将在上面进行一场战斗。

代理人有相同的属性,其中之一是他们的群体成员。除此之外,他们都有一个生命分数,当模拟开始时,这个分数是相等的。最后,他们有一组坐标(x和y坐标),代表他们在二维世界中的空间位置。

我不会在这篇文章中进行模拟研究。这将在以后的帖子中进行。我将在以后的帖子中使用本帖中的模型来模拟两组代理人之间的战斗。

在下面的代码片段中,我为agent定义了一个类,包含相关的属性和方法。文档以注释的形式添加到代码中。

类,将代理定义为抽象的数据类型。
class agent:
    # init方法,代理的构造方法
    def __init__(self,x,y,group):
        self.life = 100.0 # 命根子
        self.x = x
        self.y = y
        self.group = group

下一步是定义一个二维网格阵列,以二维列表的形式,行代表x坐标,列代表y坐标。这个2D列表代表战场。我定义它的大小为100 x 100单元格,即10000个位置。我将使用Python中默认的list类型来定义这个 “战场 “数组。办法是使用Python中的列表理解。

# 在python中使用列表理解法创建空的100x100列表。
battlefield = [[None for i in range(0,100)] for i in range(0,100)]

接下来,我将创建两组特工,并将他们定位在战场内的随机位置。在不同的列表中,我进一步存储对代理对象的引用。我将创建A组的1000名特工和B组的1000名特工。

# 列表中包含可用的X和Y位置
locations = battlefield.copy() # using .copy prevents copying by reference
# 创建空列表,以便将来包含代理参考,类型A和B
agents_A = []
agents_B = []
# 将随机点分配给A组和B组的代理。
# -- 为此我需要随机模块,所以导入它
import random
# -- 定义一个用于创建代理并将其分配到网格的功能。
def agentCreator(size,group,groupList,field,n,m):
    # 循环往复
    for j in range(0,size):
        # 随机选址 
        while True:
            # 随机座标
            x = random.choice(range(0,n))
            y = random.choice(range(0,m))
            # 确认是否有空位,如果没有则重申 
            if field[x][y] == None:
                field[x][y] = agent(x=x,y=y,group=group)
                # 将代理对象引用添加到组列表中
                groupList.append(field[x][y])
                # 循环退出,就地取材
                break
# -- 我使用agentCreator函数来填充战场。
agentCreator(size = 1000,
                group = "A",
                groupList = agents_A,
                field = battlefield,
                n = 100,
                m = 100)
 agentCreator(size = 1000,
                group = "B",
                groupList = agents_B,
                field = battlefield,
                n = 100,
                m = 100) 

2D列表 “战场 “现在包含 “无 “或代理人参考,类型为A或B,所有代理人的生命分值为100,因为战斗还没有开始。

为了完成这第一篇关于基于代理的模拟的文章,我将把A型代理的位置和B型代理的位置,分别用两个网格图来可视化。做到这一点的关键是使用matplotlib.pyplot,方法是.imshow():

#.imshow()需要一个有浮动元素的矩阵。
population = [[0.0 for i in range(0,100)] for i in range(0,100)]
# if agent is of type A, put a 1.0, if of type B, pyt a 2.0
for i in range(1,100):
    for j in range(1,100):
        if battlefield[i][j] == None: # 虚空
            pass # 在人口单元中留0.0
        elif battlefield[i][j].group == "A": # 甲组代理人
            population[i][j] = 1.0 # 1.0表示 "A"
        else: # 乙类制剂
            population[i][j] = 2.0 # 2.0意味着 "B"
# 从matplotlib导入pyplot和颜色。
from matplotlib import pyplot, colors
# 使用matplotlib中的颜色,定义一个颜色图。
colormap = colors.ListedColormap(["lightgrey","green","blue"])
# 用pyplot定义图形大小
pyplot.figure(figsize = (12,12))
# 用Pyplot加标题
pyplot.title("battlefield before simulation run (green = A, blue = B)",
            fontsize = 24)
# 用pyplot添加x和y标签
pyplot.xlabel("x coordinates", fontsize = 20)
pyplot.ylabel("y coordinates", fontsize = 20)
# 使用pyplot调整x轴和y轴的刻度。
pyplot.xticks(fontsize = 16)
pyplot.yticks(fontsize = 16)
# 使用pyplot中的.imshow()方法来可视化代理的位置。
pyplot.imshow(X = population,
             cmap = colormap)
<matplotlib.image.AxesImage at 0x1c756b04c88>

在即将到来的一篇文章中,我将使用本篇文章中开发的基本模型来模拟两组代理人之间的实际战斗。我们将研究不同的参数以及它们如何影响战斗的结果。这将是我们学习更多关于Python中基于代理的模拟的起点。

Leave a Reply

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Close

功能