如何在AnyLogic中用柱状图展示ResourcePool内各手术室的利用率
解决AnyLogic中ResourcePool资源单元的利用率获取问题
问题原因
AnyLogic的ResourcePool类本身没有get(int)方法,无法直接通过索引获取单个资源单元,你之前的allOR_A.get(0)调用才会触发报错。
具体解决方法
1. 正确获取所有手术室单元
ResourcePool提供了getUnits()方法,返回当前池内所有资源的Collection<OperatingRoom>集合,你可以通过这个集合遍历所有手术室:
// 获取所有手术室并转成列表(方便按ID排序) List<OperatingRoom> allOperatingRooms = new ArrayList<>(allOR_A.getUnits()); // 按OpRoom_A_ID排序,保证柱状图柱子顺序固定 Collections.sort(allOperatingRooms, (or1, or2) -> Integer.compare(or1.OpRoom_A_ID, or2.OpRoom_A_ID));
2. 动态柱状图配置方案
方案一:直接在柱状图UI中配置
- 打开柱状图的Data设置面板
- 在"Items"栏输入:
new ArrayList<>(allOR_A.getUnits()) - 在"Label"栏输入:
((OperatingRoom)item).OpRoom_A_ID(显示手术室ID作为柱子标签) - 在"Value"栏输入:
((OperatingRoom)item).OR_Utilization_A()(绑定利用率计算函数) - 勾选"Auto-update"选项,让柱状图实时刷新数据
方案二:代码维护数据集(适合复杂逻辑)
在模型中添加一个List<Double>类型的变量(比如orUtilizationData),然后编写一个刷新函数:
public void refreshORUtilization() { List<OperatingRoom> orList = new ArrayList<>(allOR_A.getUnits()); Collections.sort(orList, (or1, or2) -> Integer.compare(or1.OpRoom_A_ID, or2.OpRoom_A_ID)); // 清空旧数据并填充新的利用率 orUtilizationData.clear(); for(OperatingRoom or : orList) { orUtilizationData.add(or.OR_Utilization_A()); } }
- 在ResourcePool的
On seize、On release事件末尾调用refreshORUtilization(),或者用定时事件每隔固定时间调用一次 - 将柱状图的数据源绑定到
orUtilizationData,并设置柱子标签为手术室ID列表
额外注意事项
- 确保
OR_Utilization_A()函数逻辑正确,例如仿真全程利用率的计算应为:public double OR_Utilization_A() { return time() > 0 ? busyTime_A / time() : 0; } - 如果手术室数量会动态变化(如中途增减),需确保柱状图的标签和值列表同步更新
内容的提问来源于stack exchange,提问作者gaia
相关产品推荐
相关产品推荐

