使用优先附件算法的无标度网络

时间:2019-11-06 23:15:06

标签: python networkx

我很难理解这段代码的作用。请有人可以逐步检查代码并解释其工作原理和作用吗?

def scale_free(n,m):
    if m < 1 or  m >=n: 
        raise nx.NetworkXError("Preferential attactment algorithm must have m >= 1"
                               " and m < n, m = %d, n = %d" % (m, n)) 
    # Add m initial nodes (m0 in barabasi-speak)
    G=nx.empty_graph(m)

    # Target nodes for new edges
    targets=list(range(m))
    # List of existing nodes, with nodes repeated once for each adjacent edge
    repeated_nodes=[]
    # Start adding the other n-m nodes. The first node is m.
    source=m
    while source<n:
        # Add edges to m nodes from the source.
        G.add_edges_from(zip([source]*m,targets))
        # Add one node to the list for each new edge just created.
        repeated_nodes.extend(targets)
        # And the new node "source" has m edges to add to the list.
        repeated_nodes.extend([source]*m)
        # Now choose m unique nodes from the existing nodes
        # Pick uniformly from repeated_nodes (preferential attachement)
        targets = _random_subset(repeated_nodes,m)
        source += 1
    return G

1 个答案:

答案 0 :(得分:1)

因此,第一部分要确保m至少为1并且n>m

def scale_free(n,m):
    if m < 1 or  m >=n: 
        raise nx.NetworkXError("Preferential attactment algorithm must have m >= 1"
                               " and m < n, m = %d, n = %d" % (m, n)) 

然后,它创建一个没有边缘和前m0,...,1个节点的图形。 这看起来与标准的barabasi-albert图有所不同,后者从连接的版本开始,而不是没有任何边的版本。

m-1

现在它将开始一次添加新节点1并根据各种规则将它们连接到现有节点。它首先创建一组“目标”,其中包含无边缘图中的所有节点。

    # Add m initial nodes (m0 in barabasi-speak)
    G=nx.empty_graph(m)

现在将一次添加每个节点1。执行此操作后,会将带有边的新节点添加到先前现有节点的 # Target nodes for new edges targets=list(range(m)) # List of existing nodes, with nodes repeated once for each adjacent edge repeated_nodes=[] # Start adding the other n-m nodes. The first node is m. source=m 中。之前的m个节点已存储在名为m的列表中。

targets

在这里创建这些边缘

    while source<n:

现在,将决定添加下一个节点时谁将获得这些边缘。应该以与它们的程度成正比的概率来选择它们。这样做的方式是通过使用列表 # Add edges to m nodes from the source. G.add_edges_from(zip([source]*m,targets)) ,每个节点的每个边缘出现一次。然后,从中选择一个repeated_nodes个节点的随机集合作为新目标。根据{{​​1}}的定义方式,它可能或可能无法多次选择同一节点作为同一步骤中的目标。

m