首页 > 解决方案 > 如何使用任何逻辑创建出口阻塞(目标线)的概率并让行人选择替代出口?

问题描述

我目前正在使用只需单击按钮即可使用行人对建筑物进行楼层火灾疏散。当单击按钮时,我想创建一个概率(例如 0.2 表示 1 个出口阻塞,<0.2 表示 2 等等),当单击按钮时,火灾会阻塞 1、2、3 个出口(目标线)中的全部或全部,并使行人移动到另一个最近的出口。我怎么能用anylogic做到这一点?

标签: anylogic

解决方案


出口阻塞(有一定概率)

您可以使用 AnyLogic 中的内置概率分布来获得具有所需概率的选项之一。在您的情况下,您可以使用每个出口的均匀分布来确定它是否被阻塞。例如在模型启动时运行它。因为我们不能真正“阻碍”目标线,所以我们反过来:我们收集那些没有被阻碍的人,只允许那些被选为目的地。为此,我们将每个可用出口保存在 Collection availableExits中。稍后在决定采取哪个出口时,我们将告诉决策函数只考虑列表中的那些。把它放在你的Main属性的On Startup部分:

if(uniform(0,1)<0.8){ // 20% probability of obstruction
    availableExits.add(targetLine1);
}
if(uniform(0,1)<0.6){ // 40% probability of obstruction
    availableExits.add(targetLine2);
}
if(uniform(0,1)<0.9){ // 10% probability of obstruction
    availableExits.add(targetLine3);
}

像这样定义 Collection availableExits

收藏

疏散流程

对于疏散,您可以准备一个单独的流程,当触发疏散时,代理会进入该流程。该流程可以附加到步行图书馆街区的 ccl/疏散端口上的主要流程。

过程

在单独的疏散流程中,放置一个 moveTo 块,其中目的地由函数给出。

转到块

最近的可用出口

此函数将遍历您的 Collection availableExits中的所有出口并选择最接近的出口。输入参数是Pedestrian类型并命名为ped,输出参数是TargetLine类型。

功能头

if(availableExits.size()<1){
    error("No exit is available");
    return null;
}

double currentDistance = ped.getPosition().distance2D(new Point(availableExits.get(0).getX(),availableExits.get(0).getY());
double minDistance = currentDistance;
TargetLine closestExit = availableExits.get(0);

for(int i=1;i<availableExits.size();i++){
    currentDistance= ped.getPosition().distance2D(new Point(availableExits.get(i).getX(),availableExits.get(i).getY());
    if(currentDistance<minDistance){
        minDistance = currentDistance;
        closestExit = availableExits.get(i);
    }
}

return closestExit;

推荐阅读