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

如何计算模拟中日间医院护士资源的全天占用时长?

解决护士池资源忙碌时长计算问题

原代码的核心错误

  1. 变量名不一致:初始化了occupancystarttime,但实际用的是未初始化的busystarttime;累加时误用了未定义的dureeOccupation,而非计算好的busytime。
  2. 未处理多护士场景:单个busystarttime无法同时记录多个护士的忙碌起始时间,当多个护士先后进入忙碌状态时,会覆盖之前的时间,导致时长计算严重偏低。
  3. 事件触发逻辑错误:用定时检查状态的方式,会错过资源状态变化的瞬间(比如护士刚忙碌就被释放),无法准确捕捉每个忙碌周期的起止点。

最优解决方案:直接调用内置方法

AnyLogic的ResourcePool类本身提供了totalBusyTime()方法,可直接获取所有资源的总忙碌时长,无需手动写事件:

// 获取护士池所有护士的总忙碌时长
double totalBusyTime = nurseHDJchir.totalBusyTime();

如果需要获取单个护士的忙碌时长,可遍历资源池中的每个资源调用getBusyTime():

double singleNurseBusyTime = 0;
for(Resource nurse : nurseHDJchir.getResources()){
    singleNurseBusyTime = nurse.getBusyTime();
    // 按需处理单个护士的时长数据
}

手动实现方案(自定义场景)

如果因特殊需求必须手动统计,可通过资源池的on seize和on release事件实现:

步骤1:给护士资源添加自定义参数

假设你的护士是自定义Resource类型(如命名为Nurse),添加一个double类型的参数busyStartTime,初始值设为0.0。

步骤2:在资源池On seize事件中记录起始时间

// 当护士被占用时,记录当前时间为忙碌起始点
agent.busyStartTime = time();

步骤3:在资源池On release事件中计算并累加时长

// 计算当前护士本次忙碌的时长
double busyDuration = time() - agent.busyStartTime;
// 累加到总时长变量
dureeTotaleOccupation += busyDuration;

替代方案:用Map跟踪起始时间

如果无法给资源添加自定义参数,可使用全局Map存储每个护士的忙碌起始时间:

// 全局变量:存储护士资源与对应忙碌起始时间的映射
Map<Resource, Double> nurseBusyStarts = new HashMap<>();

// On seize事件
nurseBusyStarts.put(agent, time());

// On release事件
double startTime = nurseBusyStarts.get(agent);
dureeTotaleOccupation += time() - startTime;
nurseBusyStarts.remove(agent);

内容的提问来源于stack exchange,提问作者Nolwenn LE BUHAN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:22:35