2012-01-23 4 views
0

Я пытаюсь имитировать точки, перемещающиеся в 2D, которые имеют вероятность смерти на каждом шагу. Я пытаюсь изучить SimPy, и это мой первый опыт программирования. Почему я получаю эту ошибку? и как это исправить? Спасибоошибка глобального имени в SimPy

from SimPy.SimulationTrace import * 
import random as RD 
import scipy as SP 
import math 
import matplotlib.pyplot as plt 

N=100 
r1=0.02 
r2=0.03 
maxTime=100 


class Point(Process): 
    def __init__(self,coord,rate1,rate2): 
      Process.__init__(self) 
      self.x=coord[0] 
      self.y=coord[1] 
      self.rate1=r1 
      self.rate2=r2 

    def Move(self): 
     RD.uniform(coord[0]-0.1,coord[0]+0.1) 
     RD.uniform(coord[1]-0.1,coord[1]+0.1) 
     yield hold,self,0.5 
     self.x=coord[0] 
     self.y=coord[1] 
     yield hold,self,0.5 

    # reactivate(self,now()) 

    def die(self): 
     if RD.random() < self.rate2: 
      N-=1 
      m.observe(N) 
      yield cancel,self 


initialize() 
m=Monitor() 
circular=[RD.uniform(0,100),RD.uniform(0,100)] 
for object in xrange(N): 
    object=Point(circular,r1,r2) 
activate(object,object.Move()) 
simulate(until=maxTime) 
activate(object,object.die()) 
simulate(until=maxTime) 

h=m.histogram(low=0.0,high=100,nbins=100) 
g=m.yseries() 
plt.plot(g) 
plt.show() 

Ошибка

Traceback (most recent call last): 
    File "C:\Users\dell\Desktop\ask.py", line 46, in <module> 
    simulate(until=maxTime) 
    File "C:\Python27\lib\site-packages\SimPy\Globals.py", line 61, in simulate 
    return sim.simulate(until = until) 
    File "C:\Python27\lib\site-packages\SimPy\SimulationTrace.py", line 96, in simulate 
    return Simulation.simulate(self, until) 
File "C:\Python27\lib\site-packages\SimPy\Simulation.py", line 581, in simulate 
    step() 
    File "C:\Python27\lib\site-packages\SimPy\Simulation.py", line 525, in step 
    resultTuple = proc._nextpoint.next() 
    File "C:\Users\dell\Desktop\ask.py", line 23, in Move 
    RD.uniform(coord[0]-0.3,coord[0]+0.3) 
NameError: global name 'coord' is not defined 

ответ

0

Coord не определены в функции перемещения Вы не дают его в качестве аргумента, на мой взгляд

2

Я думаю, вам нужно заменить

def Move(self): 

с:

def Move(self, coord): 

И после того, как вызов этой функции передавая новые координаты в качестве аргумента то вроде:

obj.Move((10, 20)) 

Где в примере (10, 20) являются новые координаты объекта (я не уверен, что это то, что делает ваш код , но я предполагаю, что это должно быть естественное поведение функции с именем «Move»).

От official documentation: Когда имя не встречается вообще, возникает исключение NameError.

Имена в python (как объяснено выше в Code Like a Pythonista: Idiomatic Python) - это то, что на других языках вы называете переменными. Итак:

NameError: global name 'coord' is not defined 

в основном означает, что компилятор не знает, что такое «координация».

Примечание: Вы не должны называть переменную «объект» затенения стро-в [object] [3], что является базовым классом для каждого класса.

Кроме того, я не вижу смысла делать что-то вроде:

for i in xrange(N): # Notice that I also used a different name here: i 
    obj = Point(circular,r1,r2) 

beacuse так же, как:

obj = Point(circular,r1,r2) 

Update: Может быть, что вы пытаетесь сделать что-то например:

# maybe you want to put this inside a function so every time you get 
# different random numbers 
def circular(): 
    return RD.uniform(0,100), RD.uniform(0,100) 

points = [] 
for i in xrange(N): 
    p = Point(circular(), r1, r2) 
    points.append(p) 
    activate(p, p.Move(circular()) 

simulate(until=maxTime) 

for p in points: 
    activate(p, p.die()) 

simulate(until=maxTime) 

I ne ver использовали SimPy, так что это всего лишь моя дикая (и вне темы) догадка.

Также кажется, что у вас есть host не определено в методе Move но может быть импортирована с from SimPy.SimulationTrace import *. Использование from ... import * является плохой практикой, потому что не позволяет другим точно знать, что вы импортируете из этого модуля (я полагаю, что это было сделано в учебнике SimPy для быстрого запуска, но вы должны импортировать только то, что вам нужно).

+1

IMO, здесь также необходимо изменить не только определение, но и вызов функции Move. –

+1

@ Андре Соболев: Спасибо, я сделал это прямо сейчас. –

+0

@ Rik Poggi Большое спасибо. К сожалению, это не исправляет мой код. Да, я хочу, чтобы функция Move изменяла координаты каждой точки на каждом шаге. Я добавил «для i в xrange (N):« потому что я хочу, чтобы процесс выполнялся по разным 100 пунктам, а не только по одному. – Aya

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