Code: Alles auswählen
#!/usr/bin/env python3
"""Agenten suchen in einem Grid nach einem Schatz. Sobald ein Agent den
Schatz gefunden hat, wird er entfernt. Sobald alle Agenten den Schatz
entdeckt haben, stoppt der Durchlauf des Modells"""
import mesa
from mesa.visualization.modules import CanvasGrid
from mesa.visualization.ModularVisualization import ModularServer
class Treasure(mesa.Agent):
def __init__(self, unique_id, model, name):
super().__init__(unique_id, model)
self.name = name
class Actor(mesa.Agent):
def __init__(self, unique_id, model, name, treasure):
super().__init__(unique_id, model)
self.name = name
self._state = self.move
self.treasure = treasure
def move(self):
if self.pos != self.treasure.pos:
possible_steps = self.model.grid.get_neighborhood(
self.pos,
moore=True,
include_center=False)
new_position = self.random.choice(possible_steps)
print(f"{self.name} position: {self.pos}")
self.model.grid.move_agent(self, new_position)
else:
self.model.schedule.remove(self)
def step(self):
self._state()
class MyModel(mesa.Model):
def __init__(self, width, height):
super().__init__(width, height)
self.grid = mesa.space.MultiGrid(width, height, True)
self.schedule = mesa.time.BaseScheduler(self)
self.agent_population = []
for name in ["gelb", "blau", "rot", "schwarz"]:
agent = Actor(self.next_id(), self, name, None)
self.schedule.add(agent)
coord = (
self.random.randrange(self.grid.width),
self.random.randrange(self.grid.height))
print(f"Anfangsposition von {agent.name}: {coord}")
self.grid.place_agent(agent, coord)
self.agent_population.append(agent)
for name in ["gold"]:
treasure = Treasure(self.next_id(), self, name)
coord = (
self.random.randrange(self.grid.width),
self.random.randrange(self.grid.height))
print(f"Position von {treasure.name}: {coord}")
self.grid.place_agent(treasure, coord)
for agent in self.agent_population:
agent.treasure = treasure
def step(self):
if self.schedule.get_agent_count():
self.schedule.step()
else:
self.running = False
def object_portrayal(agent):
portrayal = {}
if type(agent) is Actor:
portrayal["Shape"] = "circle"
portrayal["Filled"] = "true"
portrayal["Layer"] = 0
portrayal["r"] = 0.5
if agent.name == "gelb":
portrayal["Color"] = "yellow"
elif agent.name == "blau":
portrayal["Color"] = "blue"
elif agent.name == "rot":
portrayal["Color"] = "red"
elif agent.name == "schwarz":
portrayal["Color"] = "black"
elif type(agent) is Treasure:
portrayal["Shape"] = "rect"
portrayal["Color"] = "orange"
portrayal["Filled"] = "true"
portrayal["Layer"] = 0
portrayal["r"] = 0.8
return portrayal
def main():
mymodel = MyModel(5, 5)
mymodel.run_model()
for agent in mymodel.agent_population:
print(f"Endposition von {agent.name}: {agent.pos}")
if __name__ == "__main__":
grid = CanvasGrid(object_portrayal, 5, 5, 500, 500)
server = ModularServer(MyModel, [grid], "MyModel", {"width": 5, "height": 5})
server.portrayal = object_portrayal
server.launch()