AnyLogic状态图:每日经过某状态的智能体统计及代码影响疑问
问题解答
一、状态内代码是否影响统计?
这取决于你在状态中编写的代码逻辑:
- 不影响的情况:如果代码仅用于修改智能体属性、执行计算、调用外部接口等不改变状态流转行为的操作,不会影响经过该状态的智能体数量统计。
- 会影响的情况:如果代码包含以下逻辑,会直接改变统计结果:
- 触发智能体提前跳转至其他状态(比如调用
agent.goToState(...)) - 销毁智能体(
agent.destroy()) - 修改状态流转的条件判断,导致部分智能体跳过该状态
- 让智能体重复进入该状态(比如循环跳转)
- 触发智能体提前跳转至其他状态(比如调用
二、每日统计与图表展示实现步骤
1. 准备统计变量
根据你的统计需求选择:
- 统计进入次数:创建两个变量:
int dailyEntryCount = 0;(当日累计进入次数)TimeSeries<Integer> dailyEntryData = new TimeSeries<>();(存储每日统计结果的时间序列)
- 统计不同智能体数量:额外创建一个集合记录当日进入过的智能体ID:
Set<Long> dailyAgents = new HashSet<>();
2. 在目标状态添加统计逻辑
打开状态图中目标状态的Entry action(进入动作),添加对应代码:
- 统计进入次数:
dailyEntryCount++; - 统计不同智能体数量:
dailyAgents.add(agent.getId());
3. 实现每日数据汇总与重置
添加一个Event事件到模型中,设置触发类型为「按日历时间」,触发频率为每日0点,在事件的Action中编写:
- 针对进入次数统计:
// 将当日数据存入时间序列 dailyEntryData.add(time(), dailyEntryCount); // 重置当日计数器 dailyEntryCount = 0; - 针对不同智能体数量统计:
// 存入当日唯一智能体数量 dailyEntryData.add(time(), dailyAgents.size()); // 清空集合 dailyAgents.clear();
4. 绑定图表展示
- 添加
Plot Chart到主界面:- 选中图表,在右侧属性面板的「Data」中点击「Add」
- 选择「Time series」,将
dailyEntryData绑定到数据源 - 设置X轴为「Time」,Y轴为「Value」,调整样式即可展示每日折线图
- 如果用
Time Stack Chart(适合多状态对比):- 为每个需要统计的状态创建独立的时间序列
- 将所有时间序列添加到图表的数据源中,图表会自动堆叠展示每日各状态的数量总和
5. 注意事项
- 若状态内有延迟或异步操作,确保统计代码放在Entry action中(进入状态时立即执行),避免因延迟导致统计遗漏
- 如果状态内有销毁智能体的逻辑,务必先执行统计代码,再执行销毁操作
- 若模型中有时间加速设置,确保Event的触发时间与实际日历时间同步,避免统计周期混乱
内容的提问来源于stack exchange,提问作者Masoud Zamanipoor
相关产品推荐
相关产品推荐

