""" Mesa-SOIL integration tests We have to test that: - Mesa agents can be used in SOIL - Simplified soil agents can be used in mesa simulations - Mesa and soil agents can interact in a simulation - Mesa visualizations work with SOIL simulations """ from mesa import Agent, Model from mesa.time import RandomActivation from mesa.space import MultiGrid class MoneyAgent(Agent): """An agent with fixed initial wealth.""" def __init__(self, unique_id, model): super().__init__(unique_id, model) self.wealth = 1 def step(self): self.move() if self.wealth > 0: self.give_money() def give_money(self): cellmates = self.model.grid.get_cell_list_contents([self.pos]) if len(cellmates) > 1: other = self.random.choice(cellmates) other.wealth += 1 self.wealth -= 1 def move(self): possible_steps = self.model.grid.get_neighborhood( self.pos, moore=True, include_center=False ) new_position = self.random.choice(possible_steps) self.model.grid.move_agent(self, new_position) class MoneyModel(Model): """A model with some number of agents.""" def __init__(self, N, width, height): self.num_agents = N self.grid = MultiGrid(width, height, True) self.schedule = RandomActivation(self) # Create agents for i in range(self.num_agents): a = MoneyAgent(i, self) self.schedule.add(a) # Add the agent to a random grid cell x = self.random.randrange(self.grid.width) y = self.random.randrange(self.grid.height) self.grid.place_agent(a, (x, y)) def step(self): """Advance the model by one step.""" self.schedule.step() # model = MoneyModel(10) # for i in range(10): # model.step() # agent_wealth = [a.wealth for a in model.schedule.agents]