Step2: 代理行为的编写

为了实现食草动物的移动,我们先为草地(vegetation_cell)添加一个属性neighbors2,用来存储每个网格周边相距为2的所有网格

grid vegetation_cell width: 50 height: 50 neighbors: 4 {
	...
	//将周边距离自己为2的其他vegetation_cell存到neighbors2列表中
	list<vegetation_cell> neighbors2  <- (self neighbors_at 2);
}

neighbors_at : 语句为 A neighborsat distance , 返回与A相距distance的所有物体。在代码中self,指代每个vegetation_cell自身。

接下来编写食草动物的行为,食草动物的行为包括移动、进食、死亡和繁殖。首先为食草动物添加能量值(energy)、最大能量值(max_energy)、每次最大进食量(max_transfert)、每次能量消耗值(energy_consum)、繁殖概率(proba_reproduce)、最大繁殖数(nb_max_offsprings)、繁殖能量(energy_reproduce)等属性。

species prey {
	...
	//最大能量值
	float max_energy <- prey_max_energy;
	//每次进食量
	float max_transfert <- prey_max_transfert;
	//每次能量消耗值
	float energy_consum <- prey_energy_consum;
	//初始化能量为(0-max_energy)之间的随机数,每次模拟消耗energy_consum的能量,能量的最大值为max_energy
	float energy <- rnd(max_energy) update: energy - energy_consum max: max_energy;
	//繁殖概率
	float proba_reproduce <- prey_proba_reproduce;
	//最大繁殖数
	int nb_max_offsprings <- prey_nb_max_offsprings;
	//繁殖能量
	float energy_reproduce <- prey_energy_reproduce;
	...
}

移动行为

使用reflex句式编写每次模拟进行的行为。

reflex: 使用reflex关键字定义的函数,会在每次模拟(every step) 都运行,这里定义的移动行为表示,食草动物会在每次模拟随机移动到周边距离为2的网格中。

进食和死亡行为

reflex...when: reflex后面接when关键词表示当某个条件达成时,应该进行的行为。

繁殖行为

flip(float): 此处用flip函数将0-1之间的浮点数按其大小的概率转换为True或者False

同时为了能在模型运行时对各项参数进行调整,我们将食草动物最大能量值(max_energy)、每次最大进食量(max_transfert)、每次能量消耗值(energy_consum)、繁殖概率(proba_reproduce)、最大繁殖数(nb_max_offsprings)、繁殖能量(energy_reproduce)等属性设为全局属性,并在experiment中设为可调整参数。

如此,便完成了食草动物行为的编写,本节完整代码如下:

此时运行模型,已经可以看到食草动物吃草的仿真模拟,并且左侧的参数调整栏有了更多的可调整参数。

4.2.1 食草动物行为模拟

接下来,我们通过子、父族群来完成食肉动物行为的编写。

Last updated

Was this helpful?