转 python trace walk DEMO

时间:2021-07-14 09:28:36

https://blog.csdn.net/steadfast123/article/details/46965125

#quote from 'introduction to computation and programming
#using Python, revised, MIT press'
import random
import pylab def stdDev(X):
mean = sum(X)/len(X)
tot = 0.0
for x in X:
tot += (x-mean)**2
return (tot/len(X))**0.5 def CV(X):
mean = sum(X)/len(X)
return stdDev(X)/mean class Location(object): def __init__(self, x, y):
"""x and y are floats"""
self.x = x
self.y = y def move(self, deltaX, deltaY):
"""deltaX and deltaY are floats"""
return Location(self.x + deltaX, self.y + deltaY) def getX(self):
return self.x def getY(self):
return self.y def distFrom(self, other):
ox = other.x
oy = other.y
xDist = self.x - ox
yDist = self.y - oy
return (xDist**2 + yDist**2)**0.5 def __str__(self):
return '<' + str(self.x) + ', ' + str(self.y) + '>' class Field(object): def __init__(self):
self.drunks = {} def addDrunk(self, drunk, loc):
if drunk in self.drunks:
raise ValueError('Duplicate drunk')
else:
self.drunks[drunk] = loc def moveDrunk(self, drunk):
if drunk not in self.drunks:
raise ValueError('Drunk not in field')
xDist, yDist = drunk.takeStep()
currentLocation = self.drunks[drunk]
#use move method of Location to get new location
self.drunks[drunk] = currentLocation.move(xDist, yDist) def getLoc(self, drunk):
if drunk not in self.drunks:
raise ValueError('Drunk not in field')
return self.drunks[drunk] class Drunk(object): def __init__(self, name = None):
"""Assumes name is a str"""
self.name = name def __str__(self):
if self != None:
return self.name
return 'Anonymous' class UsualDrunk(Drunk):
def takeStep(self):
stepChoices = [(0.0, 1.0), (0.0, -1.0), (1.0, 0.0), (-1.0, 0.0)]
return random.choice(stepChoices) class ColdDrunk(Drunk):
def takeStep(self):
stepChoices = [(0.0, 1.0), (0.0, -2.0), (1.0, 0.0), (-1.0, 0.0)]
return random.choice(stepChoices) class EWDrunk(Drunk):
def takeStep(self):
stepChoices = [(1.0, 0.0), (-1.0, 0.0)]
return random.choice(stepChoices) class styleIterator(object):
def __init__(self, styles):
self.index = 0
self.styles = styles def nextStyle(self):
result = self.styles[self.index]
if self.index == len(self.styles) - 1:
self.index = 0
else:
self.index += 1
return result def traceWalk(drunkKinds, numSteps):
styleChoices = styleIterator(('b+', 'r^', 'mo'))
f = Field()
for dClass in drunkKinds:
d = dClass()
f.addDrunk(d, Location(0, 0))
locs = []
for s in range(numSteps):
f.moveDrunk(d)
locs.append(f.getLoc(d))
xVals = []
yVals = []
for l in locs:
xVals.append(l.getX())
yVals.append(l.getY())
curStyle = styleChoices.nextStyle()
pylab.plot(xVals, yVals, curStyle,
label = dClass.__name__)
pylab.title('Spots Visited on Walk ('
+ str(numSteps) + ' steps)')
pylab.xlabel('Steps East/West of Origin')
pylab.ylabel('Steps North/South of Origin')
pylab.legend(loc = 'best') traceWalk((UsualDrunk, ColdDrunk, EWDrunk), 200)
pylab.show()