2016-01-21 21 views
1

我需要在文本文件中编写一个图形,其中文件的每一行由一个节点组成,然后是其所有节点邻居。它基本上是什么Adjacency List,以及功能write_adjlist应该做什么。不幸的是,情况并非如此,因为边缘没有被复制。在维基百科为例邻接表是:将图形写入邻接列表形式的文件中[提及每行中每个节点的所有邻居]

一个相邻的B,C

B个邻接于A,C邻近

C,B

我们可以看到所有边缘出现两次(第1行和第2行中的边缘(a,b),第2行和第3行中的边缘(b,c) ...)。

但现在如果我用下面的代码生成一个小世界网络:

import networkx as nx 

N=5 #Number of nodes 
v=2 #Number of neighbours 
p=.1 #rewiring proba 

G = nx.connected_watts_strogatz_graph(N,v,p) 
nx.write_adjlist(G.to_undirected(),"test.txt") 

它给了我:

#adj.py 
# GMT Thu Jan 21 06:57:29 2016 
# watts_strogatz_graph(5,2,0.1) 
0 1 4 
1 2 
2 3 
3 4 
4 

,我想有

0 1 4 
1 2 0 
2 3 1 
3 2 4 
4 0 3 

你知道我能做些什么来获得我想要的输出吗?

回答

1

其实这是write_adjlist是如何定义的所以为了你想要一个简单的解决办法可以用下面的函数来完成已经写入文件:

def adj_list_to_file(G,file_name): 
    f = open('tst.txt', "w") 
    for n in G.nodes(): 
     f.write(str(n) + ' ') 
     for neighbor in G.neighbors(n): 
      f.write(str(neighbor) + ' ') 
     f.write('\n') 

N=5 #Number of nodes 
v=2 #Number of neighbours 
p=.1 #rewiring proba 
G = nx.connected_watts_strogatz_graph(N,v,p) 
nx.draw(G, with_labels= True) 
plt.show() 
adj_list_to_file(G.to_undirected(),"tst.txt") 

文件输出为:

0 1 4 
1 0 2 
2 1 3 
3 2 4 
4 0 3 
+0

非常感谢!我只是想知道为什么不实现一个实际做它应该做的功能? –

+0

我认为这样做是为了避免冗余,特别是当图形大得多时。例如,在第一行中,它表示“节点0”具有邻居“1和4”,那么当你来到“节点1”时,不需要说“节点0”是一个邻居,因为你已经说过了它。 –

+0

嗯是的,我可以看到,他们首选避免冗余比定义:) –

相关问题