在常规NxN
网络中,我想根据通过它们的最短路径的数量对节点进行颜色编码。这在文献中称为Stress Centrality(SC)。
为此,我使用nx.all_shortest_paths()
函数,该函数计算 all 图中任意两个节点之间的最短路径。
有问题的网络非常规律,所以我坚信最短路径的分布应遵循相同的模式,无论网络规模如何。
但这是交易:如果大小为9x9
,很明显中心节点是最“强调”的,如下所示(白色节点);如果大小为10x10
,则这个受压节点云移动到其他位置。我不知道这是Python /计算效果还是正常。我没有测试过大于10x10
的网络,因为进行计算需要很长时间(时间复杂度似乎是计算的指数)。
这怎么可能发生?我希望压力最大的节点始终保持在中心位置。当我增加网络规模时,为什么不是这样?毕竟,拓扑结构保持不变(因此是对称的)。
代码:
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()