AnyLogic中Queue.contents()获取队列智能体返回空列表的解决方法
问题原因
Queue.contents()返回空列表是API误用+执行时机不对共同导致的高频问题:
- 你调用的
contents()是所有AnyLogic智能体的通用容器方法,返回的是Queue模块自身作为画布上的智能体,内部直接承载的画布子元素(比如你拖到Queue图标上的图形、注释、嵌入的小模块),根本不是在队列里排队的AgentA流程智能体。 - 如果你把统计代码写在Queue的「进入时(On enter)」动作块里,此时触发动作的AgentA还没完成入队注册,就算用对了API也会漏算当前入队的智能体。
修正方案
替换正确的队列访问API
流程建模库的Queue模块获取当前排队的所有智能体,要调用专门的agents()方法,不要用通用的contents()。修正后的基础统计代码如下:
int countB = 0; for( AgentA agentA : Queue.agents() ) { // 注意:如果AgentB是放在AgentA内自定义命名的智能体种群里,直接访问种群size,不要用contents() // 例:AgentA内B的种群叫bPop,就写countB += agentA.bPop.size(); countB += agentA.contents().size(); } traceln(countB);
提示:
agentA.contents()会统计AgentA内部所有直接子元素,如果你在AgentA的画布上放了演示图形、按钮、其他嵌入模块,这些也会被算入size,导致统计值偏大。如果B是单独建的智能体种群,直接访问对应种群的size()才是准确的。
调整代码执行时机
- 不要在Queue的「进入时」动作块里统计队列全量内容,此时当前入队的AgentA还没加入排队集合。要在入队节点触发统计的话,把代码放到Queue上游模块的「离开时(On exit)」块里,或者延迟1个仿真时间单位再触发统计。
- 如果在Queue的「离开时(On exit)」块里统计,注意当前触发动作的AgentA已经被移出排队集合,累加的时候要手动把这个AgentA携带的B数量加上。
效率优化方案
如果需要频繁读取B的总数量,不要每次都遍历队列累加,在Main顶层建一个初始值为0的全局变量totalB做实时计数:
- AgentA进入Queue时,把自身携带的B数量加到
totalB上 - AgentA在Queue内停留期间,每新增/移除一个B,就同步对
totalB做+1/-1操作 - AgentA离开Queue时,把自身携带的B数量从
totalB里减掉
后续需要取总数量时直接读totalB即可,既不会出现API调用错误,也不会因为频繁遍历集合拖慢模型运行速度。
内容的提问来源于stack exchange,提问作者dkdelta
相关产品推荐
相关产品推荐

