глобальная ошибка имени в SimPy - PullRequest
0 голосов
/ 24 января 2012

Я пытаюсь смоделировать точки, движущиеся в 2D, которые могут погибнуть на каждом шагу.Я пытаюсь изучить 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

Ответы [ 2 ]

2 голосов
/ 24 января 2012

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

def Move(self):

с:

def Move(self, coord):

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

obj.Move((10, 20))

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

Из официальной документации : Если имя вообще не найдено, возникает исключение NameError.

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

NameError: global name 'coord' is not defined

в основном означает, что компилятор не знает, что такое 'координаты'.

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

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

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

потому что это то же самое, что и

obj = Point(circular,r1,r2)

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

# 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)

Я никогда не использовал SimPy, так что это всего лишь мое дикое (и не по теме) предположение.

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

0 голосов
/ 24 января 2012

Координата не определена в функции перемещения. На мой взгляд, это не аргумент. 1001 *

...