2012-02-06 2 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 개 기능으로 구성 매표소, 기계 또는 지혈대) 및 하나의 영역에서 다른 영역으로, 파라미터 min, mode 및 Max minutes를 갖는 삼각 분포 난수 용어를 갖는다.

표 사무실에서 각 승객을 섬기는 데 소요되는 시간은 TSerTaq에 기한 반 분으로 배분됩니다. 자동 판매기를 사용하는 승객 티켓은 평균 TSerMaq 분으로 기하 급수적으로 분산 된 임의의 시간 동안 사용됩니다. 개찰기를 통과하면 각 승객은 무작위로 시간을 분담하여 TSerTor를 기하 급수적으로 30 분 동안 배포합니다.

내 코드를 실행하려고하면, 그것은 나에게 다음과 같은 메시지가 알려줍니다

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.이 필요합니다.

관련 문제