Step2: 人群代理的编写

创建人群族

首先,我们将人群族的基本属性编写完成。

global {
    ...
    //初始人群数量
    int nb_people <- 100;
    //路网图形
    graph the_graph;
    
    init {
    ...
        
    //初始化人群族,初始位置为随机一个居住建筑内的任意位置
    create people number: nb_people {
        location <- any_location_in (one_of (residential_buildings));
    }
    }
}

species people {
    //显示颜色
    rgb color <- #yellow ;
    //显示方式
    aspect base {
    draw circle(10) color: color border: #black;
    }
}

experiment road_traffic type: gui {
    output {
    ...
    display city_display type:opengl {
        ...
        //增加人群族的显示
        species people aspect: base ;
    }
    }
}

编写人群行为

我们希望人群在上班时间沿着道路出发去工作地点,下班时间从工作地点回到居住地点,为了实现这些行为,我们为人群族添加必要的技能moving,然后为人群族增加必要的属性。

skills: skills是GAMA为仿真模型预设的行为模块,每个skill都包含了相应的属性和行为动作,以moving为例,moving包含了speedheadingdestination等属性以及movegotofollowwanderwander_3D等内置行为函数,使用者可以更加方便快捷地完成复杂行为设计,而无需从零编写。更多skills相关,可查看官方文档-Attaching Skills

接下来,我们编写具体的移动规则。

current_date : current_date是一个内置的全局变量,调用current_date系统会根据step的值返回当前时间,current_date.hour即返回当前的小时数。 do goto target: ... on: ... : goto是skill moving的内置函数,代理将会沿着关键字on所设置的图形以最短路径前往目的地。这里the_graph是一个全局变量,我们会在初始化时为它赋值,详见下一小节。

初始化人群族

接下来,我们在全局设置中初始化人群族,为了仿真模型更好的模拟真实状态,我们通过初始化为人群族中每个代理分配不同的速度、工作时间、下班时间、生活地点与居住地点,实现代码如下:

as_edge_graph(...) : 通过给定的边的列表,创建一个由边组成的网状图形,更多使用方式,详见官方文档

实验设置

最后我们在实验设置中,设置好可调整参数,并设置好人群组的显示。

至此一个基本的交通仿真模型编写完成,本节最终代码如下:

Last updated

Was this helpful?