Python-Modul Mesa - positionsorientierte Agentenbewegung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hcshm
User
Beiträge: 48
Registriert: Dienstag 11. Februar 2020, 08:23

Ein Agent in einem grid des Python-moduls Mesa soll sich
in die linke untere Ecke bewegen.
Dies passiert indes nicht, (wohl) weil die mesa-Agenten-Klasse
kein Attribut für die Koordinaten akzeptiert. Kann mir bitte jemand auf die Sprünge helfen?

Code: Alles auswählen


""" Ein Agent in einem grid des Python-moduls Mesa soll sich
in die linke untere Ecke bewegen.
Dies passiert indes nicht, (wohl) weil die mesa-Agenten-Klasse
kein Attribut für die Koordinaten akzeptiert"""

import mesa

class Model(mesa.Model):
    """A model with one agent"""
    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)
        # Create agent and add it to a random grid cell
        a = Agent(1, self)
        self.schedule.add(a)
        x = self.random.randrange(self.grid.width)
        y = self.random.randrange(self.grid.height)
        self.grid.place_agent(a, (x, y))

    def step(self):
         self.schedule.step()

class Agent(mesa.Agent):
    def __init__(self, unique_id, model):
        super().__init__(unique_id, model)
        self.x, self.y = 0, 0

    def move_to_corner(self):
        new_x = max(self.x - 1, 0)
        new_y = max(self.y - 1, 0)
        new_position = (new_x, new_y)
        print(new_position)
        self.model.grid.move_agent(self, new_position)
        self.x, self.y = new_position  # Update agent's coordinates

    def step(self):
        self.move_to_corner()


model = Model(1, 10, 10)
for i in range(20):
    model.step()


Benutzeravatar
grubenfox
User
Beiträge: 432
Registriert: Freitag 2. Dezember 2022, 15:49

nach dem was ich im Tuturial so lese , würde ich sagen mit dem "True" in

Code: Alles auswählen

self.grid = mesa.space.MultiGrid(width, height, True)
ist das ganze Grid ein Toroid und damit gibt es einfach keine linke untere Ecke. Beziehungsweise ist man mit dem nächsten Schritt von 'ganz links' oder 'ganz unten' gleich 'ganz rechts' bzw. 'ganz oben'.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@hcshm: `x` und `y` akzeptieren, nur ist das halt nicht das was das Rahmenwerk verwendet. Das setzt die Position auf einem `pos`-Attribut. Was auch die `mesa.Agent`-Klasse nach ihrer `__init__()` besitzt. Und das sollte man auch nicht selber beschreiben, weil dass das Rahmenwerk ja bereits tut.

Bei einem `Model` das mit „A model with one agent“ dokumentiert wird, ist es komisch bis falsch wenn man da beim Erstellen die Anzahl der Agenten übergeben muss. Das muss ja offensichtlich immer die 1 sein. Ich sehe auch nicht den Sinn die Argumente an die `mesa.Model.__init__()` weiter zu geben. Die kann mit keinem der drei Werte irgend etwas anfangen, sondern ignoriert die einfach. Das `num_agents`-Attribut wird nirgends verwendet.

Code: Alles auswählen

#!/usr/bin/env python3
import mesa


class Model(mesa.Model):
    """
    A model with one agent
    """

    def __init__(self, width, height):
        super().__init__()
        self.grid = mesa.space.MultiGrid(width, height, True)
        self.schedule = mesa.time.BaseScheduler(self)
        agent = Agent(1, self)
        self.schedule.add(agent)
        self.grid.place_agent(
            agent,
            (
                self.random.randrange(self.grid.width),
                self.random.randrange(self.grid.height),
            ),
        )

    def step(self):
        self.schedule.step()


class Agent(mesa.Agent):
    def move_to_corner(self):
        x, y = self.pos
        new_position = (max(x - 1, 0), max(y - 1, 0))
        print(new_position)
        self.model.grid.move_agent(self, new_position)

    step = move_to_corner


def main():
    model = Model(10, 10)
    for _ in range(20):
        model.step()


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
hcshm
User
Beiträge: 48
Registriert: Dienstag 11. Februar 2020, 08:23

Vielen Dank für die Hinweise!
Ich überarbeite den Code, sehe ob ich ihn zu Laufen bekomme und melde mich ggf. noch mal.
@blackjack: Natürlich hast Du recht, dass man keinen Parameter für die Anzahl der Agenten braucht, wenn man nur einen hat.
In diesem Abschnitt meines Codes haben sich auch schon mal mehr Agenten getummelt.
Das soll auch später wieder so sein, wenn der erste sich so bewegt, wie er soll ....
Auch der Hinweis auf die "Toroid"-Thematik ist absolut zutreffend. Aber auch bei einem toroiden Grid gibt es eine (0, 0)-Zelle. Und dahin soll der Agent sich bewegen.
Wie auch immer: Ich werde - mit meinem überschaubaren Wissen - weiter basteln und recherchieren und mich ggf. erneut melden.
Erneut: Vielen Dank blackjack, vielen Dank grubenfox!
Antworten