1
+ {
2
+ "metadata" : {
3
+ "name" : " " ,
4
+ "signature" : " sha256:fd533dbc93809e86c8794d97bdf6e20dbce954a6503e662c792d114cbca82522"
5
+ },
6
+ "nbformat" : 3 ,
7
+ "nbformat_minor" : 0 ,
8
+ "worksheets" : [
9
+ {
10
+ "cells" : [
11
+ {
12
+ "cell_type" : " code" ,
13
+ "collapsed" : false ,
14
+ "input" : [],
15
+ "language" : " python" ,
16
+ "metadata" : {},
17
+ "outputs" : [],
18
+ "prompt_number" : 0
19
+ },
20
+ {
21
+ "cell_type" : " code" ,
22
+ "collapsed" : false ,
23
+ "input" : [
24
+ " import random\n " ,
25
+ " \n " ,
26
+ " EMPTY = None\n " ,
27
+ " SURFER = 'U'\n " ,
28
+ " SWIMMER = 'W'\n " ,
29
+ " MAX_ADJ = 8\n " ,
30
+ " P = 0.333\n " ,
31
+ " \n " ,
32
+ " class Board:\n " ,
33
+ " def __init__(self, size, nsurfers, nswimmers):\n " ,
34
+ " self.size = size\n " ,
35
+ " self.cells = [EMPTY for i in range(self.size*self.size)]\n " ,
36
+ " assert(nswimmers+nsurfers <= size*size/2)\n " ,
37
+ " for i in range(nsurfers):\n " ,
38
+ " self.addAgent(SURFER)\n " ,
39
+ " for i in range(nswimmers):\n " ,
40
+ " self.addAgent(SWIMMER)\n " ,
41
+ " \n " ,
42
+ " def getIndex(self, x, y):\n " ,
43
+ " return x*self.size+y\n " ,
44
+ " \n " ,
45
+ " def setCell(self, x, y, agentType):\n " ,
46
+ " assert(not self.getAgent(x, y))\n " ,
47
+ " assert(agentType in [EMPTY, SURFER, SWIMMER])\n " ,
48
+ " self.cells[self.getIndex(x,y)] = agentType\n " ,
49
+ " \n " ,
50
+ " def addAgent(self, agentType):\n " ,
51
+ " added = False\n " ,
52
+ " while not added:\n " ,
53
+ " x = random.randrange(self.size)\n " ,
54
+ " y = random.randrange(self.size)\n " ,
55
+ " if not self.getAgent(x, y):\n " ,
56
+ " added = True\n " ,
57
+ " self.setCell(x, y, agentType)\n " ,
58
+ " \n " ,
59
+ " def moveAgent(self, x, y):\n " ,
60
+ " index = self.getIndex(x, y)\n " ,
61
+ " a = self.cells[index]\n " ,
62
+ " if a:\n " ,
63
+ " self.cells[index] = EMPTY\n " ,
64
+ " self.addAgent(a)\n " ,
65
+ " \n " ,
66
+ " def getAgent(self, x, y):\n " ,
67
+ " return self.cells[self.getIndex(x,y)]\n " ,
68
+ " \n " ,
69
+ " def getAdjacent(self, x, y):\n " ,
70
+ " index = self.getIndex(x, y)\n " ,
71
+ " baseIndexes = [-1, 1, -self.size-1, -self.size+1, self.size+1, self.size-1]\n " ,
72
+ " indexes = [(index+i)%(self.size*self.size) for i in baseIndexes]\n " ,
73
+ " return [self.cells[i] for i in indexes if self.cells[i]]\n " ,
74
+ " \n " ,
75
+ " \n " ,
76
+ " def echo(self):\n " ,
77
+ " print \" *\" *10\n " ,
78
+ " for i in range(self.size):\n " ,
79
+ " l = \"\"\n " ,
80
+ " for j in range(self.size):\n " ,
81
+ " cell = self.cells[self.getIndex(i,j)]\n " ,
82
+ " l += cell if cell else '-'\n " ,
83
+ " l += ' '\n " ,
84
+ " \n " ,
85
+ " print l \n " ,
86
+ " \n " ,
87
+ " class Simulator:\n " ,
88
+ " \n " ,
89
+ " def __init__(self, board, max_iterations):\n " ,
90
+ " self.board = board\n " ,
91
+ " self.max_iterations = max_iterations\n " ,
92
+ " \n " ,
93
+ " def run(self):\n " ,
94
+ " for i in range(self.max_iterations):\n " ,
95
+ " #b.echo()\n " ,
96
+ " if self.update():\n " ,
97
+ " break;\n " ,
98
+ " print \" Iterations=\" ,i\n " ,
99
+ " \n " ,
100
+ " # return true if nothing moved\n " ,
101
+ " def update(self):\n " ,
102
+ " agentsToMove = []\n " ,
103
+ " for i in range(self.board.size):\n " ,
104
+ " for j in range(self.board.size):\n " ,
105
+ " a = self.board.getAgent(i, j)\n " ,
106
+ " if a:\n " ,
107
+ " adj = self.board.getAdjacent(i, j)\n " ,
108
+ " same = sum([x==a for x in adj])\n " ,
109
+ " nadj = len(adj)\n " ,
110
+ " if nadj and float(same)/float(nadj) < P:\n " ,
111
+ " agentsToMove.append((i, j))\n " ,
112
+ " \n " ,
113
+ " for a in agentsToMove:\n " ,
114
+ " self.board.moveAgent(a[0], a[1])\n " ,
115
+ " return len(agentsToMove) == 0\n " ,
116
+ " \n " ,
117
+ " \n " ,
118
+ " \n " ,
119
+ " DIM = 12\n " ,
120
+ " SURFERS = int(1.0/3.0*DIM*DIM/2.0)\n " ,
121
+ " SWIMMERS = int(2.0/3.0*DIM*DIM/2.0)\n " ,
122
+ " ITERS = 10\n " ,
123
+ " b = Board(DIM, SURFERS, SWIMMERS)\n " ,
124
+ " b.echo()\n " ,
125
+ " s = Simulator(b, ITERS)\n " ,
126
+ " s.run()\n " ,
127
+ " b.echo()\n "
128
+ ],
129
+ "language" : " python" ,
130
+ "metadata" : {},
131
+ "outputs" : [
132
+ {
133
+ "output_type" : " stream" ,
134
+ "stream" : " stdout" ,
135
+ "text" : [
136
+ " **********\n " ,
137
+ " - W U W - - U U - - - W \n " ,
138
+ " W U W - W U - W U - - - \n " ,
139
+ " - W W - - - - W U - W U \n " ,
140
+ " - W - W - W U W - W - W \n " ,
141
+ " W - - U - - - U - - W - \n " ,
142
+ " - U - - - - W W - - U W \n " ,
143
+ " - W - W U W U - - - W - \n " ,
144
+ " W W W U - - - W W W - W \n " ,
145
+ " - U U W - - - - W U W W \n " ,
146
+ " W - W - - W - U - U W U \n " ,
147
+ " - - W W W W W W - - U U \n " ,
148
+ " - - - - - - - - W - - - \n " ,
149
+ " Iterations= 4\n " ,
150
+ " **********\n " ,
151
+ " - W U W - - U U - - W W \n " ,
152
+ " W - W - W U U U U - - - \n " ,
153
+ " - W W - - - U U U - W - \n " ,
154
+ " - W - W - - - - - W - W \n " ,
155
+ " W - - U U U U - - W W - \n " ,
156
+ " - - - U U U W W - - - W \n " ,
157
+ " - W - W U W - - - - W - \n " ,
158
+ " W W W U W - - W W W - W \n " ,
159
+ " - - U W - - - - W - W W \n " ,
160
+ " W - W - - W - - - - - - \n " ,
161
+ " - - W W W W W W - - U U \n " ,
162
+ " - - - U - - W W W - - U \n "
163
+ ]
164
+ }
165
+ ],
166
+ "prompt_number" : 2
167
+ },
168
+ {
169
+ "cell_type" : " code" ,
170
+ "collapsed" : false ,
171
+ "input" : [],
172
+ "language" : " python" ,
173
+ "metadata" : {},
174
+ "outputs" : [],
175
+ "prompt_number" : 69
176
+ },
177
+ {
178
+ "cell_type" : " code" ,
179
+ "collapsed" : false ,
180
+ "input" : [],
181
+ "language" : " python" ,
182
+ "metadata" : {},
183
+ "outputs" : [],
184
+ "prompt_number" : 69
185
+ },
186
+ {
187
+ "cell_type" : " code" ,
188
+ "collapsed" : false ,
189
+ "input" : [],
190
+ "language" : " python" ,
191
+ "metadata" : {},
192
+ "outputs" : []
193
+ }
194
+ ],
195
+ "metadata" : {}
196
+ }
197
+ ]
198
+ }
0 commit comments