在Python中,我需要创建一个指数网络,它与指数随机图不同。
Exponential Networks were introduced in 2005 by Liu & Tang,源自用于创建无标度网络的Barabasi-Albert模型的轻微变化。这个新算法仍然使用增长和优先附件,但是以这样的方式:
那么现在驱动附件的不是现有节点的程度,而是它们邻域的平均程度。这意味着需要修改生成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
答案 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
函数来根据定义的概率随机选择邻居。
其他功能主要与动画有关,因此您可能无需查看它们。代码记录在案,你可以在那里找到进一步的解释。