问题描述
我正在尝试使用 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,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")
解决方法
我知道这不是您要问的,但是如果您忽略没有可用泵时生成的汽车怎么办?
如果没问题,一个合适的“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))