mirror of
https://github.com/gsi-upm/soil
synced 2024-11-25 12:22:28 +00:00
112 lines
2.7 KiB
Python
112 lines
2.7 KiB
Python
from mesa.visualization.ModularVisualization import ModularServer
|
|
from mesa.visualization.UserParam import Slider, Choice
|
|
from mesa.visualization.modules import ChartModule, NetworkModule, CanvasGrid
|
|
from social_wealth import MoneyEnv, graph_generator, SocialMoneyAgent
|
|
import networkx as nx
|
|
|
|
|
|
class MyNetwork(NetworkModule):
|
|
def render(self, model):
|
|
return self.portrayal_method(model)
|
|
|
|
|
|
def network_portrayal(env):
|
|
# The model ensures there is 0 or 1 agent per node
|
|
|
|
portrayal = dict()
|
|
wealths = {
|
|
node_id: data["agent"].wealth for (node_id, data) in env.G.nodes(data=True)
|
|
}
|
|
portrayal["nodes"] = [
|
|
{
|
|
"id": node_id,
|
|
"size": 2 * (wealth + 1),
|
|
"color": "#CC0000" if wealth == 0 else "#007959",
|
|
# "color": "#CC0000",
|
|
"label": f"{node_id}: {wealth}",
|
|
}
|
|
for (node_id, wealth) in wealths.items()
|
|
]
|
|
|
|
portrayal["edges"] = [
|
|
{"id": edge_id, "source": source, "target": target, "color": "#000000"}
|
|
for edge_id, (source, target) in enumerate(env.G.edges)
|
|
]
|
|
|
|
return portrayal
|
|
|
|
|
|
def gridPortrayal(agent):
|
|
"""
|
|
This function is registered with the visualization server to be called
|
|
each tick to indicate how to draw the agent in its current state.
|
|
:param agent: the agent in the simulation
|
|
:return: the portrayal dictionary
|
|
"""
|
|
color = max(10, min(agent.wealth * 10, 100))
|
|
return {
|
|
"Shape": "rect",
|
|
"w": 1,
|
|
"h": 1,
|
|
"Filled": "true",
|
|
"Layer": 0,
|
|
"Label": agent.unique_id,
|
|
"Text": agent.unique_id,
|
|
"x": agent.pos[0],
|
|
"y": agent.pos[1],
|
|
"Color": f"rgba(31, 10, 255, 0.{color})",
|
|
}
|
|
|
|
|
|
grid = MyNetwork(network_portrayal, 500, 500)
|
|
chart = ChartModule(
|
|
[{"Label": "Gini", "Color": "Black"}], data_collector_name="datacollector"
|
|
)
|
|
|
|
parameters = {
|
|
"N": Slider(
|
|
"N",
|
|
5,
|
|
1,
|
|
10,
|
|
1,
|
|
description="Choose how many agents to include in the model",
|
|
),
|
|
"height": Slider(
|
|
"height",
|
|
5,
|
|
5,
|
|
10,
|
|
1,
|
|
description="Grid height",
|
|
),
|
|
"width": Slider(
|
|
"width",
|
|
5,
|
|
5,
|
|
10,
|
|
1,
|
|
description="Grid width",
|
|
),
|
|
"agent_class": Choice(
|
|
"Agent class",
|
|
value="MoneyAgent",
|
|
choices=["MoneyAgent", "SocialMoneyAgent"],
|
|
),
|
|
"generator": graph_generator,
|
|
}
|
|
|
|
|
|
canvas_element = CanvasGrid(
|
|
gridPortrayal, parameters["width"].value, parameters["height"].value, 500, 500
|
|
)
|
|
|
|
|
|
server = ModularServer(
|
|
MoneyEnv, [grid, chart, canvas_element], "Money Model", parameters
|
|
)
|
|
server.port = 8521
|
|
|
|
if __name__ == '__main__':
|
|
server.launch(open_browser=False)
|