Python + simPy: имя 'move' не определено - PullRequest
1 голос
/ 07 февраля 2012

Я делаю симуляцию, используя python 2.6 + Simpy, о системе метро.вот мой код:

import sys
import random
from math import*
from math import ceil, log
from random import*
from random import random, uniform, seed, expovariate
from SimPy import*
from SimPy.Simulation import*
from math import ceil, log

totalusuarios = 0
cantgrupos=0
def triangulo(inf,sup,moda):
        return random.triangular((inf),(sup),(moda))

def geometric(q):
    if q == 1.0:
        return 1
    U = 1.0 - random.random()
    G = int(ceil(log(U) / log(1.0 - q)))    
    return G

# A class that represents the process of generation of Groups (arrivals)
class Generador(Process):
    def generar(self, prob,interarribo, porc_torniq, porc_taq, porc_maq, min, max, moda, tsertaq, tsertor, tsermaq, loncal):                       
        global totalusuarios
        global cantgrupos
        totalusuarios=0
        cantgrupos=0
        while True:
            size_g = geometric (prob)
            if (now()>loncal):
                cantgrupos+=1
                totalusuarios=totalusuarios+size_g
            for j in range (size_g):
                c = Customer(name = "Usuario%02d"%(j,))
                q = uniform (0,1)
                ##******************the userr go to the tourniquet-------------------------
                if (q<=porc_torniq): #the userr go to the tourniquet
                    activate(c,c.go_torn(min=min, max=max, moda=moda, tsertor=tsertor)) #el cliente se desplaza     
                ##******************the user walks to buy ticket on the office-------------------------     
                if (q>porc_torniq and q<=porc_torniq+porc_taq): #user go to ticket station to buy
                    activate(c,c.go_tickets(min, max, moda, tsertaq=tsertaq, tsertor=tsertor))

                ##******************the user walks to buy ticket machines-------------------------  
                if (q>porc_torniq+porc_taq): #user go to machines
                    activate(c,c.go_machines(min= min, max=max, moda=moda, tsermaq=tsermaq, tsertor=tsertor))
            t = expovariate(interarribo) #time between groups of users
            yield hold, self, t 

class Customer(Process):

    def move(self, min, max ,moda):
        t1= triangulo(min_, max_, moda_)
        yield hold, self,t1

    def go_torn(self, min, max ,moda, tsertor):
        move(min, max, moda)
        yield request, self, torniquete
        t2= expovariate(tsertor)
        yield hold, self, t2
        yield release, self, torniquete

    def go_tickets(self, min, max ,moda, tsertaq, tsertor):
        move(min, max, moda)
        yield request, self, taquilla
        t3= expovariate(tsertaq)
        yield hold, self, t3
        yield release, self, taquilla
        go_torn(self, min, max,moda, tsertor)

    def go_machines(self, min, max ,moda, tsermaq, tsertor):
        move(min, max, moda)
        yield request, self, taquilla
        t4= expovariate(tsermaq)
        yield hold, self, t4
        yield release, self, taquilla
        go_torn(self, min, max ,moda, tsertor)

 ## Experiment data ------------------------------
MedGru= 2.0
p= 1/MedGru
TasGru= 5.0
LonCor = 24.0
CanCor= 30
CanTor = 2
CanTaq=2
CanMaq=2
PorTor= 60.0/100.0
PorTaq= 20.0/100.0
PorMaq=20.0/100.0
MinDes= 0.1
MaxDes= 0.2
LonCal= 2.0*60
ModaDes= 0.15
TSerTaq= 1/0.35
TSerTor=1/0.1
TSerMaq= 1/0.5

## Model/Experiment ------------------------------
torniquete = Resource(capacity=CanTor, monitored=True, monitorType= Monitor)    
maquina = Resource(capacity=CanMaq, monitored=False)    
taquilla =  Resource(capacity=CanTaq, monitored=False)    
def simulate_():
    generador = Generador(name="Grupo")
    initialize() #inicializa el reloj de simulacion
    activate(generador,generador.generar(p, TasGru,PorTor, PorTaq, PorMaq, 
                                                                MinDes,MaxDes ,ModaDes, TSerTaq, TSerTor, TSerMaq, LonCal ))
    simulate(until=60*LonCor)
for i in range(CanCor):
    simulate_()
    print "Groups:",cantgrupos, "Users:",totalusuarios

Код состоит из 4 функций в классе прокрутки пользователя, который использует треугольное распределение для имитации перемещения пассажира внутри станции, входа в любую зону (билетная касса,машин или турникетов) и из одного района в другой, имеет треугольный распределенный случайный член с параметрами min, mode и Max minutes.

Время, необходимое для обслуживания каждого пассажира в билетной кассе, является распределенным TSerTaq по завещаниюс половиной минут.Каждый пассажир, использующий билет торгового автомата, занят в течение случайного времени, экспоненциально распределенного со средними минутами TSerMaq.Пройдя через турникет, каждый пассажир берет случайное время, распределенное TSertor по экспоненте с полминуты.

Когда я пытаюсь запустить свой код, он сообщает мне следующее сообщение:

C:\Documents and Settings>python llegada.py
Traceback (most recent call last):
  File "llegada.py", line 111, in <module>
    simulate_()
  File "llegada.py", line 109, in simulate_
    simulate(until=60*LonCor)
  File "C:\Python26\SimPy\Globals.py", line 39, in simulate
    return sim.simulate(until = until)
  File "C:\Python26\SimPy\Simulation.py", line 689, in simulate
    a = nextev()
  File "C:\Python26\SimPy\Simulation.py", line 408, in _nextev
    resultTuple = nextEvent._nextpoint.next()
  File "llegada.py", line 65, in go_tickets
    move(min, max, moda)
NameError: global name 'move' is not defined

Я делаюне понимаю, что я делаю неправильно и почему я двигаюсь, указывает на то, что объект не определен.Некоторая помощь, пожалуйста

1 Ответ

2 голосов
/ 07 февраля 2012

Вы хотите self.move(), а не move(). move() будет функцией верхнего уровня в модуле, поэтому жалоба Python о том, что он не найден как глобальное имя; self.move() - это метод в вашем экземпляре класса, который у вас есть на самом деле.

Все остальные вызовы методов тоже должны начинаться с self..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...