Как эффективно ограничить процессы, генерируемые SimPy в Python?

Я пытаюсь использовать SimPy для создания симулятора, который моделирует время, необходимое для того, чтобы заправочная станция исчерпала свои возможности. Это симулятор, который генерирует автомобиль, а затем ждет в очереди, пока не станет доступным топливный насос.

Поскольку меня не обязательно интересует, сколько времени требуется каждому отдельному автомобилю, чтобы получить доступ к топливу, а скорее то, сколько времени требуется при различных сценариях спроса, чтобы на станции закончилось топливо, я хотел бы ограничить мое моделирование таким образом, чтобы оно не t создавать автомобили, если насос не станет доступным.

Я не уверен, как заставить класс 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")

person nrober38    schedule 30.04.2021    source источник
comment
Может ли машина сгенерировать следующую машину, когда закончит заправку? Вам все равно нужно будет создать первоначальную партию автомобилей при запуске. Другой вариант — переписать класс ресурсов.   -  person Michael    schedule 01.05.2021


Ответы (1)


Я знаю, что это не совсем то, о чем вы спрашивали, но что, если вы проигнорируете автомобили, созданные, когда нет доступной помпы?

Если все в порядке, хорошо размещенный if gas_station.count() ‹ 8: сделает свою работу.

Проверьте код ниже.

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))
person Eduardo Pécora    schedule 19.05.2021