Python:为无标度网络实施逐步修改的Barabasi-Albert模型

时间:2016-06-24 08:20:30

标签: python algorithm networkx

在Python中,我需要创建一个指数网络,它与指数随机图不同。

Exponential Networks were introduced in 2005 by Liu & Tang,源自用于创建无标度网络的Barabasi-Albert模型的轻微变化。这个新算法仍然使用增长和优先附件,但是以这样的方式:

  • 网络从最初的节点数 n 增长到最终的数字 N ;
  • 新节点未连接到连接最多的节点,而是连接到具有最高平均度的邻域的节点。

那么现在驱动附件的不是现有节点的程度,而是它们邻域的平均程度。这意味着需要修改生成Barabasi-Albert模型的算法,这就是我的目标。

我想编写一个代码,以简单的步骤方式执行此操作,使用嵌套for循环来模拟增长和优先附件。此外,我希望为节点分配特定的位置,如下所示:

n=100 #Final number of nodes
ncols = 10 #Number of columns of a 10x10 grid
pos = {i : (i // ncols, (n-i-1) % ncols) for i in G.nodes()} #G=graph

我的问题:我可以通过访问nx.barabasi_albert_graph()函数的源代码来完成此操作,但我不明白哪个是增长阶段,这是优先附件阶段,并且计算每个节点的程度。 如果有人能指出我在正确的方向,我会很高兴。

nx.barabasi_albert_graph()函数的源代码:

def barabasi_albert_graph(n, m, seed=None):

    if m < 1 or  m >=n:
        raise nx.NetworkXError(\
              "Barabási-Albert network must have m>=1 and m<n, m=%d,n=%d"%(m,n))
    if seed is not None:
        random.seed(seed)

    # Add m initial nodes (m0 in barabasi-speak)
    G=empty_graph(m)
    G.name="barabasi_albert_graph(%s,%s)"%(n,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)

我已经实现了animation for Barabasi-Albert graph growth,我认为可以根据优先附件标准和节点位置轻松调整实现。

节点位置

  

您需要在第39行(对于起始节点)和69(对于新添加的节点)查看节点位置的animate_BA函数(因为我随机选择)

成长阶段

  

对于增长阶段,这是在一个单独的函数choose_neighbors中实现的,该函数被调用以将新节点插入到图中。我的实现选择了一个节点以概率连接:(deg(i)+1)/Sum(deg(i)+1)其中i是图中的节点,deg(i)是该节点的度,Sum(deg(i)+1)是图中所有节点的度数+ 1.这是通过创建从0到1的浮点列表来实现的,指定每个节点根据其度数选择的概率。您可以将其调整为邻居的平均度。所以你必须创建这个列表但不同,因为这个函数调用select_neighbors函数来根据定义的概率随机选择邻居。

其他功能主要与动画有关,因此您可能无需查看它们。代码记录在案,你可以在那里找到进一步的解释。