Which class should store the lookup table?
Posted
by
max
on Stack Overflow
See other posts from Stack Overflow
or by max
Published on 2011-02-02T22:32:26Z
Indexed on
2011/02/02
23:25 UTC
Read the original article
Hit count: 237
The world contains agents at different locations, with only a single agent at any location. Each agent knows where he's at, but I also need to quickly check if there's an agent at a given location. Hence, I also maintain a map from locations to agents. I have a problem deciding where this map belongs to: class World
, class Agent
(as a class attribute) or elsewhere.
In the following I put the lookup table, agent_locations
, in class World
. But now agents have to call world.update_agent_location
every time they move. This is very annoying; what if I decide later to track other things about the agents, apart from their locations - would I need to add calls back to the world object all across the Agent
code?
class World:
def __init__(self, n_agents):
# ...
self.agents = {}
self.agent_locations = {}
for id in range(n_agents):
x, y = self.find_location()
agent = Agent(self,x,y)
self.agents.append(agent)
self.agent_locations[x,y] = agent
def update_agent_location(self, agent, x, y):
del self.agent_locations[agent.x, agent.y]
self.agent_locations[x, y] = agent
def update(self): # next step in the simulation
for agent in self.agents:
agent.update() # next step for this agent
# ...
class Agent:
def __init__(self, world, x, y):
self.world = world
self.x, self.y = x, y
def move(self, x1, y1):
self.world.update_agent_location(self, x1, y1)
self.x, self.y = x1, y1
def update():
# find a good location that is not occupied and move there
for x, y in self.valid_locations():
if not self.location_is_good(x, y):
continue
if self.world.agent_locations[x, y]: # location occupied
continue
self.move(x, y)
I can instead put agent_locations
in class Agent
as a class attribute. But that only works when I have a single World
object. If I later decide to instantiate multiple World
objects, the lookup tables would need to be world-specific.
I am sure there's a better solution...
EDIT: I added a few lines to the code to show how agent_locations
is used. Note that it's only used from inside Agent
objects, but I don't know if that would remain the case forever.
© Stack Overflow or respective owner