Simpy_ex3
http://start.sethanil.com/python-for-reseach/6
import SimPy.Simulation as simpy
from scipy.stats import erlang
class Source(simpy.Process):
""" Generate customers randomly"""
def generate(self, number, resource, pdf, pdf_counter):
for i in range(number):
c = Customer(name = "Customer%02d"%(i,))
simpy.activate(c, c.visit(pdf=pdf_counter, counter=resource))
# wait for the next customer
t = pdf.rvs()
yield simpy.hold, self, t
class Customer(simpy.Process):
def visit(self, pdf, counter):
time_in = simpy.now()
yield simpy.request, self, counter
wait_time = simpy.now() - time_in
tib = pdf.rvs()
yield simpy.hold, self, tib
yield simpy.release, self, counter
time_in_bank = simpy.now() - time_in
process(self.name, time_in, wait_time, time_in_bank)
def main(maxTime, maxNumber, arrival_interval, mean_serve_time, counters=1):
print('%i counters with mean arrival and service times %4.1f %4.1f minutes'
%(counters, arrival_interval, mean_serve_time))
k = simpy.Resource(capacity=counters, name="Counter", unitName="Clerk")
simpy.initialize()
s = Source('Source')
simpy.activate(s, s.generate(number=maxNumber,
pdf=erlang(1, scale=arrival_interval),
pdf_counter=erlang(2, scale = mean_serve_time/2.0),
resource=k), at=0.0)
simpy.simulate(until=maxTime)
def process(name, time_in, wait_time, time_in_bank):
print("%s %6.2f %5.2f %5.2f"%(name, time_in, wait_time, time_in_bank))
main(100, 5, 1.5, 2.0, 1)
def process(name, time_in, wait_time, time_in_bank):
wait_array.append(wait_time)
tib_array.append(time_in_bank)
import scipy as np
wait_array=[]
tib_array=[]
main(1000, 100, 1.5, 2.0, 2)
wt=np.array(wait_array)
tib=np.array(tib_array)
print(15*' '+'Mean Variance Median Max')
print('%s %6.2f %6.2f %6.2f %6.2f'%('Queue Time ',
wt.mean(), wt.var(), np.median(wait_array), wt.max()))
print('%s %6.2f %6.2f %6.2f %6.2f'%('Time in Bank',
tib.mean(), tib.var(), np.median(tib_array), tib.max()))
print('The percent of customers who did not have to wait %4.1f'
%(100 - 100.0*len(wt.nonzero()[0])/len(wt)))