说明:自 AnyLogic 8.7 之后,原来用于区域建模的PedAreaDescriptor模块被弃用,取而代之的是使用多边形节点(Polygonal Node)和矩形节点(Rectangular Node)来对规则不规则区域,有速度和访问限制的区域进行建模。在8.7之前常用到PedAreaDescriptor模块的用户,可以参考帮助的相关章节,了解相关的修改。
在本文中,我们将简单介绍绘制并设置节点区域以及获取区域面积、区域内行人密度的相关操作。下面我们会通过创建一个简单的行人模型来进行说明。
在此模型中,我们模拟行人流会走过一个曲折通道的情景,并希望通过Anylogic的相关函数获取该区域面积、通过行人数量以及区域内行人密度。好了,新建模型的步骤我们就直接跳过,直接从创建行人通道开始。
双击空间标记(或行人库)模块中的多边形节点组件,于main智能体界面中绘制一个多边形通道,示例下图:
图1:用多边形节点绘制行人通道
绘制完成后,在该节点的属性面板中,我们找到速度限制和进入限制属性,在勾选进入限制,将进入限制通过选项,选择条件,并将条件的值设置为false,如下图:
图2:设置节点区域属性
注:这一步的设置是为了在获取区域密度时使用density()方法:density()方法必须给节点加上限制之后才能使用,否则获取的数据一直为0,无法获取正确数据。
节点属性设置完成之后,我们为这个通道的头尾处添加两条目标线。绘制目标线的目的是为定义行人的入口、等待位置或目的地(出口)的。在空间标记(或行人库)模块中,直接拖拽目标线组件到相应位置即可,绘制完成示意如下:
图3:为节点区域添加目标线
在两条目标线设置完成后,双击空间标记模块中行人部分(或行人库)的路径组件,沿着该通道绘制一条路线,目的是为了让行人沿着这条通道从入口目标线走到出口目标线,此示例中是从左上方入口到右下方出口,绘制完成后应如下图所示:
图4:绘制行人的行进路径
至此,第一步的通道绘制工作结束。
我们从行人库模块中按顺序拖出pedSource、pedGoTo、pedSink组件,并将其连接,如下图:
图5:行人流程图
我们将pedSource模块中的目标线设置为通道左端开端的目标线,可以从列表中选择,也可以通过右侧的捕获器从图中选中对应的目标线,设置如下:
图6:pedSource模块属性设置
pedGoTo模块中,我们将模式更改为跟随路线,并将路线选中我们刚才绘制的路径,设置更改如下:
图7:pedGoTo模块属性设置
此处设置完之后可以尝试运行,若运行成功可以看到如下画面:
图8:模型运行效果演示
我们从演示模块中,拖出文本组件,创建3个文本,分别将它们属性面板中的文本更改为“面积 =”、“区域内人数=”、“密度=”,更改例如下图:
图9:文本组件属性设置
随后在其文本后拖入3个新的文本,将其属性面板中的文本内容清空,完成后如下图所示:
图10:创建的文本效果示意
完成后,我们从控件模块中拖出3个按钮组件,分别将它们的标签设置为获取面积、获取区域内人数、获取密度,放置在刚才对应的文本前方,并分别更改属性如下:
获取面积:行动:text3.setText(node.area(SQ_METER));
图11:设置获取面积按钮的属性
获取区域内人数:行动:text4.setText(node.agents().size());
图12:设置获取区域内人数按钮的属性
获取密度:行动:text5.setText(node.density(SQ_METER));
图13:设置获取密度按钮的属性
设置完成之后,运行实验,我们可以通过点击按钮获得点击时对应的node区域内部对应的行人(智能体)数量、区域密度,如下:
图14:最终模型运行效果演示
获取矩形节点和多边形节点区域面积的方法,是通过area()方法实现的,该方法是无法代码补全的,所以要通过手动输入。
获取区域内的行人密度,有两种方法:
1.通过分别获取区域的面积和区域内的人数,然后人数/面积= 密度。
人数 = node.agents().size();
面积 = node.area(SQ_METER);
double area() : 返回此区域的面积,以平方米为单位
int size() :返回区域内的行人数量。
2.直接调用density()方法
密度 = node.density(SQ_METER);
double density() :返回此区域内的行人密度的平均值,以每平方米行人数为单位
注意,使用此方法时,必须给节点加上限制:在速度和进入限制属性框中,勾选进入限制选项,并将进入限制通过选为【条件】,并将条件的值置为false。
下附本文中涉及到的示例模型,附件:modeldensitycount