-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLec17.py
More file actions
98 lines (87 loc) · 2.64 KB
/
Copy pathLec17.py
File metadata and controls
98 lines (87 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import math, random, pylab
class Location(object):
def __init__(self,x,y):
self.x=float(x)
self.y=float(y)
def move(self,xc,yc):
return Location(self.x+float(xc),self.y+float(yc))
def getCoords(self):
return self.x,self.y
def getDist(self,other):
ox,oy=other.getCoords()
xDist=self.x-ox
yDist=self.y-oy
return math.sqrt(xDist**2+yDist**2)
class CompassPt(object):
possibles=('N','S','E','W')
def __init__(self,pt):
if pt in self.possibles: self.pt=pt
else: raise ValueError('in CompassPt.__init__')
def move(self,dist):
if self.pt=='N': return (0,dist)
elif self.pt=='S': return (0,-dist)
elif self.pt=='E': return (dist,0)
elif self.pt=='W': return (-dist,0)
else: raise ValueError('in CompassPt.move')
class Field(object):
def __init__(self,drunk,loc):
self.drunk=drunk
self.loc=loc
def move(self,cp,dist):
oldLoc=self.loc
xc,yc=cp.move(dist)
self.loc=oldLoc.move(xc,yc)
def getLoc(self):
return self.loc
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('Drunk.move called with drunk not in field')
for i in range(time):
pt=CompassPt(random.choice(CompassPt.possibles))
field.move(pt,1)
def performTrial(time,f):
start=f.getLoc()
distances=[0.0]
for t in range(1,time+1):
f.getDrunk().move(f)
newLoc=f.getLoc()
distance=newLoc.getDist(start)
distances.append(distance)
return distances #list
def firstTest():
drunk=Drunk('Homer Simpson')
for i in range(3):
f=Field(drunk,Location(0,0))
distances=performTrial(500,f)
pylab.plot(distances)
pylab.title('Homer\'s Random Walk')
pylab.xlabel('time')
pylab.ylabel('Distance from Origin')
pylab.show()
def performSim(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 #list of lists
def ansQuest(maxTime,numTrials):
means=[]
distLists=performSim(maxTime,numTrials)
for t in range(maxTime+1):
tot=0.0
for distL in distLists:
tot+=distL[t]
means.append(tot/len(distLists))
pylab.figure()
pylab.plot(means)
pylab.ylabel('distance')
pylab.xlabel('time')
pylab.title('')
pylab.show()