You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 01:50:01