- In der move_to_corner- Methode komme ich ohne das break-Kommando nicht aus, wenn die beiden Agenten alternieren sollen, also im Wechsel agieren sollen. Muss das so sein?
- Die traverse_grid-Methode soll erst nach der move_to_corner-Methode aufgerufen werden. Das klappt aber nicht. Sie wird in jedem Schritt der move_to_corner-Methode aufgerufen. Wie löse ich das?
Vielen Dank im Voraus!
Code: Alles auswählen
import mesa
class Model(mesa.Model):
"""Modell mit 2 Agenten, die sich in einem Grid bewegen sollen"""
def __init__(self, number_of_agents, width, height):
super().__init__(number_of_agents, width, height)
self.num_agents = number_of_agents
self.grid = mesa.space.MultiGrid(width, height, True)
self.schedule = mesa.time.BaseScheduler(self)
"""Nachfolgend werden 2 Agenten produziert, als Modell-Attribute definiert
(damit z.B. ihre Position aus dem Modell aufgerufen werden kann) und auf dem Grid platziert"""
self.alter = Agent("alter", self)
self.schedule.add(self.alter)
coord = (self.random.randrange(self.grid.width), self.random.randrange(self.grid.height))
print(f"Anfangsposition von alter: {coord}")
self.grid.place_agent(self.alter, coord)
self.ego = Agent("ego", self)
self.schedule.add(self.ego)
coord = (self.random.randrange(self.grid.width), self.random.randrange(self.grid.height))
print(f"Anfangsposition von ego: {coord}")
self.grid.place_agent(self.ego, coord)
def step(self):
"""Ruft die step-Methode des Agenten auf"""
self.schedule.step()
class Agent(mesa.Agent):
def __init__(self, name, model):
super().__init__(name, model)
self.name = name
def move_to_corner(self):
"""Bewegt die beiden Agenten von ihrer Ausgangsposition in die
linke untere Ecke"""
x, y = self.pos
while x > 0 or y > 0:
new_position = (max(x - 1, 0), max(y - 1, 0))
print(self.name, " position: ", new_position)
self.model.grid.move_agent(self, new_position)
break
self.traverse_grid()
def traverse_grid(self):
"""Agenten sollen das gesamte Grid durchlaufen, zunächst
aber nur Test der Position zu Beginn des Durchlaufs"""
print(self.name, ": Position zu Beginn traverse_grid: ", self.pos)
def step(self):
"""Wird von self.schedule.step aus dem Modell aufgerufen"""
self.move_to_corner()
def main():
"""Produziert ein Grid"""
model = Model(2, 5, 5)
for _ in range(5):
model.step()
print("Endposition von alter:", model.alter.pos)
print("Endposition von ego:", model.ego.pos)
if __name__ == "__main__":
main()