Anylogic行人库仿真场景下如何计算所有行人两两之间的距离
AnyLogic行人间距批量计算实现方案
操作步骤
- 第一步:调用默认全局行人群体获取活跃行人
AnyLogic行人库模型会自动创建名为ped的代理群体,所有未被Ped Sink销毁的活跃行人都存在该群体中,可直接调用,无需额外配置。如果自定义过行人群体名称,替换为你设置的群体名即可。 - 第二步:添加周期触发事件
拖入一个Event组件,触发模式设置为按周期,周期值填1,单位选择秒,后续所有计算逻辑都写在该事件的「动作」代码块中。 - 第三步:编写无重复两两距离计算代码
使用双层嵌套循环遍历行人群体,外层循环到倒数第二个行人,内层循环从外层当前索引的下一位开始遍历,避免同一对行人重复计算、也排除自身和自身的无效匹配,参考代码如下:
// 获取当前所有活跃行人 List<Ped> currentPeds = ped; // 外层遍历 for(int i = 0; i < currentPeds.size() - 1; i++){ Ped ped1 = currentPeds.get(i); // 内层遍历从i+1开始,避免重复计算 for(int j = i + 1; j < currentPeds.size(); j++){ Ped ped2 = currentPeds.get(j); // 调用AnyLogic内置距离计算方法,也可自行通过getX()、getY()计算欧氏距离 double dist = distance(ped1, ped2); // 筛选间距小于1m的组合 if(dist < 1){ // 此处补充你的统计逻辑,比如计数、输出日志、写入数据集等 traceln(time() + "s:行人" + ped1.getId() + " 与行人" + ped2.getId() + " 间距为" + round(dist, 2) + "m"); } } }
补充说明
- 若需要自行通过坐标计算距离,可替换
distance(ped1, ped2)为Math.hypot(ped1.getX() - ped2.getX(), ped1.getY() - ped2.getY()),计算结果和内置方法完全一致。 - 如果模拟场景行人数量超过500,建议先做空间网格分区,仅计算同网格和相邻网格内的行人间距,可大幅降低计算开销,避免模型卡顿。
内容的提问来源于stack exchange,提问作者ruby zou
相关产品推荐
相关产品推荐

