ABM仿真模型介绍

从个体动机到群体规律-ABM仿真模型介绍

image-20231015095016108

今天我们谈一谈单体/多体仿真模型,模型的英文名称为Agent based modeling,以下简称为ABM模型

像我们熟悉的基于元胞自动机原理、的生命游戏,不同的生命体按照同一规则,在所设置好的环境中进行交互,演变出复杂的形态,这就是一类典型的ABM模型

其中三个核心要素:个体、环境、规则,它们是相互作用的,产生了1+1大于2的效果。


通过对经典的ABM案例进行模拟,我们可以了解到,受规则/环境影响的个体微观层面的行为、将会对整体的宏观系统产生什么样的影响。

一些看起来很简单的规则/环境,竟然是会产生非常反常识的结果。

这对于相关政策制定,是很有指导意义的

而且这类模拟分析,通常是很难采取传统的数理模型进行推导的,需要借助现代计算机的强大算力,进行仿真模拟,才能够得到系统性的结果。


今天我们会使用NETLOGO作为节目的核心模拟软件,相关的软件介绍,可以参考我们上一期的节目。

进入到具体案例之前,我们先要了解一下NETLOGO的基本信息。

在NETLOGO当中,有4个类别的个体/Agent。

  • 第一类是乌龟Turtle,它们是可以移动的个体,可以在NETLOGO中的二维世界移动,我们可以把它看成是需要模拟的人类、动物、病毒等。
  • 第二类是贴片patch,它们是二维世界当中不能够移动的个体。
  • 第三类是连接link,用于连接以上2种个体。
  • 第四类是观察者observer,它是脱离于二维世界之外的个体,能够和所有二维世界的个体来进行交互,可以把它看成是高维度的超级个体

image-20231015100318230


接下来,我们进入到基于NETLOGO的三个基础ABM模型:

image-20231015100555901


image-20231015100718768

一、森林大火模型

在这个简单模型当中,我们可以分析在不同的森林密度下,火势的蔓延程度。

绿色贴片代表着森林,红色代表是火焰。

程序设计为:当绿色贴片四周相邻的颜色是红色的时候,那么绿色贴片的颜色就会变成红色,代表这个绿色森林着火了,用这个方法推演下去。

模型当中可以设置不同的森林密度,测试对应火势的蔓延程度。

在我们的测试当中,调整森林密度从55%逐渐提高到63%,记录一下对应的森林烧毁的比例,选择森林烧毁比例的平均值作为最终的烧毁比例。

根据模拟结果,我们可以看到,59%是一个临界值,稍微增减对最终的烧毁比例都会产生非常大的边际影响。

这个模型对于绿化规划设计来说是非常具有借鉴意义的。

理解临界值的影响,可以帮助规划者更好地平衡绿化率风险成本之间的关系,实现社会经济利益的最优。


image-20231015100911119

第二个模型是传染病模型。在这个病毒传播模型当中,设计了一个1000人的小城镇,其中2个人携带了某种病毒。其中每个居民会与其他2个人有密切接触。

另外,在这个城镇当中有2所学校、5家餐厅、10个办公楼、15辆公交车。

在这些公共区域当中,人们会有互相交互的机会,每次交互都有相应的感染概率。

感染了之后,有发展成为重症的概率,有发展成为死亡的概率,另外也有恢复产生抗体的概率。

设置好了参数之后,我们进行模拟演变,我们可以看到每天的感染以及恢复的情况。

通过模拟关闭某些公共设施,可以看到相应的病毒传播抑制效果,这类模拟在当下的疫情防疫方面,有着很好的政策指导作用。


image-20231015100949123

第三个模型是交通规划模型,这个模型是可以提供交通规划的模拟。

我们可以设置红绿灯的密度,道路限速等参数,观察汽车的平均时速和道路效率,通过比较不同的规划方案,选择合适的红绿灯和限速设置。

交通规划部门可以按照这个思路,设计更加贴近真实情况的道路模型,录入相应的参数,进行方案的比较,从而对路段的红路灯设置进行优化。


以上3个是典型的ABM模型的应用案例。NETLOGO当中还有很多的内置经典模型提供大家尝试,我相信你会从这些模型当中找到很多的乐趣。


接下来,我会通过一个经典的案例,为大家具体介绍ABM模型的构建思路,并且尝试在EXCEL当中重现这个模型,实现触类旁通。

这个案例是来自于一个诺奖大咖Thomas Crombie Schelling - 托马斯谢林

