Skip to content
Snippets Groups Projects
random_node.py 1.43 KiB
Newer Older
  • Learn to ignore specific revisions
  • """Example simulation with custom random nodes."""
    
    __author__ = "Jarrod Pas <j.pas@usask.ca>"
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    from random import Random
    
    from pydtn import Network, Node, random_trace, random_traffic
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    class RandomNode(Node):
    
        """Node that sends packets to a random neightbour."""
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
        def __init__(self, seed=None, **options):
    
            """
            Create a random node.
    
            Keyword Arguments:
            seed -- seed for random number generator
            """
    
    Jarrod Pas's avatar
    Jarrod Pas committed
            super().__init__(**options)
            self.random = Random(seed)
    
        def forward(self, packet):
    
            """Pick a random neighbour to send packet to."""
    
    Jarrod Pas's avatar
    Jarrod Pas committed
            neighbours = list(self.neighbours)
            if neighbours:
                target = self.random.choice(neighbours)
                return {target: 'random'}
            return {}
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    def main():
    
        """Run a simulation with random nodes."""
        duration = 500
    
    Jarrod Pas's avatar
    Jarrod Pas committed
        nodes = 50
    
        seed = 42
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
        node_options = {
            'seed': seed,
            'tick_rate': 1,
        }
        nodes = {
            node_id: RandomNode(**node_options)
            for node_id in range(nodes)
        }
    
    
        traffic_options = {
            'seed': seed,
            'speed': 1,
        }
        traffic = random_traffic(nodes, **traffic_options)
    
        trace_options = {
            'seed': seed,
        }
        trace = random_trace(nodes, **trace_options)
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
    
        network = Network(nodes, traffic=traffic, trace=trace)
        network.run(until=duration)
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
    
        print(network.stats_summary)
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    if __name__ == '__main__':
        exit(main())