Bank_examples
#!/usr/bin/env python
""" bank01: The single non-random Customer"""
from __future__ import generators
from SimPy.Simulation import *
class Customer(Process):
""" Customer arrives, looks around and leaves """
def visit(self,timeInBank):
print "%7.4f %s: Here I am"%(now(),self.name)
yield hold,self,timeInBank
print "%7.4f %s: I must leave"%(now(),self.name)
def model():
initialize()
c=Customer(name="Klaus")
activate(c,c.visit(timeInBank=10.0),delay=5.0)
simulate(until=100.0)
model()
============================
5.0000 Klaus: Here I am
15.0000 Klaus: I must leave
#!/usr/bin/env python
""" bank03: Many non-random Customers """
from SimPy.Simulation import *
class Source(Process):
""" Source generates customers regularly"""
def generate(self,number,interval):
for i in range(number):
c = Customer(name = "Customer%02d"%(i,))
activate(c,c.visit(timeInBank=12.0))
yield hold,self,interval
class Customer(Process):
""" Customer arrives, looks round and leaves """
def visit(self,timeInBank=0):
print "%7.4f %s: Here I am"%(now(),self.name)
yield hold,self,timeInBank
print "%7.4f %s: I must leave"%(now(),self.name)
def model():
initialize()
source=Source()
activate(source,source.generate(5,10.0),0.0)
simulate(until=400.0)
model()
==============================
0.0000 Customer00: Here I am
10.0000 Customer01: Here I am
12.0000 Customer00: I must leave
20.0000 Customer02: Here I am
22.0000 Customer01: I must leave
30.0000 Customer03: Here I am
32.0000 Customer02: I must leave
40.0000 Customer04: Here I am
42.0000 Customer03: I must leave
52.0000 Customer04: I must leave
#!/usr/bin/env python
""" bank04: Simulate a single customer. random time in system"""
from __future__ import generators
from SimPy.Simulation import *
from random import Random, expovariate
class Customer(Process):
""" Customer arrives in the bank, looks around for
a random time and then leaves
"""
def __init__(self,name):
Process.__init__(self)
self.name = name
def visit(self,rv,timeInBank=0):
print "%7.4f %s: Here I am"%(now(),self.name)
t = rv.expovariate(1.0/timeInBank)
yield hold,self,t
print "%7.4f %s: I must leave"%(now(),self.name)
def model():
rv = Random(1133)
initialize()
c=Customer(name="Klaus")
activate(c,c.visit(rv,timeInBank=10.0),delay=5.0)
simulate(until=100.0)
model()
=============================
5.0000 Klaus: Here I am
10.2333 Klaus: I must leave
#!/usr/bin/env python
""" bank06: Many Random Customers """
from SimPy.Simulation import *
from random import expovariate,seed
class Source(Process):
""" Source generates customers randomly"""
def generate(self,number,interval):
for i in range(number):
c = Customer(name = "Customer%02d"%(i,))
activate(c,c.visit(timeInBank=12.0))
t = expovariate(1.0/interval)
yield hold,self,t
class Customer(Process):
""" Customer arrives, looks round and leaves """
def visit(self,timeInBank=0):
print "%7.4f %s: Here I am"%(now(),self.name)
yield hold,self,timeInBank
print "%7.4f %s: I must leave"%(now(),self.name)
def model():
seed(99999)
initialize()
s=Source(name='Source')
activate(s,s.generate(5,10.0),0.0)
simulate(until=400.0)
model()
=========================
0.0000 Customer00: Here I am
1.2839 Customer01: Here I am
4.9842 Customer02: Here I am
12.0000 Customer00: I must leave
13.2839 Customer01: I must leave
16.9842 Customer02: I must leave
35.5432 Customer03: Here I am
47.5432 Customer03: I must leave
48.9918 Customer04: Here I am
60.9918 Customer04: I must leave
#!/usr/bin/env python
""" bank07: One Counter"""
from SimPy.Simulation import *
from random import expovariate, seed
class Source(Process):
""" Source generates customers randomly"""
def generate(self,number,interval):
for i in range(number):
c = Customer(name = "Customer%02d"%(i,))
activate(c,c.visit(timeInBank=12.0))
t = expovariate(1.0/interval)
yield hold,self,t
class Customer(Process):
""" Customer arrives, is served and leaves """
def visit(self,timeInBank=0):
arrive=now()
print "%7.4f %s: Here I am "%(now(),self.name)
yield request,self,counter
wait=now()-arrive
print "%7.4f %s: Waited %6.3f"%(now(),self.name,wait)
yield hold,self,timeInBank
yield release,self,counter
print "%7.4f %s: Finished "%(now(),self.name)
def model():
global counter
seed(99999)
counter = Resource(name="Karen") # Clerk
initialize()
source=Source('Source')
activate(source,source.generate(5,10.0),0.0)
simulate(until=400.0)
model()
===================================
0.0000 Customer00: Here I am
0.0000 Customer00: Waited 0.000
1.2839 Customer01: Here I am
4.9842 Customer02: Here I am
12.0000 Customer00: Finished
12.0000 Customer01: Waited 10.716
24.0000 Customer01: Finished
24.0000 Customer02: Waited 19.016
35.5432 Customer03: Here I am
36.0000 Customer02: Finished
36.0000 Customer03: Waited 0.457
48.0000 Customer03: Finished
48.9918 Customer04: Here I am
48.9918 Customer04: Waited 0.000
60.9918 Customer04: Finished
#!/usr/bin/env python
"""bank16: Plotting from Resource Monitors"""
from SimPy.Simulation import *
from SimPy.SimPlot import *
from random import *
class Source(Process):
""" Source generates customers randomly"""
def generate(self,number,rate):
for i in range(number):
c = Customer(name = "Customer%02d"%(i,))
activate(c,c.visit(timeInBank=12.0))
yield hold,self,expovariate(rate)
class Customer(Process):
""" Customer arrives, is served and leaves """
def visit(self,timeInBank):
arrive=now()
#print "%8.4f %s: Arrived "%(now(),self.name)
yield request,self,counter
#print "%8.4f %s: Got counter "%(now(),self.name)
tib = expovariate(1.0/timeInBank)
yield hold,self,tib
yield release,self,counter
#print "%8.4f %s: Finished "%(now(),self.name)
counter = Resource(1,name="Clerk",monitored=True)
def model(SEED=393939):
seed(SEED)
initialize()
source = Source()
activate(source,source.generate(number=20,rate=0.1),0.0)
simulate(until=400.0)
model()
plt=SimPlot()
plt.plotStep(counter.waitMon,
color="red",width=2)
plt.mainloop()
===========================
"""bank17: Plotting a Histogram of Monitor results"""
from SimPy.Simulation import *
from SimPy.SimPlot import *
from random import *
class Source(Process):
""" Source generates customers randomly"""
def generate(self,number,rate):
for i in range(number):
c = Customer(name = "Customer%02d"%(i,))
activate(c,c.visit(timeInBank=12.0))
yield hold,self,expovariate(rate)
class Customer(Process):
""" Customer arrives, is served and leaves """
def visit(self,timeInBank):
arrive=now()
#print "%8.4f %s: Arrived "%(now(),self.name)
yield request,self,counter
#print "%8.4f %s: Got counter "%(now(),self.name)
tib = expovariate(1.0/timeInBank)
yield hold,self,tib
yield release,self,counter
#print "%8.4f %s: Finished "%(now(),self.name)
t = now()-arrive
Mon.observe(t)
counter = Resource(1,name="Clerk")
Mon=Monitor('Time in the Bank')
N = 0
def model(SEED=393939):
seed(SEED)
initialize()
source = Source()
activate(source,source.generate(number=20,rate=0.1),0.0)
simulate(until=400.0)
model()
Histo = Mon.histogram(low=0.0,high=200.0,nbins=20)
plt=SimPlot()
plt.plotHistogram(Histo,xlab='Time (min)',
title="Time in the Bank",
color="red",width=2)
plt.mainloop()
==================================