谢林在博弈论应用方面有着突出的贡献,他在2005年获得了诺贝尔经济学奖。

他的模型并没有高深的数理推导,而是更多的基于ABM模型去分析微观动机宏观表现的关联,从而指导相关政策的制定。

我们今天一起看看他在1971年提出的:居民居住偏好聚类模型

image-20231015103301093


image-20231015101027852

在这个正方形区域当中,居住着两类人。

两类人有着不同的种族、文化或者其他的特征。

同时,我们设置了模型的人口密度为80%。

这意味着区域当中有80%的空置地。

image-20231015104021347

这里我们引入一个概念,相似性偏好值,根据每个居民四周8个方格中、相同类别居民占全部住户的比例。

我们假设模型当中的居民都是具有相同的、相似性偏好值、临界值(30%)。

对于个体来说,当他们的相似性偏好临界值、低于、这个临界值的时候,他就会选择搬家到随机一个地方的空地。

image-20231015104248254

系统就会按照这个规则一直演变下去的,直到群体满意或者达到了系统预设的迭代上限


当我们把这个临界值设置成为30%,从个人的角度来说,他/她对于周围同类型居民的比例要求就是30%。

这体现出来了这个人具有很大的差异容忍性

image-20231015104432337

但是当我们进行了模拟之后,会发现人们最终出现了聚类现象。

image-20231015104536677

如上图所示,红色和红色聚集,蓝色和蓝色聚集了,最终系统的平均相似比例,超过了70%。

这代表什么意思呢?

这意味着,个体的高容忍性、并没有导致、群体的高容忍结果


当我们提升相似性偏好值达到75%的时候,结果体现出来了明显的聚集效应,系统相似度最终达到了99.5%。

image-20231015104815087

当我们再一次提升相似性偏好值达到76%,这个时候系统是没有办法达到均衡的。

image-20231015104927427

这说明了什么呢?这说明这个时候的个体,都是具有排他偏好的,群体是具有了一致性的排他偏好的,结果却是一个平均相似度维持在50%左右的动态系统。

这是一个非常反直觉的结果,但是这又是非常真实的社会现象。


1971年的谢林,在没有计算机的情况下,拿着硬币和棋盘,花费了几个月的时候,才能够得到相似的结论。

现在的我们,可以借助计算机的强大算力进行模拟。

下面我会为大家解释,这个模型的基本构建思路。


首先设置初始状态,两类居民是分布在网格当中的,并且留有空置地,我们把空置地的位置存储在列表1当中。

image-20231015105319358

计算流程如下,每次迭代当中,我们会遍历每一个居民,然后计算这个居民的满意度。

当这个居民的满意度低于我们的系统设定值的时候,在列表1当中随机选择一个空地进行搬家。

原来居住的地方修改成为空置地,原来的空置地搬家到这个地方了修改成为居住状态,然后更新列表1,如下图所示:

image-20231015105557810

如果没有空置地可以提供选择,那么就跳出来遍历,如下图所示:

image-20231015105635061

循环以上的流程,直到以下两个条件满足其一:

image-20231015105808437


在NETLOGO当中的CODE编程区域,存储着这个模型的代码。

image-20231015105906136

这个代码是基于Scala和Java的模型。


在这个模型当中,通过globals命令,设定了两个全局变量。

image-20231015105957906

总体相似度,percent-similar,还有不满意度,percent-unhappy。


通过turtles-own命令,可以设定个体参数,这里定义了每个个体的相应属性。

包括个体的相似性偏好要求,近邻相似度等。

image-20231015110027770


globals和turtles-own命令都是需要再程序的一开始进行声明的。

接下来就是一连串的to...end的语法结构。

这是用来定义程序要执行的动作

首先设定初始状态,然后是每次迭代的流程,其中的子流程,有着各自的to end语句。

image-20231015110309755

这里的子流程包括,第一行判断是否全员满意,第二行移动不满意的个体到空地上,第三行更新个体属性、参数,第四行更新全局变量。


image-20231015110429502

当你在操作界面点击一次go once按钮,程序会运行这个迭代流程一次,点击go按钮之后,程序就会不断运行,直到退出机制被触发了。

其实这个程序还是很好理解的。


这里给大家看一下,我使用excel实现的相同的ABM模型模拟。

Excel当中的每个单元格,可以看成是对应的居住空间,红蓝色的设置可以区分成为两类人。

空格代表的是空置地。

我们可以通过VBA去实现相同的迭代流程。

posted @ 2023-10-15 11:29  准提弟子  阅读(806)  评论(0编辑  收藏  举报