6.7. Generating BA Graphs

In the previous sections we used a NetworkX function to generate BA graphs; now let’s see how it works. Here is a version of barabasi_albert_graph, with some changes that were made to make it easier to read:

def barabasi_albert_graph(n, k):

G = nx.empty_graph(k)
targets = list(range(k))
repeated_nodes = []

for source in range(k, n):
    G.add_edges_from(zip([source]*k, targets))

    repeated_nodes.extend(targets)
    repeated_nodes.extend([source] * k)

    targets = _random_subset(repeated_nodes, k)

return G

The parameters are n, the number of nodes we want, and k, the number of edges each new node gets (which will turn out to be the average number of edges per node).

We start with a graph that has k nodes and no edges. Then we initialize two variables:

Each time through the loop, we add edges from the source to each node in targets. Then we update repeated_nodes by adding each target once and the new node k times.

Finally, we choose a subset of the nodes to be targets for the next iteration. Here’s the definition of _random_subset:

def _random_subset(repeated_nodes, k):
targets = set()
while len(targets) < k:
    x = random.choice(repeated_nodes)
    targets.add(x)
return targets

Each time through the loop, _random_subset chooses from repeated_nodes and adds the chosen node to targets. Because targets is a set, it automatically discards duplicates, so the loop only exits when we have selected k different nodes.

You have attempted of activities on this page