Step3: 父、子族群的继承

在我们的模型中食草动物和食肉动物有几乎一样的属性和行为,只是两者吃的东西不一样,比起重新编写一次食肉动物的行为,利用父族群和子族群的继承关系,避免重复的代码是更高效的写法。

父、子族群

在GAML中子族群可以继承族群所有的属性和行为,我们可以定义一个通用族设为父族,将食肉动物和食草动物共有的属性定义在父族中,并让他们从父族继承这些共有属性,而将他们不同的属性分别定义在各自族群里。

4.3.1 父族群和子族群

共有属性

  • 共有变量:

    • 大小: size

    • 颜色: color

    • 所在网格: my_cell

    • 最大能量值: max_energy

    • 每次最大进食量: max_transfer

    • 每次能量消耗量: energy_consum

    • 所在网格: my_cell

    • 能量值: energy

    • 繁殖概率: proba_reproduce

    • 最大繁殖数: nb_max_offsprings

    • 繁殖能量: energy_reproduce

  • 共有行为:

    • 移动: basic_move

    • 进食: eat

    • 死亡: die

    • 繁殖: reproduce

  • 共有显示:

    • 显示方式: base

注意食草动物和食肉动物都有吃的行为,但是两者具体操作稍有差异,因此我们在父族中实现一个函数energy_from_eat,并在子族中重写这个函数,子族重写的函数会覆盖父族同样的函数,从而实现食草动物和食肉动物不同的吃的行为。

父族代码实现

注意父族在编写时只是创建了相关属性,并没有初始化属性值,这些属性值将在子族中初始化,以实现子族不同的属性。

食草动物族(prey species)

食草动物族继承自通用族(generic_species),在其族定义中需要初始化各属性值,并重写energy_from_eat函数,实现其与食肉动物不同的属性与吃的行为。

食肉动物群

同样地,食肉动物族继承自通用族(generic_species),在其族定义中需要初始化各属性值,并重写energy_from_eat函数,实现其与食草动物不同的属性与吃的行为。应该注意的是,食肉动物吃了食草动物之后代表食草动物死亡,这里我们通过ask函数实现不同族之间的操作,具体代码如下:

ask species/agent { do something }: ask函数通常用来在一个族的代理运行过程中与另一个族的代理进行交互,和英语的ask sb do something类似。

更新全局定义和实验设置

加入肉食动物后,全局设置和实验设置中的参数,也要对应加上,本节完整代码如下:

Last updated

Was this helpful?