2012-02-06 4 views
1

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

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-х функций в классе User свитке, который использует треугольное распределение для имитации перемещения пассажира внутри станции, на входе в любую области (билетная касса, машина или турникеты) и из одной области в другую имеет треугольный распределенный случайный период с параметрами 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 

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

ответ

2

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

Все ваши вызовы других методов также нуждаются в self..

Смежные вопросы