2012-01-23 65 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

坐标不移动功能 定义你不给它作为参数,在我看来

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 

基本上意味着编译器不知道'coord'是什么。

注意:您不应该调用变量'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) 

我ne ver使用SimPy,所以这只是我的疯狂(和偏离主题)的猜测。

您似乎还没有在Move方法中定义host,但可能会导入from SimPy.SimulationTrace import *。使用from ... import *是一种不好的做法,因为防止他人确切地知道您从该模块导入的内容(我认为这是在SimPy教程中完成的,以便快速入门,但只应导入您所需的内容)。

+1

IMO,不仅是定义,而且对Move函数的调用也需要在这里进行修改。 –

+1

@AndreySobolev:谢谢,我现在明确表示了。 –

+0

@ Rik Poggi非常感谢。不幸的是,这并没有解决我的代码。是的,我希望移动功能可以更改每个步骤中每个点的坐标。我在xrange(N)中添加了“for i”:“因为我想让这个过程在不同的100个点上执行,而不仅仅是一个。 – Aya