如何在排队模拟中包含最后一个对象? SimPy中的Python

问题描述:

我reffering这个例子:https://simpy.readthedocs.io/en/latest/examples/carwash.html如何在排队模拟中包含最后一个对象? SimPy中的Python

如果你看到这个算法的输出,上车/对象到达不离开,因为模拟已经完成。我想修改算法,例如服务器在仿真时间内完成为系统中已有的所有汽车提供服务。我尝试了很多,但是我没有成功。

""" 
Carwash example. 

Covers: 

- Waiting for other processes 
- Resources: Resource 

Scenario: 
    A carwash has a limited number of washing machines and defines 
    a washing processes that takes some (random) time. 

    Car processes arrive at the carwash at a random time. If one washing 
    machine is available, they start the washing process and wait for it 
    to finish. If not, they wait until they an use one. 

""" 
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 
T_INTER = 7  # Create a car every ~7 minutes 
SIM_TIME = 20  # Simulation time in minutes 


class Carwash(object): 
    """A carwash has a limited number of machines (``NUM_MACHINES``) to 
    clean cars in parallel. 

    Cars have to request one of the machines. When they got one, they 
    can start the washing processes and wait for it to finish (which 
    takes ``washtime`` minutes). 

    """ 
    def __init__(self, env, num_machines, washtime): 
     self.env = env 
     self.machine = simpy.Resource(env, num_machines) 
     self.washtime = washtime 

    def wash(self, car): 
     """The washing processes. It takes a ``car`` processes and tries 
     to clean it.""" 
     yield self.env.timeout(WASHTIME) 
     print("Carwash removed %d%% of %s's dirt." % 
       (random.randint(50, 99), car)) 


def car(env, name, cw): 
    """The car process (each car has a ``name``) arrives at the carwash 
    (``cw``) and requests a cleaning machine. 

    It then starts the washing process, waits for it to finish and 
    leaves to never come back ... 

    """ 
    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)) 

     print('%s leaves the carwash at %.2f.' % (name, env.now)) 


def setup(env, num_machines, washtime, t_inter): 
    """Create a carwash, a number of initial cars and keep creating cars 
    approx. every ``t_inter`` minutes.""" 
    # 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 
print('Carwash') 

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) 
+0

我修改了“而真正的”,也就是在设置功能这样的:当真正和env.now>吨。但它不起作用。 –

+0

显示您的代码。 – pjs

+0

我做到了...... –

要处理这个问题,您需要检查Car进程数。只要它是积极的,不要停止模拟。

while True: 
    yield env.timeout(random.randint(t_inter - 2, t_inter + 2)) 
    i += 1 
    env.process(car(env, 'Car %d' % i, carwash)) 

尝试调整的同时,功能是你最后到达的车。你的模拟时间是当你的世界不再存在时,而不是你的汽车停止时。 例如,您可以为SIM_TIME创建一个setter,以便为系统中的每辆车提供所需的时间。而不是使用until=SIM_TIME,你可以使用env.exit()

env.exit() reference

env.run(until) reference