Mercurial > public > think_complexity
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)