2012-02-06 79 views
1

我正在使用python 2.6 + Simpy進行關於地鐵系統的模擬。這裏是我的代碼:Python + simPy:name'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 

代碼由User類滾動,它採用了三角形分佈,模擬車站內乘客的位移,入口的任何區域(4個功能售票處,機器或止血帶)以及從一個區域到另一個區域,具有參數min,mode和Max分鐘的三角分佈隨機項。

服務售票處每位乘客所用的時間將是一個分佈式的 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.