如何计算模拟中日间医院护士资源的全天占用时长?
解决护士池资源忙碌时长计算问题
原代码的核心错误
- 变量名不一致:初始化了
occupancystarttime,但实际用的是未初始化的busystarttime;累加时误用了未定义的dureeOccupation,而非计算好的busytime。 - 未处理多护士场景:单个
busystarttime无法同时记录多个护士的忙碌起始时间,当多个护士先后进入忙碌状态时,会覆盖之前的时间,导致时长计算严重偏低。 - 事件触发逻辑错误:用定时检查状态的方式,会错过资源状态变化的瞬间(比如护士刚忙碌就被释放),无法准确捕捉每个忙碌周期的起止点。
最优解决方案:直接调用内置方法
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
相关产品推荐
相关产品推荐

