【问题标题】:How to efficiently limit processes generated by SimPy in Python?如何有效限制 Python 中 SimPy 生成的进程?
【发布时间】:2021-07-24 02:09:18
【问题描述】:

我正在尝试使用 SimPy 创建一个模拟器,该模拟器模拟加油站耗尽容量所需的时间。它是一个模拟器,可以生成汽车,然后排队等待燃油泵可用。

因为我不一定对每辆汽车需要多长时间才能获得燃料感兴趣,而是对加油站在不同需求情景下耗尽燃料需要多长时间感兴趣,所以我想限制我的模拟,以便除非有泵,否则它不会制造汽车。

我不确定如何让 Resource 类将可用性传达给汽车生成器,因此我目前只是按固定间隔生成汽车,但我检查了队列长度以确保在汽车生成之前不会太久请求资源。

如何使汽车生成器仅在资源可用时才创建汽车?

到目前为止,这是我的代码:

import simpy
import random

def car(sim_env: simpy.Environment, station: simpy.Resource, pump: simpy.Container):
    # Checks queue, if it is long, don't create car
    if len(station.queue) < station.capacity + 5:
        # Creates random fuel needs for car, determine how much fuel is dispensed per unit of time
        fuel_needed = random.uniform(20, 30)
        fuel_rate = 10
        # Try to go to a fuel pump
        with station.request() as req:
            yield req
            # Get fuel available, if no fuel available, raise error
            if pump.level >= fuel_needed:
                yield pump.get(fuel_needed)
                car_time = (fuel_needed / fuel_rate)
                yield sim_env.timeout(car_time)
            elif fuel_needed > pump.level > 0:
                car_time = (pump.level / fuel_rate)
                yield pump.get(pump.level)
                yield sim_env.timeout(car_time)
            else:
                print('No fuel at station, exiting simulation')
                raise ValueError

def car_generator(sim_env: simpy.Environment, station: simpy.Resource, pump: simpy.Container,
                  generation_interval: tuple):
    low_interval = generation_interval[0]
    high_interval = generation_interval[1]
    while True:
        # Wait for car to arrive using car generation interval
        yield sim_env.timeout(random.uniform(low_interval, high_interval))
        sim_env.process(car(sim_env, station, pump))

if __name__ == '__main__':
    # Create simulation environment
    env = simpy.Environment()
    # Create a station with 8 pumps
    gas_station = simpy.Resource(env, 8)
    # Specify the fuel capacity of the station to be 20000
    fuel_pump = simpy.Container(env, 20000, init=20000)
    env.process(
        car_generator(env, gas_station, fuel_pump, (1, 5)))
    # Run simulation
    try:
        env.run()
    except ValueError:
        print("Station out of gas")

【问题讨论】:

  • 汽车加完油后还能生成下一辆车吗?您仍然需要在启动时创建您的第一批汽车。您的另一个选择是重写资源类

标签: python asynchronous simulation simpy


【解决方案1】:

我知道你问的不是这个,但是如果你忽略没有泵可用时产生的汽车怎么办?

如果没问题,一个合适的“if gas_station.count()

检查下面的代码。

def car_generator(sim_env: simpy.Environment, station: simpy.Resource, pump: simpy.Container,
                  generation_interval: tuple):
    low_interval = generation_interval[0]
    high_interval = generation_interval[1]
    while True:
        # Wait for car to arrive using car generation interval
        if gas_station.count() < 8:
           yield sim_env.timeout(random.uniform(low_interval, high_interval))
           sim_env.process(car(sim_env, station, pump))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 2014-08-29
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2010-10-23
    相关资源
    最近更新 更多