在moveByCrane块统计agent.p_type生成饼图报错问题咨询
问题排查与解决方案
报错核心原因
count()函数使用错误:AnyLogic的count()函数必须指定统计的集合范围(比如全局Population、队列等),你直接写count(agent.p_type == 0)没有明确统计对象,系统无法识别要统计哪些agent。agent上下文错误:在moveByCrane块中,agent仅指代当前正在处理的单个包裹,用它做统计条件只能针对当前包裹,无法实现全局或指定范围的类型计数。
正确实现方案
方案1:全局集合统计(适合全局计数)
- 先创建全局Population集合(命名为
allPackages),在每个Source的On exit事件中添加代码:allPackages.add(agent),把生成的包裹都加入集合。 - 在
moveByCrane块中定义统计变量:int auftrag1 = count(allPackages, p -> p.p_type == 0); int auftrag2 = count(allPackages, p -> p.p_type == 1); int auftrag3 = count(allPackages, p -> p.p_type == 2); - 饼图直接调用这三个变量即可。
方案2:自定义计数器(性能更优)
- 创建三个全局整数变量
countType0、countType1、countType2,初始值设为0。 - 在对应Source的
On exit事件中分别累加:- 第一个Source:
countType0++; - 第二个Source:
countType1++; - 第三个Source:
countType2++;
- 第一个Source:
- 饼图直接调用这三个变量,无需在
moveByCrane内写统计代码。
方案3:统计moveByCrane处理过的包裹
如果只需要统计经过该块的包裹类型数量:
- 在
moveByCrane块的变量中定义auftrag1、auftrag2、auftrag3,初始值设为0。 - 在块的
On enter事件中添加代码:switch(agent.p_type) { case 0: auftrag1++; break; case 1: auftrag2++; break; case 2: auftrag3++; break; } - 饼图调用这三个变量即可。
内容的提问来源于stack exchange,提问作者anylogicuser
相关产品推荐
相关产品推荐

