toggle all code blocks

... """ bank11.py: Simulate customers arriving at random, using a Source, requesting service from two counters each with their own queue random servicetime. Uses a Monitor object to record waiting times """ from SimPy.Simulation import * from SimPy.SimPlot import * from random import Random class Bank11(SimPlot): def __init__(self,**p): SimPlot.__init__(self,**p) def NoInSystem(self,R): """ The number of customers in the resource R in waitQ and active Q""" return (len(R.waitQ)+len(R.activeQ)) def model(self): self.counterRV = Random(self.params["counterseed"]) self.sourceseed = self.params["sourceseed"] nrRuns=self.params["nrRuns"] self.lastLeave=0 self.noRunYet=True for runNr in range(nrRuns): self.noRunYet=False self.Nc = 2 self.counter = [Resource(name="Clerk0",monitored=False), Resource(name="Clerk1",monitored=False)] self.waitMonitor = Monitor(name='Waiting Times') self.waitMonitor.xlab='Time' self.waitMonitor.ylab='Waiting time' self.serviceMonitor = Monitor(name='Service Times') self.serviceMonitor.xlab='Time' self.serviceMonitor.ylab='wait+service' initialize() source = Source(self,seed = self.sourceseed*1000) activate(source,source.generate(self.params["numberCustomers"], self.params["interval"]),0.0) simulate(until=self.params['endtime']) self.lastLeave+=now() print "%s run(s) completed"%(nrRuns) print("Parameters:\n%s"%self.params) class Source(Process): """ Source generates customers randomly""" def __init__(self,modInst,seed=333): Process.__init__(self) self.modInst=modInst self.SEED = seed def generate(self,number,interval): rv = Random(self.SEED) for i in range(number): c = Customer(self.modInst,name = "Customer%02d"%(i,)) activate(c,c.visit(timeInBank=12.0)) t = rv.expovariate(1.0/interval) yield hold,self,t class Customer(Process): """ Customer arrives, is served and leaves """ def __init__(self,modInst,**p): Process.__init__(self,**p) self.modInst=modInst def visit(self,timeInBank=0): arrive=now() Qlength = [self.modInst.NoInSystem(self.modInst.counter[i]) for i in range(self.modInst.Nc)] for i in range(self.modInst.Nc): if Qlength[i] ==0 or Qlength[i]==min(Qlength): join =i ; break yield request,self,self.modInst.counter[join] wait=now()-arrive self.modInst.waitMonitor.observe(wait,t=now()) ##print "%7.4f %s: Waited %6.3f"%(now(),self.name,wait) tib = self.modInst.counterRV.expovariate(1.0/timeInBank) yield hold,self,tib yield release,self,self.modInst.counter[join] self.modInst.serviceMonitor.observe(now()-arrive,t=now()) root=Tk() plt=Bank11() plt.params={"endtime":2000, "sourceseed":1133, "counterseed":3939393, "numberCustomers":50, "interval":10.0, "trace":0, "nrRuns":1} plt.model() |
| .

    1 run(s) completed
    Parameters:
    {'counterseed': 3939393, 'trace': 0, 'nrRuns': 1, 'interval': 10.0, 'numberCustomers': 50, 'endtime': 2000, 'sourceseed': 1133}

... plt.plotLine(plt.waitMonitor,color='blue',width=2) plt.plotLine(plt.serviceMonitor,color='red',width=2) root.mainloop() |
| .