Warum ist die rekursive Aussage falsch?
Frage
Dies ist eine Bank-Simulation, die mit einer einzigen Warteschlange berücksichtigen 20 verschiedene Portionslinien nehmen, arrive folgende Kunden exponentiell, und sie sind in einer Zeit serviert, die eine normale Wahrscheinlichkeitsverteilung mit Mittelwert 40 und die Standardabweichung folgt 20
Die Dinge waren funktioniert ganz gut, bis ich die negativen Werte durch die Normalverteilung mit dieser Methode gegeben auszuschließen entschieden:
def getNormal(self):
normal = normalvariate(40,20)
if (normal>=1):
return normal
else:
getNormal(self)
Am Verschrauben ich die rekursive Aufruf? Ich verstehe nicht, warum es nicht funktionieren würde. Ich habe den getNormal () -Methode geändert:
def getNormal(self):
normal = normalvariate(40,20)
while (normal <=1):
normal = normalvariate (40,20)
return normal
Aber ich bin neugierig, warum die frühere rekursiven Aussage gesprengt wird.
Dies ist der komplette Quellcode, falls Sie interessiert sind.
""" bank21: One counter with impatient customers """
from SimPy.SimulationTrace import *
from random import *
## Model components ------------------------
class Source(Process):
""" Source generates customers randomly """
def generate(self,number):
for i in range(number):
c = Customer(name = "Customer%02d"%(i,))
activate(c,c.visit(tiempoDeUso=15.0))
validateTime=now()
if validateTime<=600:
interval = getLambda(self)
t = expovariate(interval)
yield hold,self,t #esta es la rata de generación
else:
detenerGeneracion=999
yield hold,self,detenerGeneracion
class Customer(Process):
""" Customer arrives, is served and leaves """
def visit(self,tiempoDeUso=0):
arrive = now() # arrival time
print "%8.3f %s: Here I am "%(now(),self.name)
yield (request,self,counter),(hold,self,maxWaitTime)
wait = now()-arrive # waiting time
if self.acquired(counter):
print "%8.3f %s: Waited %6.3f"%(now(),self.name,wait)
tiempoDeUso=getNormal(self)
yield hold,self,tiempoDeUso
yield release,self,counter
print "%8.3f %s: Completed"%(now(),self.name)
else:
print "%8.3f %s: Waited %6.3f. I am off"%(now(),self.name,wait)
## Experiment data -------------------------
maxTime = 60*10.5 # minutes
maxWaitTime = 12.0 # minutes. maximum time to wait
## Model ----------------------------------
def model():
global counter
#seed(98989)
counter = Resource(name="Las maquinas",capacity=20)
initialize()
source = Source('Source')
firstArrival= expovariate(20.0/60.0) #chequear el expovariate
activate(source,
source.generate(number=99999),at=firstArrival)
simulate(until=maxTime)
def getNormal(self):
normal = normalvariate(40,20)
if (normal>=1):
return normal
else:
getNormal(self)
def getLambda (self):
actualTime=now()
if (actualTime <=60):
return 20.0/60.0
if (actualTime>60)and (actualTime<=120):
return 25.0/60.0
if (actualTime>120)and (actualTime<=180):
return 40.0/60.0
if (actualTime>180)and (actualTime<=240):
return 30.0/60.0
if (actualTime>240)and (actualTime<=300):
return 35.0/60.0
if (actualTime>300)and (actualTime<=360):
return 42.0/60.0
if (actualTime>360)and (actualTime<=420):
return 50.0/60.0
if (actualTime>420)and (actualTime<=480):
return 55.0/60.0
if (actualTime>480)and (actualTime<=540):
return 45.0/60.0
if (actualTime>540)and (actualTime<=600):
return 10.0/60.0
## Experiment ----------------------------------
model()
Lösung
Ich glaube, Sie wollen
return getnormal(self)
statt
getnormal(self)
Wenn die Funktion beendet, ohne eine return-Anweisung trifft, dann gibt es die besondere Wert None, die ein NoneType Objekt - ‚NoneType‘ das ist, warum klagt Python über ein Die Funktion abs () will eine Nummer, und sie weiß nicht, was mit einem nicht zu tun.
Auch Sie könnten Rekursion (und die Kosten für die Erstellung eines neuen Stapelrahmen) vermeiden, indem Sie mit
def getNormal(self):
normal = 0
while normal < 1:
normal = normalvariate(40,20)
return normal
Andere Tipps
Ich bin nicht ganz sicher, aber ich glaube, Sie müssen Ihre Methode, um die folgenden Änderungen:
def getNormal(self):
normal = normalvariate(40,20)
if (normal>=1):
return normal
else:
return getNormal(self)
Sie müssen haben:
return getNormal(self)
statt
getNormal(self)
obwohl Wirklich, es gibt keine Notwendigkeit für Rekursion:
def getNormal(self):
normal = 0
while normal < 1:
normal = normalvariate(40,20)
return normal