Skip to content

Commit 4f4a46b

Browse files
authored
Create simulate.py
1 parent 7c1684d commit 4f4a46b

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

simpy/simulate.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import simpy
2+
import random
3+
4+
5+
class Theater(object):
6+
def __init__(self, env, num_cashiers, num_servers, num_ushers):
7+
self.env = env
8+
self.cashier = simpy.Resource(env, num_cashiers)
9+
self.server = simpy.Resource(env, num_servers)
10+
self.usher = simpy.Resource(env, num_ushers)
11+
12+
def purchase_ticket(self, moviegoer):
13+
yield self.env.timeout(random.randint(1, 2))
14+
15+
def sell_food(self, moviegoer):
16+
yield self.env.timeout(random.randint(0, 5))
17+
18+
def check_ticket(self, moviegoer):
19+
yield self.env.timeout(3 / 60)
20+
21+
22+
def moviegoer(env, num, theater):
23+
with theater.cashier.request() as request:
24+
yield request
25+
yield env.process(theater.purchase_ticket(num))
26+
27+
with theater.server.request() as request:
28+
yield request
29+
yield env.process(theater.sell_food(num))
30+
31+
with theater.usher.request() as request:
32+
yield request
33+
yield env.process(theater.check_ticket(num))
34+
35+
departure_time = env.now
36+
departure_times.append(departure_time)
37+
38+
39+
def run_theater(env, num_cashiers, num_servers, num_ushers):
40+
theater = Theater(env, num_cashiers, num_servers, num_ushers)
41+
interarrival = 0.20
42+
43+
for num in range(3):
44+
env.process(moviegoer(env, num, theater))
45+
arrival_time = env.now
46+
arrival_times.append(arrival_time)
47+
48+
while True:
49+
# Wait a bit before generating a new person
50+
yield env.timeout(interarrival)
51+
52+
num += 1
53+
env.process(moviegoer(env, num, theater)) # Generate the next person
54+
arrival_time = env.now
55+
arrival_times.append(arrival_time)
56+
57+
58+
def calculate_wait_time(arrival_times, departure_times):
59+
total_wait = []
60+
num_cleared = len(departure_times)
61+
62+
for i in range(num_cleared):
63+
total_wait.append(departure_times[i] - arrival_times[i])
64+
65+
# Pretty print the results
66+
average_wait = sum(total_wait) / num_cleared
67+
minutes, frac_minutes = divmod(average_wait, 1)
68+
seconds = frac_minutes * 60
69+
return round(minutes), round(seconds)
70+
71+
72+
def get_user_input():
73+
num_cashiers = input("Input # of cashiers working: ")
74+
num_servers = input("Input # of servers working: ")
75+
num_ushers = input("Input # of ushers working: ")
76+
params = [num_cashiers, num_servers, num_ushers]
77+
try:
78+
params = [int(x) for x in params]
79+
except:
80+
print("Could not parse input. The simulation will use default values.")
81+
params = [1, 1, 1]
82+
return params
83+
84+
85+
def main():
86+
# Setup
87+
random.seed(42)
88+
num_cashiers, num_servers, num_ushers = get_user_input()
89+
90+
# Run the simulation
91+
env = simpy.Environment()
92+
env.process(run_theater(env, num_cashiers, num_servers, num_ushers))
93+
env.run(until=90)
94+
95+
# View the results
96+
mins, secs = calculate_wait_time(arrival_times, departure_times)
97+
print(f"The average wait time is {mins} minutes and {secs} seconds.")
98+
99+
100+
if __name__ == "__main__":
101+
arrival_times = []
102+
departure_times = []
103+
main()

0 commit comments

Comments
 (0)