【发布时间】:2012-02-08 15:46:12
【问题描述】:
我一直在看MIT公开课学习python,在第17讲随机游走模拟模型之后,我写了一段简单的代码,但是它不起作用,并且显示如下错误:“TypeError: 'drunk' 对象不可调用”。希望有人能帮我找出问题所在。
from math import*
import random,pylab
class location(object):
def __init__(self,x,y):
self.x=x
self.y=y
def move(self,xc,yc):
return location(self.x+float(xc),self.y+float(yc))
def getCoordinates(self):
return self.x,self.y
def getDistance(self,other):
ox,oy=other.getCoordinates()
x=fabs(other.x-self.x)
y=fabs(other.y-self.y)
return sqrt(x**2+y**2)
class compasspt(object):
possibles=('n','s','e','w')
def __init__(self,pt):
if pt in self.possibles:
self.pt=pt
else:
raise ValueError
def move(self,dist):
if self.pt=='n':return (0,dist)
elif self.pt=='s':return (0,-dist)
elif self.pt=='w':return (dist,0)
elif self.pt=='e':return (-dist,0)
else:raise ValueError
class field(object):
def __init__(self,drunk,location):
self.drunk=drunk
self.location=location
def move(self,cp,dist):
oldLocation=self.location
xc,yc=cp.move(dist) # shadowing
self.location=oldLocation.move(xc,yc)
def getLocation(self):
return self.location
def getDrunk(self):
return self.drunk
class drunk(object):
def __init__(self,name):
self.name=name
def move(self,field,time=1):
if field.getDrunk()!=self:
raise ValueError('the drunk is not in the field.')
for i in range(time):
pt=compasspt(random.choice(compasspt.possibles)) # random walk
field.move(pt,1) # shadowing
def performTrial(time,f):
start=f.getLocation()
distances=[0.0]
for t in range(1,time+1):
f.getDrunk().move(f)
newLocation=f.getLocation()
distance=newLocation.getDistance(start)
distances.append(distance)
return distances
drunk=drunk('Alexander')
for i in range(3):
f=field(drunk,location(0,0))
distances=performTrial(1000,f)
pylab.plot(distances)
pylab.title('Alexander\'s random walk')
pylab.xlabel('Time')
pylab.ylabel('Distance from Origin')
def performSimulation(time, numTrials):
distLists=[]
for trial in range(numTrials):
d = drunk('Drunk'+str(trial))
f=field(d,location(0,0))
distances=performTrial(time,f)
distLists.append(distances)
return distLists
def ansQuest(maxTime,numTrials):
means=[]
distLists=performSimulation(maxTime,numTrials)
for t in range(maxTime+1):
tot=0.0
for distL in distLists:
tot+=distL[t]
means.append(tot/len(distL))
pylab.figure()
pylab.plot(means)
pylab.ylabel('distance')
pylab.xlabel('time')
pylab.title('Average Distance vs. Time('+str(len(distLists))+'trials)')
ansQuest(1000,300)
pylab.show()
【问题讨论】: