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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:27:03