如何在Simpy中设置仿真队列的初始长度?
初始队列设置实现方案
你可以通过预先生成指定数量的初始充电请求,再启动常规车辆生成逻辑的方式实现需求,修改后的代码如下:
import simpy # 配置参数 NUM_OF_MACHINES = 1 INITIAL_QUEUE = 200 # 初始排队车辆数 env = simpy.Environment() bcs = simpy.Resource(env, capacity=NUM_OF_MACHINES) def charge_car(env, car_id, resource): """单车辆充电流程""" with resource.request() as req: yield req print(f'Car {car_id} starting to charge at {env.now}') yield env.timeout(90) print(f'Car {car_id} ending charge at {env.now}') print(f'Queue size: {len(bcs.queue)}') def generate_regular_cars(env, resource, start_id): """持续生成后续到达的车辆""" car_id = start_id while True: env.process(charge_car(env, car_id, resource)) car_id += 1 # 可根据实际业务调整车辆到达间隔,当前设为0和原逻辑一致连续生成 yield env.timeout(0) # 初始化初始队列的200辆车 for car_id in range(1, INITIAL_QUEUE + 1): env.process(charge_car(env, car_id, bcs)) # 启动后续车辆生成进程,车辆ID从201开始计数 env.process(generate_regular_cars(env, bcs, INITIAL_QUEUE + 1)) env.run(until=300)
效果说明
- 仿真启动时200辆车会同时发起充电请求,1辆车立刻开始充电,剩余199辆进入队列,此时
len(bcs.queue)返回值为199,符合初始队列设置需求 - 单车辆充电耗时90秒,300秒仿真时长内仅能完成3轮充电,队列长度会逐次减少1,调大
run()的until参数即可看到队列逐步清空的过程 - 如果不需要后续持续生成车辆,删除
generate_regular_cars相关代码即可,仅保留初始200辆车的初始化逻辑
注意:你原有代码存在逻辑错误,
request()调用写在了while循环外部,整个进程只会申请一次资源,后续所有车辆都复用同一个资源授权,所以永远不会出现排队,队列长度一直为0。上述修改将单车辆流程拆分为独立函数,每个车辆单独发起资源请求,才能正确生成队列。
内容的提问来源于stack exchange,提问作者shirin elahi
相关产品推荐
相关产品推荐

