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