Python:使用常规网格,最短路径的分布是不规则的

时间:2016-05-05 15:04:01

标签: python combinations networkx shortest-path symmetry

在常规NxN网络中,我想根据通过它们的最短路径的数量对节点进行颜色编码。这在文献中称为Stress Centrality(SC)。

为此,我使用nx.all_shortest_paths()函数,该函数计算 all 图中任意两个节点之间的最短路径。

有问题的网络非常规律,所以我坚信最短路径的分布应遵循相同的模式,无论网络规模如何

但这是交易:如果大小为9x9,很明显中心节点是最“强调”的,如下所示(白色节点);如果大小为10x10,则这个受压节点云移动到其他位置。我不知道这是Python /计算效果还是正常。我没有测试过大于10x10的网络,因为进行计算需要很长时间(时间复杂度似乎是计算的指数)。

这怎么可能发生?我希望压力最大的节点始终保持在中心位置。当我增加网络规模时,为什么不是这样?毕竟,拓扑结构保持不变(因此是对称的)。

图片: enter image description here

代码:

from __future__ import print_function, division
import numpy
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

#Creating the network
N=9
G=nx.grid_2d_graph(N,N)
pos = dict( (n, n) for n in G.nodes() )
labels = dict( ((i,j), i + (N-1-j) * N ) for i, j in G.nodes() )
nx.relabel_nodes(G,labels,False)
inds=labels.keys()
vals=labels.values()
inds.sort()
vals.sort()
pos2=dict(zip(vals,inds))
nx.draw_networkx(G, pos=pos2, with_labels=True, node_size = 15)

#Function counting all shortest paths between any two nodes
counts={}
for n in G.nodes(): counts[n]=0
for n in G.nodes():
    for j in G.nodes():
        if (n!=j):
            gener=nx.all_shortest_paths(G,source=n,target=j)
            for p in gener: 
                for v in p: counts[v]+=1

#Plotting the color coded nodes
fig, ax = plt.subplots()
unaltered_shortest_paths = counts.values() #List
nodes = G.nodes()
n_color = numpy.asarray([unaltered_shortest_paths[n] for n in range(len(nodes))])
sc = nx.draw_networkx_nodes(G, pos=pos2, node_color=n_color, cmap='gist_heat',
                            with_labels=False, ax=ax, node_size=45)
min_val=int(min(unaltered_shortest_paths))
max_val=int(max(unaltered_shortest_paths))
sc.set_norm(mcolors.Normalize(vmin=0,vmax=max_val))
cbar=fig.colorbar(sc)
cbar.set_label('Number of Shortest Paths')
plt.xlim(-2,N+1,5)
plt.xticks(numpy.arange(0, N, 1))
plt.ylim(N+1,-2,5) 
plt.yticks(numpy.arange(0, N, 1))
plt.axis('on')
title_string=('Stress Centrality (SC)') 
subtitle_string=('Network size: '+str(N)+'x'+str(N))
plt.suptitle(title_string, y=0.99, fontsize=17)
plt.title(subtitle_string, fontsize=9)
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

0 个答案:

没有答案