99import simpy
1010import random
1111
12+ arrival_times = []
13+ departure_times = []
14+
1215
1316class Theater (object ):
1417 def __init__ (self , env , num_cashiers , num_servers , num_ushers ):
@@ -18,60 +21,60 @@ def __init__(self, env, num_cashiers, num_servers, num_ushers):
1821 self .usher = simpy .Resource (env , num_ushers )
1922
2023 def purchase_ticket (self , moviegoer ):
21- yield self .env .timeout (random .randint (1 , 2 ))
22-
23- def sell_food (self , moviegoer ):
24- yield self .env .timeout (random .randint (0 , 5 ))
24+ yield self .env .timeout (random .randint (1 , 3 ))
2525
2626 def check_ticket (self , moviegoer ):
2727 yield self .env .timeout (3 / 60 )
2828
29+ def sell_food (self , moviegoer ):
30+ yield self .env .timeout (random .randint (1 , 5 ))
31+
2932
30- def moviegoer (env , num , theater ):
33+ def go_to_movies (env , moviegoer , theater ):
3134 with theater .cashier .request () as request :
3235 yield request
33- yield env .process (theater .purchase_ticket (num ))
34-
35- with theater .server .request () as request :
36- yield request
37- yield env .process (theater .sell_food (num ))
36+ yield env .process (theater .purchase_ticket (moviegoer ))
3837
3938 with theater .usher .request () as request :
4039 yield request
41- yield env .process (theater .check_ticket (num ))
40+ yield env .process (theater .check_ticket (moviegoer ))
41+
42+ get_food = [0 , 1 ]
43+ if random .choice (get_food ) == 1 :
44+ with theater .server .request () as request :
45+ yield request
46+ yield env .process (theater .sell_food (moviegoer ))
4247
4348 departure_time = env .now
4449 departure_times .append (departure_time )
4550
4651
4752def run_theater (env , num_cashiers , num_servers , num_ushers ):
4853 theater = Theater (env , num_cashiers , num_servers , num_ushers )
49- interarrival = 0.20
5054
51- for num in range (3 ):
52- env .process (moviegoer (env , num , theater ))
55+ for moviegoer in range (3 ):
56+ env .process (go_to_movies (env , moviegoer , theater ))
5357 arrival_time = env .now
5458 arrival_times .append (arrival_time )
5559
5660 while True :
57- # Wait a bit before generating a new person
58- yield env .timeout (interarrival )
61+ yield env .timeout (0.20 ) # Wait a bit before generating a new person
5962
60- num += 1
61- env .process (moviegoer (env , num , theater )) # Generate the next person
63+ moviegoer += 1
64+ env .process (go_to_movies (env , moviegoer , theater ))
6265 arrival_time = env .now
6366 arrival_times .append (arrival_time )
6467
6568
6669def calculate_wait_time (arrival_times , departure_times ):
6770 total_wait = []
68- num_cleared = len (departure_times )
71+ total_seated = len (departure_times )
6972
70- for i in range (num_cleared ):
73+ for i in range (total_seated ):
7174 total_wait .append (departure_times [i ] - arrival_times [i ])
7275
7376 # Pretty print the results
74- average_wait = sum (total_wait ) / num_cleared
77+ average_wait = sum (total_wait ) / total_seated
7578 minutes , frac_minutes = divmod (average_wait , 1 )
7679 seconds = frac_minutes * 60
7780 return round (minutes ), round (seconds )
@@ -112,6 +115,4 @@ def main():
112115
113116
114117if __name__ == "__main__" :
115- arrival_times = []
116- departure_times = []
117118 main ()
0 commit comments