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

==================================