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

如何为simpy Resource对象添加属性,用于呼叫中心仿真后数据分析?

实现思路与代码示例

原生Simpy Resource 是基于容量的抽象,并不会维护单个资源实例的状态,所以没法直接给每个坐席添加id、统计时长这类属性。要实现你的需求,推荐用**自定义坐席类+Simpy Store**来模拟可追踪的坐席资源,具体方案如下:

1. 定义带统计属性的坐席类

先创建一个Agent类,封装坐席的id、通话时长、空闲时长,以及状态变更的记录逻辑:

import simpy

class Agent:
    def __init__(self, agent_id, env):
        self.id = agent_id
        self.env = env
        self.total_talk_time = 0  # 总通话时长
        self.total_idle_time = 0  # 总空闲时长
        self.last_state_change = env.now  # 记录上次状态变更的时间

    def start_talk(self):
        # 开始通话时,计算从上次空闲到现在的时长,累加到空闲时长
        self.total_idle_time += self.env.now - self.last_state_change
        self.last_state_change = self.env.now

    def end_talk(self):
        # 结束通话时,计算通话时长,累加到总通话时长
        self.total_talk_time += self.env.now - self.last_state_change
        self.last_state_change = self.env.now

2. 用Store管理坐席资源

Simpy Store可以存放具体的Agent实例,替代原生Resource实现“请求-释放”逻辑,同时能追踪到具体是哪个坐席处理了请求:

def call_process(env, call_id, agents_store, agents_list):
    print(f"Call {call_id} arrives at {env.now:.2f}")
    # 从Store中请求一个坐席
    agent = yield agents_store.get()
    print(f"Call {call_id} is handled by Agent {agent.id} at {env.now:.2f}")
    
    agent.start_talk()
    # 模拟通话时长(随机生成1-3单位时间)
    talk_duration = simpy.core.random.Random().uniform(1, 3)
    yield env.timeout(talk_duration)
    
    agent.end_talk()
    print(f"Call {call_id} ends at {env.now:.2f}, handled by Agent {agent.id}")
    # 释放坐席,放回Store
    yield agents_store.put(agent)

def run_simulation():
    env = simpy.Environment()
    # 创建2个坐席,存入Store和列表(方便后续统计)
    agents_store = simpy.Store(env, capacity=2)
    agents_list = []
    for i in range(2):
        agent = Agent(i+1, env)
        agents_list.append(agent)
        agents_store.put(agent)

    # 生成10个呼叫,每隔1单位时间到达一个
    for call_id in range(1, 11):
        env.process(call_process(env, call_id, agents_store, agents_list))
        yield env.timeout(1)

    # 运行仿真
    env.run()

    # 仿真结束后,输出每个坐席的统计数据
    print("\n=== Agent Statistics ===")
    for agent in agents_list:
        print(f"Agent {agent.id}:")
        print(f"  Total Talk Time: {agent.total_talk_time:.2f}")
        print(f"  Total Idle Time: {agent.total_idle_time:.2f}")
        print(f"  Utilization Rate: {(agent.total_talk_time / env.now)*100:.1f}%")

if __name__ == "__main__":
    run_simulation()

3. 关键逻辑说明

  • 每个Agent实例通过last_state_change记录状态切换的时间点,在start_talk和end_talk方法中自动计算并累加时长。
  • 用Store的get()和put()替代Resource的请求-释放,每次获取的是具体的Agent对象,能直接关联到呼叫的处理者。
  • 仿真结束后,直接遍历提前保存的agents_list,即可拿到每个坐席的统计数据。

替代方案:自定义Resource子类

如果你更倾向于用Resource的接口,也可以继承simpy.Resource,重写它的request和release方法,维护单个资源实例的状态,但实现复杂度比用Store高一些,适合需要兼容原有Resource使用习惯的场景。

内容的提问来源于stack exchange,提问作者mufassir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:43:17