Simpy: заблокировать ресурс вне его обслуживания пользователя
Рассмотрим мойку, как описано в списке примеров Simpy. Теперь предположим, что каждый раз, когда автомобиль обслуживается, соответствующая моечная установка должна обслуживаться сама, прежде чем она сможет очистить следующий автомобиль. Между тем, обслуживаемая машина может уехать.
Как бы я лучше всего смоделировать выше? Мое текущее решение - иметь "машины-призраки" с высоким приоритетом, которые блокируют мойку во время регенерации. Я не нахожу это решение очень элегантным, и думаю, что есть лучший способ.
В приведенном ниже примере, который представляет собой плохую копию вышеупомянутого учебного пособия, обслуживаемый автомобиль не может покинуть насос в течение периода регенерации. Как я могу исправить это, чтобы имитировать предполагаемое поведение? Я думаю, что решение является простым; Я просто не вижу этого.
import random
import simpy
RANDOM_SEED = 42
NUM_MACHINES = 2 # Number of machines in the carwash
WASHTIME = 5 # Minutes it takes to clean a car
REGENTIME = 3
T_INTER = 7 # Create a car every ~7 minutes
SIM_TIME = 20 # Simulation time in minutes
class Carwash(object):
def __init__(self, env, num_machines, washtime):
self.env = env
self.machine = simpy.Resource(env, num_machines)
self.washtime = washtime
def wash(self, car):
yield self.env.timeout(WASHTIME)
print("Carwash removed %s's dirt at %.2f." % (car, env.now))
def regenerateUnit(self):
yield self.env.timeout(REGENTIME)
print("Carwash's pump regenerated for next user at %.2f." % (env.now))
def car(env, name, cw):
print('%s arrives at the carwash at %.2f.' % (name, env.now))
with cw.machine.request() as request:
yield request
print('%s enters the carwash at %.2f.' % (name, env.now))
yield env.process(cw.wash(name))
yield env.process(cw.regenerateUnit())
print('%s leaves the carwash at %.2f.' % (name, env.now))
def setup(env, num_machines, washtime, t_inter):
# Create the carwash
carwash = Carwash(env, num_machines, washtime)
# Create 4 initial cars
for i in range(4):
env.process(car(env, 'Car %d' % i, carwash))
# Create more cars while the simulation is running
while True:
yield env.timeout(random.randint(t_inter - 2, t_inter + 2))
i += 1
env.process(car(env, 'Car %d' % i, carwash))
# Setup and start the simulation
random.seed(RANDOM_SEED) # This helps reproducing the results
# Create an environment and start the setup process
env = simpy.Environment()
env.process(setup(env, NUM_MACHINES, WASHTIME, T_INTER))
# Execute!
env.run(until=SIM_TIME)
Заранее большое спасибо.
1 ответ
Вам нужно смоделировать объект, который использует ваш ресурс с очень высоким приоритетом, чтобы обычные объекты не могли его использовать. Так что ваша "машина-призрак" на самом деле не такая уж плохая идея.