Il mondo contiene agenti in luoghi diversi, con un solo agente in qualsiasi luogo. Ogni agente sa dove si trova, ma ho anche bisogno di controllare rapidamente se c'è un agente in un determinato luogo. Quindi, mantengo anche una mappa dalle posizioni agli agenti. Ho un problema nel decidere dove questa mappa appartiene a: class World
, class Agent
(come attributo di classe) o altrove.Quale classe deve memorizzare la tabella di ricerca?
Di seguito è stata inserita la tabella di ricerca agent_locations
in class World
. Ma ora gli agenti devono chiamare lo world.update_agent_location
ogni volta che si spostano. Questo è molto fastidioso; cosa succede se deciderò in seguito di tenere traccia di altre cose sugli agenti, a prescindere dalle loro ubicazioni? Dovrei aggiungere le chiamate all'oggetto world in tutto il codice 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)
posso invece mettere in agent_locations
class Agent
come un attributo di classe. Ma funziona solo quando ho un singolo oggetto World
. Se in seguito decidessi di istanziare più oggetti World
, le tabelle di ricerca dovrebbero essere specifiche per il mondo.
Sono sicuro che c'è una soluzione migliore ...
EDIT: ho aggiunto qualche riga per il codice per mostrare come agent_locations
viene utilizzato. Si noti che è utilizzato solo dagli oggetti interni Agent
, ma non so se questo rimarrà il caso per sempre.
Non dovresti aggiornare 'Agent.agent_locations' a prescindere? Quanto deve essere "veloce" il tuo controllo rapido? Quanti agenti hai? Se non ne hai così tanti (relativi), potresti semplicemente ripetere gli agenti di World, controllandone le posizioni. – vicvicvic
Quando l'agente decide dove muoversi, controlla che non incontri altri agenti. Se eseguo iterazioni su tutti gli agenti per verificarlo, finirò per cercare la posizione di ciascun agente (eseguendo operazioni 'n_agents') ogni volta che un agente si sposta. L'aggiornamento della tabella di ricerca richiede una sola operazione per 'move'. – max
Il codice che hai fornito non lo controlla? 'update_agent_location' sovrascrive chi era a' (x, y) 'prima ... In ogni caso, spostare la tabella di ricerca nella classe' Agent' può davvero risolvere qualcosa? Non dovresti ancora chiamare 'Agent.update_agent_location'? – vicvicvic