Skip to content

Commit 3a593b3

Browse files
authored
Improve model to benchmark (#104)
1 parent dd5f57d commit 3a593b3

File tree

1 file changed

+25
-49
lines changed
  • examples/boid_flockers/boid_flockers

1 file changed

+25
-49
lines changed

examples/boid_flockers/boid_flockers/model.py

Lines changed: 25 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@ def __init__(
3333
direction,
3434
vision,
3535
separation,
36-
cohere=0.025,
37-
separate=0.25,
38-
match=0.04,
36+
cohere=0.03,
37+
separate=0.015,
38+
match=0.05,
3939
):
4040
"""
4141
Create a new Boid flocker agent.
4242
4343
Args:
44-
unique_id: Unique agent identifyer.
44+
unique_id: Unique agent identifier.
4545
pos: Starting position
4646
speed: Distance to move per step.
4747
direction: numpy vector for the Boid's direction of movement.
@@ -62,51 +62,26 @@ def __init__(
6262
self.match_factor = match
6363
self.neighbors = None
6464

65-
def cohere(self):
66-
"""
67-
Return the vector toward the center of mass of the local neighbors.
68-
"""
69-
cohere = np.zeros(2)
70-
if self.neighbors:
71-
for neighbor in self.neighbors:
72-
cohere += self.model.space.get_heading(self.pos, neighbor.pos)
73-
cohere /= len(self.neighbors)
74-
return cohere
75-
76-
def separate(self):
77-
"""
78-
Return a vector away from any neighbors closer than separation dist.
79-
"""
80-
me = self.pos
81-
them = (n.pos for n in self.neighbors)
82-
separation_vector = np.zeros(2)
83-
for other in them:
84-
if self.model.space.get_distance(me, other) < self.separation:
85-
separation_vector -= self.model.space.get_heading(me, other)
86-
return separation_vector
87-
88-
def match_heading(self):
89-
"""
90-
Return a vector of the neighbors' average heading.
91-
"""
92-
match_vector = np.zeros(2)
93-
if self.neighbors:
94-
for neighbor in self.neighbors:
95-
match_vector += neighbor.direction
96-
match_vector /= len(self.neighbors)
97-
return match_vector
98-
9965
def step(self):
10066
"""
10167
Get the Boid's neighbors, compute the new vector, and move accordingly.
10268
"""
10369

10470
self.neighbors = self.model.space.get_neighbors(self.pos, self.vision, False)
105-
self.direction += (
106-
self.cohere() * self.cohere_factor
107-
+ self.separate() * self.separate_factor
108-
+ self.match_heading() * self.match_factor
109-
) / 2
71+
n = 0
72+
match_vector, separation_vector, cohere = np.zeros((3, 2))
73+
for neighbor in self.neighbors:
74+
n += 1
75+
heading = self.model.space.get_heading(self.pos, neighbor.pos)
76+
cohere += heading
77+
if self.model.space.get_distance(self.pos, neighbor.pos) < self.separation:
78+
separation_vector -= heading
79+
match_vector += neighbor.direction
80+
n = max(n, 1)
81+
cohere = cohere * self.cohere_factor
82+
separation_vector = separation_vector * self.separate_factor
83+
match_vector = match_vector * self.match_factor
84+
self.direction += (cohere + separation_vector + match_vector) / n
11085
self.direction /= np.linalg.norm(self.direction)
11186
new_pos = self.pos + self.direction * self.speed
11287
self.model.space.move_agent(self, new_pos)
@@ -119,15 +94,16 @@ class BoidFlockers(mesa.Model):
11994

12095
def __init__(
12196
self,
97+
seed=None,
12298
population=100,
12399
width=100,
124100
height=100,
125-
speed=1,
126101
vision=10,
127-
separation=2,
128-
cohere=0.025,
129-
separate=0.25,
130-
match=0.04,
102+
speed=1,
103+
separation=1,
104+
cohere=0.03,
105+
separate=0.015,
106+
match=0.05,
131107
):
132108
"""
133109
Create a new Flockers model.
@@ -142,7 +118,7 @@ def __init__(
142118
cohere, separate, match: factors for the relative importance of
143119
the three drives.
144120
"""
145-
super().__init__()
121+
super().__init__(seed=seed)
146122
self.population = population
147123
self.vision = vision
148124
self.speed = speed

0 commit comments

Comments
 (0)