لماذا هذا العودية بيان خطأ ؟
سؤال
هذا هو بنك محاكاة يأخذ بعين الاعتبار 20 المختلفة التي تخدم خطوط مع واحد طابور العملاء تصل التالية الأسي معدل وهم خدم خلال الوقت الذي يلي العادي التوزيع الاحتمالي مع يعني 40 و الانحراف المعياري 20.
الأمور كانت تعمل على ما يرام حتى قررت استبعاد القيم السلبية التي قدمها التوزيع الطبيعي باستخدام هذه الطريقة:
def getNormal(self):
normal = normalvariate(40,20)
if (normal>=1):
return normal
else:
getNormal(self)
أنا الشد متكررة الاتصال ؟ أنا لا أفهم لماذا لم تنجح.لقد تغيرت getNormal (طريقة):
def getNormal(self):
normal = normalvariate(40,20)
while (normal <=1):
normal = normalvariate (40,20)
return normal
ولكن أنا الغريب لماذا السابقة العودية بيان يقبض عليه.
هذا هو رمز المصدر الكامل ، في حال كنت مهتما.
""" 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()
المحلول
أعتقد أنك تريد
return getnormal(self)
بدلا من
getnormal(self)
إذا كانت وظيفة مخارج دون ضرب بيان المقابل ، ثم تقوم بإرجاع قيمة خاصة لا شيء ، وهو NoneType وجوه لهذا الثعبان يشكو 'NoneType.' Abs() وظيفة يريد عدد و لا تعرف ماذا تفعل مع أي منها.
كما يمكن تجنب العودية (و تكلفة إنشاء إطار المكدس) باستخدام
def getNormal(self):
normal = 0
while normal < 1:
normal = normalvariate(40,20)
return normal
نصائح أخرى
أنا لست متأكدا تماما, ولكن أعتقد أن كنت بحاجة إلى تغيير الطريقة التالية:
def getNormal(self):
normal = normalvariate(40,20)
if (normal>=1):
return normal
else:
return getNormal(self)
تحتاج إلى أن يكون:
return getNormal(self)
بدلا من
getNormal(self)
حقا رغم ذلك ، هناك حاجة إلى الإعادة:
def getNormal(self):
normal = 0
while normal < 1:
normal = normalvariate(40,20)
return normal