Step1: 基本模型

回顾一下基本模型的结构,在GAML中,一个完整的模型定义,包含三个部分:全局代理(global)、族群或网格(species and grid)、实验设置(experiment)。

Model Header

在GAMA中新建一个项目“Predator Prey",并在models文件夹新建一个模型文件,GAMA会自动生成一个模型名称,我们先将模型名称改成项目名:

model predator_prey

接下来定义全局代理(global),全局代理包括全局变量以及模型的初始状态。

Global

global {
	// 定义食草动物数量
	int nb_preys_init <- 200;
	//初始化
	init {
		//创建食草动物数量为nb_preys_init
		create prey number: nb_preys_init;
	}
}

Species and Grid

然后定义食草动物(pred)和草(vegetation),这里我们将食草动物定义为族群(species)草定义为网格(grid),因为草地是承载食草动物行为的环境。

//创建一个50x50的四边形网格(注:neighbors控制网格的形状,如6边形、8边形等)
grid vegetation_cell width: 50 height: 50 neighbors: 4 {
	//定义网格属性
	//food代表每个网格的食物量
	//max_food每个网格最大食物量
	float max_food <- 1.0;
	//每次模拟网格中食物量随机增加的数值(0-0.01)
	float food_prod <- rnd(0.01);
	//每个网格初始食物量为(0-1)的随机数,每次模拟更新加food_prod,最大值为max_food
	float food <- rnd(1.0) max: max_food update: food + food_prod;
	//根据食物量的大小,网格的颜色也会发生变化
	rgb color <- rgb(int(255 * (1 - food)), 255, int(255 * (1 - food))) update: rgb(int(255 * (1 - food)), 255, int(255 * (1 - food)));
}

GAML中颜色的表示可以用#+颜色名表示,如#blue、#red 等(颜色列表可以查看官方文档)。也可以用三通道rgb(red,green,blue)表示,如rgb(255,255,255)。

//创建食草动物族
species prey {
	//定义属性
	//显示大小
	float size <- 1.0;
	//颜色
	rgb color <- #blue;
	//所在的草地网格
	vegetation_cell my_cell <- one_of (vegetation_cell);
	//初始化位置为所在草地网格位置
	init {
		location <- my_cell.location;
	}
	//显示方式:大小为size的圆,颜色为color
	aspect base {
		draw circle(size) color: color;
	}
}

Experiment

最后定义模型运行时的输入与输出。

//实验名称为prey_predator,输出方式为图形界面
experiment prey_predator type: gui {
	//定义食草动物的数量为可在图形界面调整的参数
	parameter "Initial number of preys: " var: nb_preys_init min: 1 max: 1000 category: "Prey";
	//定义输出
	output {
		//输出窗口名为main_display
		display main_display {
			//显示vegetation_cell网格,线型为黑色
			grid vegetation_cell lines: #black;
			//以prey族中aspect定义的base方式显示prey族
			species prey aspect: base;
		}
	}
}

至此一个有两种代理的基本模型构建完成,点击编辑窗口上方的绿色按钮,GAMA将会启动模拟界面,模拟界面由控制栏,参数调整栏,信息栏以及图形窗口组成。

  • 控制栏:控制模拟的启动、暂停、退出等

  • 参数调整栏:控制在experiment中定义的可调整参数

  • 图形界面:显示在experiment中定义的图形输出

4.1.1 GAMA窗口的模拟界面

本节的完整代码如下:

model prey_predator

global {
	// 定义食草动物数量
	int nb_preys_init <- 200;
	//初始化
	init {
		//创建食草动物数量为nb_preys_init
		create prey number: nb_preys_init;
	}
}

//创建食草动物族
species prey {
	//定义属性
	//显示大小
	float size <- 1.0;
	//颜色
	rgb color <- #blue;
	//所在的草地网格
	vegetation_cell my_cell <- one_of (vegetation_cell);
	//初始化位置为所在草地网格位置
	init {
		location <- my_cell.location;
	}
	//显示方式:大小为size的圆,颜色为color
	aspect base {
		draw circle(size) color: color;
	}
}
//创建一个50x50的四边形网格(注:neighbors控制网格的形状,如6边形、8边形等)
grid vegetation_cell width: 50 height: 50 neighbors: 4 {
	//定义网格属性
	//food代表每个网格的食物量
	//max_food每个网格最大食物量
	float max_food <- 1.0;
	//每次模拟网格中食物量随机增加的数值(0-0.01)
	float food_prod <- rnd(0.01);
	//每个网格初始食物量为(0-1)的随机数,每次模拟更新加food_prod,最大值为max_food
	float food <- rnd(1.0) max: max_food update: food + food_prod;
	//根据食物量的大小,网格的颜色也会发生变化
	rgb color <- rgb(int(255 * (1 - food)), 255, int(255 * (1 - food))) update: rgb(int(255 * (1 - food)), 255, int(255 * (1 - food)));
}

//实验名称为prey_predator,输出方式为图形界面
experiment prey_predator type: gui {
	//定义食草动物的数量为可在图形界面调整的参数
	parameter "Initial number of preys: " var: nb_preys_init min: 1 max: 1000 category: "Prey";
	//定义输出
	output {
		//输出窗口名为main_display
		display main_display {
			//显示vegetation_cell网格,线型为黑色
			grid vegetation_cell lines: #black;
			//以prey族中aspect定义的base方式显示prey族
			species prey aspect: base;
		}
	}
}

接下来我们为不同的代理编写行为特征。

Last updated

Was this helpful?