mirror of
https://github.com/gsi-upm/soil
synced 2024-11-13 23:12:28 +00:00
70 lines
1.9 KiB
Python
70 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]
|