view RandomGraph.py @ 27:78116556b491

Exercise 1 in chapter 5.1 (Zipf's law).
author Brian Neal <bgneal@gmail.com>
date Sat, 05 Jan 2013 16:38:24 -0600
parents 950a34c7e26b
children
line wrap: on
line source
"""This module contains the RandomGraph class.

"""
import random
import itertools

from Graph import Graph, Edge


class RandomGraph(Graph):
    """A RandomGraph is a Graph that adds a method to generate random edges."""

    def add_random_edges(self, p=0.5):
        """This method first removes all edges, then adds edges at random such
        that the probability is p that there is an edge between any two nodes.

        p must be a float between 0 and 1, inclusive.

        """
        self.remove_all_edges()

        # For each combination of 2 vertices, create an edge between them if we
        # select a random number [0.0, 1.0) that is less than p.
        for v, w in itertools.combinations(self.iterkeys(), 2):
            if random.random() <= p:
                self.add_edge(Edge(v, w))


if __name__ == '__main__':
    import string
    import sys
    from Graph import Vertex
    from GraphWorld import GraphWorld, CircleLayout

    def main(script_name, n=10, p=0.5):

        n = int(n)
        p = float(p)

        labels = string.ascii_lowercase + string.ascii_uppercase
        vs = [Vertex(c) for c in labels[:n]]

        g = RandomGraph(vs)
        g.add_random_edges(p)
        layout = CircleLayout(g)

        gw = GraphWorld()
        gw.show_graph(g, layout)
        gw.mainloop()

    main(*sys.argv)