import numpy as np
import simpy
def run(extra_machine=False, buffer_size=5, hours=8, seed=1):
r = np.random.default_rng(seed)
env = simpy.Environment()
a = simpy.Resource(env, 1)
b = simpy.Resource(env, 2 if extra_machine else 1)
buffer = simpy.Container(env, capacity=buffer_size)
done = [0]
def station_a():
while True:
with a.request() as req:
yield req
yield env.timeout(r.exponential(1.0)) # A 站平均 1 分鐘
yield buffer.put(1)
def station_b():
while True:
yield buffer.get(1)
with b.request() as req:
yield req
yield env.timeout(r.exponential(1.5)) # B 站平均 1.5 分鐘
done[0] += 1
env.process(station_a())
for _ in range(2 if extra_machine else 1):
env.process(station_b())
env.run(until=hours * 60)
return done[0]
now = np.mean([run(seed=s) for s in range(30)])
more = np.mean([run(extra_machine=True, seed=s) for s in range(30)])
big = np.mean([run(buffer_size=20, seed=s) for s in range(30)])
print(f"現況 {now:.0f},B 站加一台 {more:.0f},緩衝區加大 {big:.0f}")