mirror of
https://github.com/gsi-upm/soil
synced 2024-11-22 03:02:28 +00:00
d9947c2c52
Documentation needs some improvement The API has been simplified to only allow for ONE topology per NetworkEnvironment. This covers the main use case, and simplifies the code.
72 lines
1.9 KiB
Python
72 lines
1.9 KiB
Python
"""
|
|
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]
|