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()
War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top