سؤال

هذا هو بنك محاكاة يأخذ بعين الاعتبار 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top