【发布时间】: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