Python-Framework mesa - 2 Fragen
Verfasst: Freitag 12. Januar 2024, 09:03
Ich bastele an einem Modell in mesa. Leider helfen mir an bestimmten Stellen auch intensive Recherchen und stundenlanges Experimentieren oft nicht weiter. Dies als Erklärung für meine wahrscheinlich blöden Fragen. Zu nachfolgendem Code habe ich folgende Fragen:
- 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!
- 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()