本文介绍如何用 Agent-based model 的方法,对一个包含狼、麋鹿、草三种生物的生态系统建模。
GitHub项目链接:nature-system
Agent指个体,Agent-base model即基于个体的模型。在Agent-based model中,虚拟实体(virtual entity)和现实个体一一对应。一般来说,虚拟实体的属性是对现实个体的抽象,虚拟实体的行为则是依照已经写好的规则迭代。这种建模方式往往涉及个体详细的行为模式,因此适合以研究个体行为规则为目的的建模。
需要注意的是,利用Agent-based model方法建模,并不是变量越多越好,过多的变量会造成调试上的困难。选取的变量足够支撑起我们研究的问题就可以了。
Note: 除了Agent-base model之外,Equation-based model也是一种比较常见的建模方式。Agent-based model适合表达每个个体身上发生了什么,比如个体的速度、位置的变化等。Equation-based model则而更适合表达系统平均发生了什么,比如人口模型中人口数量变化就更适合用Equation-based model建模。
模型假设
(一)生物的属性
模型内有三种生物:狼(wolf)、麋鹿(moose)、草(grass)。此外,狼还分为头狼和普通狼。下面这张表展示了头狼、普通狼、麋鹿的属性:
# | age | food | pos | speed | last_breed | population | packNo | range | eaten |
---|---|---|---|---|---|---|---|---|---|
头狼 | √ | √ | √ | √ | √ | √ | √ | √ | |
普通狼 | √ | √ | √ | √ | √ | ||||
麋鹿 | √ | √ | √ | √ | √ |
从上表可以看出,年龄、食物、位置、速度是头狼、普通狼和麋鹿的共有属性。last_breed指和上一次生育的时间间隔,在模型内用一次迭代表示一次时间间隔,因为迭代必须是整数,因此last_breed也是整型变量。头狼特有population属性,用来表示该头狼所在狼群中狼的数量;头狼特有range属性,表示该狼群活动的范围;头狼特有eaten属性,表示狼群在一次迭代中,全体成员吃到的麋鹿的总数。普通狼特有packNo属性,用来标记其所属狼群的头狼在列表中的索引号。普通狼没有last_breed属性,是因为其生育是以整个狼群为单位的。由于狼群是由头狼定义的,狼群相关的属性和行为也绑定在头狼身上,因此在代码实现上,狼群的生育是通过头狼实现的。
草没有上述生物那么复杂的模型,本模型中的草均匀平铺在环境中,且不会生长,吃完就没了。因此麋鹿为了获取新的食物来源,需要经常迁徙。
(二)生物的行为
头狼、普通狼和麋鹿都具有四种行为:死亡、迁徙、生育、捕猎。这四种行为在不同的生物种类上有不同的定义。比如麋鹿的迁徙规则是等到自己的位置没草吃了,才开始迁徙。而头狼迁徙规则则比较复杂,头狼会根据狼群内的种群数量,判断狼群的散布范围,以及调整迁徙的积极性。
1.死亡(die)
狼有两种死法:饿死或老死。麋鹿则有三种死法:饿死、老死或者被吃。
每一种生物都有固定的年龄上限值,超过该值将在本次迭代中死亡。本模型中,狼的最大年龄为25。如果一只狼如果没有饿死