Я пытаюсь использовать 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")