https://github.com/kentwait/nxsim
nxsim is a Python package for simulating agents in a network
https://github.com/kentwait/nxsim
Last synced: 5 months ago
JSON representation
nxsim is a Python package for simulating agents in a network
- Host: GitHub
- URL: https://github.com/kentwait/nxsim
- Owner: kentwait
- License: apache-2.0
- Created: 2015-06-29T08:48:26.000Z (almost 11 years ago)
- Default Branch: master
- Last Pushed: 2016-01-19T09:17:15.000Z (over 10 years ago)
- Last Synced: 2025-10-28T17:49:07.699Z (8 months ago)
- Language: Python
- Size: 211 KB
- Stars: 38
- Watchers: 4
- Forks: 15
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGES.md
- License: LICENSE
Awesome Lists containing this project
README
# [nxsim](https://github.com/kentwait/nxsim)
Nxsim is a Python package for simulating agents connected by any type of network using
SimPy and Networkx in Python 3.4.
## Install
pip3 install nxsim # from PyPI
pip3 install git+git://github.com/kentwait/nxsim.git # from GitHub
## Quickstart
Nxsim provides a framework for doing forward-time simulations of events occurring in a network. It uses Networkx to
create a network and SimPy 3 to create agents over each node in the network.
To create a simulation, nxsim requires a graph generated by Networkx and an "agent" class to populate each node of the
network.
First, create a graph using Networkx.
import networkx as nx
number_of_nodes = 10
G = nx.complete_graph(number_of_nodes)
Then, subclass *BaseNetworkAgent* to create your own agent based on your needs.
from nxsim import BaseNetworkAgent
# Just like subclassing a process in SimPy
class MyAgent(BaseNetworkAgent):
def __init__(self, environment=None, agent_id=0, state=()): # Make sure to have these three keyword arguments
super().__init__(environment=environment, agent_id=agent_id, state=state)
# Add your own attributes here
def run(self):
# Add your behaviors here
Notice that "agents" in nxsim use the same concepts as "processes" in SimPy 3 except that their interactions can be
limited by the graph in the simulation environment. For more information about SimPy, they have a great introduction
posted on their [website](https://simpy.readthedocs.org/en/latest/simpy_intro/index.html).
Here is a graph-based example:
import random
from nxsim import BaseNetworkAgent
class ZombieOutbreak(BaseNetworkAgent):
def __init__(self, environment=None, agent_id=0, state=()):
super().__init__(environment=environment, agent_id=agent_id, state=state)
self.bite_prob = 0.05
def run(self):
while True:
if self.state['id'] == 1:
self.zombify()
yield self.env.timeout(1)
else:
yield self.env.event()
def zombify(self):
normal_neighbors = self.get_neighboring_agents(state_id=0)
for neighbor in normal_neighbors:
if random.random() < self.bite_prob:
neighbor.state['id'] = 1 # zombie
print(self.env.now, self.id, neighbor.id, sep='\t')
break
You can now set-up your simulation by creating a *NetworkSimulation* instance.
from nxsim import NetworkSimulation
# Initialize agent states. Let's assume everyone is normal.
# Add keys as as necessary, but "id" must always refer to that state category
init_states = [{'id': 0, } for _ in range(number_of_nodes)]
# Seed a zombie
init_states[5] = {'id': 1}
sim = NetworkSimulation(topology=G, states=init_states, agent_type=ZombieOutbreak,
max_time=30, dir_path='sim_01', num_trials=1, logging_interval=1.0)
And finally, start it up.
sim.run_simulation()
Running the simulation saves pickled dictionaries into the *dir_path* folder, in this case to "sim_01".
Now, let's retrieve the history and states of the trial
trial = BaseLoggingAgent.open_trial_state_history(dir_path='sim_01', trial_id=0)
And plot the number of zombies per time interval using matplotlib:
from matplotlib import pyplot as plt
zombie_census = [sum([1 for node_id, state in g.items() if state['id'] == 1]) for t,g in trial.items()]
plt.plot(zombie_census)
And that's it!
## Note
This package is still under development. If you encounter a bug, please file an issue at [https://github.com/kentwait/nxsim/issues](https://github.com/kentwait/nxsim/issues) to get it resolved.
## Acknowledgment
Thanks to Joé Schaul for bringing [ComplexNetworkSim](https://github.com/jschaul/ComplexNetworkSim) to the world.
This project is a SimPy 3- and Python 3.4-compatible fork of ComplexNetworkSim.
## Links
- [nxsim - Github](https://github.com/kentwait/nxsim)
- [nxsim - PyPI](https://pypi.python.org/pypi/nxsim)
- [SimPy v3.0 Documentation](https://simpy.readthedocs.org/en/latest/contents.html)
- [Networkx v1.9 Documentation](http://networkx.github.io/documentation/networkx-1.9.1)
- [matplotlib v1.4.3 Documentation](http://matplotlib.org/users/)
- [ComplexNetworkSim Documentation](https://pythonhosted.org/ComplexNetworkSim)