从个体动机到群体规律-ABM仿真模型介绍
今天我们谈一谈单体/多体仿真模型
,模型的英文名称为Agent based modeling
,以下简称为ABM模型
。
像我们熟悉的基于元胞自动机原理、的生命游戏
,不同的生命体按照同一规则,在所设置好的环境
中进行交互,演变出复杂的形态,这就是一类典型的ABM模型
。
其中三个核心要素:个体、环境、规则
,它们是相互作用的,产生了1+1大于2的效果。
通过对经典的ABM案例进行模拟,我们可以了解到
,受规则/环境影响的个体微观层面的行为
、将会对整体的宏观系统
产生什么样的影响。
一些看起来很简单的规则/环境,竟然是会产生非常反常识
的结果。
这对于相关政策制定,是很有指导意义的
。
而且这类模拟分析,通常是很难采取传统的数理模型
进行推导的,需要借助现代计算机的强大算力,进行仿真模拟
,才能够得到系统性的结果。
今天我们会使用NETLOGO
作为节目的核心模拟软件,相关的软件介绍,可以参考我们上一期的节目。
进入到具体案例之前,我们先要了解一下NETLOGO的基本信息。
在NETLOGO当中,有4个类别的个体/Agent。
- 第一类是
乌龟Turtle
,它们是可以移动的个体,可以在NETLOGO中的二维世界移动,我们可以把它看成是需要模拟的人类、动物、病毒等。 - 第二类是
贴片patch
,它们是二维世界当中不能够移动的个体。 - 第三类是
连接link
,用于连接以上2种个体。 - 第四类是
观察者observer
,它是脱离于二维世界之外的个体,能够和所有二维世界的个体来进行交互,可以把它看成是高维度的超级个体
。
接下来,我们进入到基于NETLOGO的三个基础ABM模型:
一、森林大火模型
在这个简单模型当中,我们可以分析在不同的森林密度下,火势的蔓延程度。
绿色贴片代表着森林,红色代表是火焰。
程序设计为:当绿色贴片四周相邻的颜色是红色的时候,那么绿色贴片的颜色就会变成红色,代表这个绿色森林着火了,用这个方法推演下去。
模型当中可以设置不同的森林密度,测试对应火势的蔓延程度。
在我们的测试当中,调整森林密度从55%逐渐提高到63%,记录一下对应的森林烧毁的比例,选择森林烧毁比例的平均值作为最终的烧毁比例。
根据模拟结果,我们可以看到,59%是一个临界值
,稍微增减对最终的烧毁比例都会产生非常大的边际影响。
这个模型对于绿化规划设计来说是非常具有借鉴意义的。
理解临界值的影响,可以帮助规划者更好地平衡绿化率
和风险成本
之间的关系,实现社会经济利益的最优。
第二个模型是传染病模型。在这个病毒传播模型当中,设计了一个1000人的小城镇,其中2个人携带了某种病毒。其中每个居民会与其他2个人
有密切接触。
另外,在这个城镇当中有2所学校、5家餐厅、10个办公楼、15辆公交车。
在这些公共区域当中,人们会有互相交互的机会,每次交互都有相应的感染概率。
感染了之后,有发展成为重症的概率,有发展成为死亡的概率,另外也有恢复产生抗体的概率。
设置好了参数之后,我们进行模拟演变,我们可以看到每天的感染以及恢复的情况。
通过模拟关闭某些公共设施,可以看到相应的病毒传播抑制效果,这类模拟在当下的疫情防疫方面,有着很好的政策指导作用。
第三个模型是交通规划模型,这个模型是可以提供交通规划的模拟。
我们可以设置红绿灯的密度,道路限速等参数,观察汽车的平均时速和道路效率,通过比较不同的规划方案,选择合适的红绿灯和限速设置。
交通规划部门可以按照这个思路,设计更加贴近真实情况的道路模型,录入相应的参数,进行方案的比较,从而对路段的红路灯设置进行优化。
以上3个是典型的ABM模型的应用案例。NETLOGO当中还有很多的内置经典模型
提供大家尝试,我相信你会从这些模型当中找到很多的乐趣。
接下来,我会通过一个经典的案例,为大家具体介绍ABM模型的构建思路,并且尝试在EXCEL当中重现这个模型,实现触类旁通。
这个案例是来自于一个诺奖大咖Thomas Crombie Schelling - 托马斯谢林
。
谢林在博弈论应用方面有着突出的贡献,他在2005年获得了诺贝尔经济学奖。
他的模型并没有高深的数理推导,而是更多的基于ABM模型去分析微观动机
和宏观表现
的关联,从而指导相关政策的制定。
我们今天一起看看他在1971年提出的:居民居住偏好聚类模型
。
在这个正方形区域当中,居住着两类人。
两类人有着不同的种族、文化或者其他的特征。
同时,我们设置了模型的人口密度为80%。
这意味着区域当中有80%的空置地。
这里我们引入一个概念,相似性偏好值
,根据每个居民四周8个方格中、相同类别居民占全部住户的比例。
我们假设模型当中的居民都是具有相同的、相似性偏好值
、临界值(30%)。
对于个体来说,当他们的相似性偏好临界值、低于、这个临界值的时候,他就会选择搬家到随机一个地方的空地。
系统就会按照这个规则一直演变下去的,直到群体满意
或者达到了系统预设的迭代上限
。
当我们把这个临界值设置成为30%,从个人的角度来说,他/她对于周围同类型居民的比例要求就是30%。
这体现出来了这个人具有很大的差异容忍性
。
但是当我们进行了模拟之后,会发现人们最终出现了聚类现象。
如上图所示,红色和红色聚集,蓝色和蓝色聚集了,最终系统的平均相似比例
,超过了70%。
这代表什么意思呢?
这意味着,个体的高容忍性、并没有导致、群体的高容忍结果
。
当我们提升相似性偏好值
达到75%的时候,结果体现出来了明显的聚集效应
,系统相似度最终达到了99.5%。
当我们再一次提升相似性偏好值
达到76%,这个时候系统是没有办法达到均衡的。
这说明了什么呢?这说明这个时候的个体,都是具有排他偏好的,群体是具有了一致性的排他偏好的,结果却是一个平均相似度维持在50%左右的动态系统。
这是一个非常反直觉的结果
,但是这又是非常真实的社会现象。
1971年的谢林,在没有计算机的情况下,拿着硬币和棋盘,花费了几个月的时候,才能够得到相似的结论。
现在的我们,可以借助计算机的强大算力进行模拟。
下面我会为大家解释,这个模型的基本构建思路。
首先设置初始状态,两类居民是分布在网格当中的,并且留有空置地,我们把空置地的位置存储在列表1当中。
计算流程如下,每次迭代当中,我们会遍历每一个居民,然后计算这个居民的满意度。
当这个居民的满意度低于我们的系统设定值的时候,在列表1当中随机选择一个空地进行搬家。
原来居住的地方修改成为空置地,原来的空置地搬家到这个地方了修改成为居住状态,然后更新列表1,如下图所示:
如果没有空置地可以提供选择,那么就跳出来遍历,如下图所示:
循环以上的流程,直到以下两个条件满足其一:
在NETLOGO当中的CODE编程区域,存储着这个模型的代码。
这个代码是基于Scala和Java的模型。
在这个模型当中,通过globals命令,设定了两个全局变量。
总体相似度,percent-similar,还有不满意度,percent-unhappy。
通过turtles-own命令,可以设定个体参数,这里定义了每个个体的相应属性。
包括个体的相似性偏好要求,近邻相似度等。
globals和turtles-own命令都是需要再程序的一开始进行声明的。
接下来就是一连串的to...end
的语法结构。
这是用来定义程序要执行的动作
。
首先设定初始状态,然后是每次迭代的流程,其中的子流程,有着各自的to end语句。
这里的子流程包括,第一行判断是否全员满意,第二行移动不满意的个体到空地上,第三行更新个体属性、参数,第四行更新全局变量。
当你在操作界面点击一次go once按钮,程序会运行这个迭代流程一次,点击go按钮之后,程序就会不断运行,直到退出机制被触发了。
其实这个程序还是很好理解的。
这里给大家看一下,我使用excel实现的相同的ABM模型模拟。
Excel当中的每个单元格,可以看成是对应的居住空间,红蓝色的设置可以区分成为两类人。
空格代表的是空置地。
我们可以通过VBA去实现相同的迭代流程。
标签:仿真,这个,模型,ABM,个体,当中,我们 From: https://www.cnblogs.com/gnuzsx/p/17765446.html