El mundo contiene agentes en diferentes ubicaciones, con un solo agente en cualquier ubicación. Cada agente sabe dónde está, pero también necesito verificar rápidamente si hay un agente en una ubicación determinada. Por lo tanto, también mantengo un mapa de ubicaciones a agentes. Tengo un problema para decidir a dónde pertenece este mapa: class World
, class Agent
(como un atributo de clase) o en otro lugar.¿Qué clase debe almacenar la tabla de búsqueda?
A continuación, puse la tabla de búsqueda, agent_locations
, en class World
. Pero ahora los agentes tienen que llamar al world.update_agent_location
cada vez que se mudan. Esto es muy molesto ¿Qué sucede si más tarde decido realizar un seguimiento de otras cosas sobre los agentes, además de sus ubicaciones? ¿Tendría que volver a agregar las llamadas al objeto mundial a través del código Agent
?
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)
Yo en cambio puede poner en agent_locations
class Agent
como un atributo de clase. Pero eso solo funciona cuando tengo un solo objeto World
. Si luego decido instanciar varios objetos World
, las tablas de búsqueda deberían ser específicas del mundo.
Estoy seguro de que hay una mejor solución ...
EDIT: He añadido unas líneas para el código para mostrar cómo se utiliza agent_locations
. Tenga en cuenta que solo se usa desde el interior de los objetos Agent
, pero no sé si eso seguirá siendo así para siempre.
¿No tendría que actualizar 'Agent.agent_locations' independientemente? ¿Cuán "rápido" debe ser su verificación rápida? ¿Cuántos agentes tienes? Si no tiene tantos (relativos), podría iterar sobre los agentes de un Mundo, verificando sus ubicaciones. – vicvicvic
Cuando el agente decide dónde moverse, comprueba para asegurarse de que no se encuentre con otros agentes. Si repito todos los agentes para verificar eso, terminaría buscando la ubicación de cada agente (realizando operaciones 'n_agents') cada vez que se mueva algún agente. La actualización de la tabla de búsqueda solo requiere una operación por 'movimiento '. – max
El código que proporcionó no lo comprueba. 'update_agent_location' simplemente sobrescribe a quien estaba en' (x, y) 'antes ... De todos modos, ¿movería la tabla de búsqueda a la clase' Agente' realmente resolvería algo? ¿Todavía no tendrías que llamar 'Agent.update_agent_location'? – vicvicvic