diff RandomGraph.py @ 6:950a34c7e26b

Update for section 2.2, exercise 4, random graphs.
author Brian Neal <bgneal@gmail.com>
date Sat, 01 Dec 2012 18:17:58 -0600
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RandomGraph.py	Sat Dec 01 18:17:58 2012 -0600
@@ -0,0 +1,52 @@
+"""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)
+