我正在尝试创建一个连接图,其中每个节点都有一些属性,用于确定它连接到的其他节点。网络是一个圆形空间,可以很容易地建立链接(有1000个节点)。
这个网络的工作方式是一个节点有两个邻居(左边/右边的邻居 - 即节点3有邻居1和2),还有 k 长途链接。节点选择长距离链路的方式是它只是从顺时针方向随机选择节点(即节点25可能有200作为其长距离链路而不是15)。
以下是可能的示例图片:http://i.imgur.com/PkYk5bz.png 鉴于是一个交响乐网络,但我的实现是对它的简化。
我在java中部分实现了这个(通过一个包含arraylist的链接列表),但在NetworkX中如何做到这一点却很遗憾。我特别感到困惑的是如何添加这些特定节点属性,这些属性表示节点将找到k个长链接,但在k之后将不再接受任何链接。在networkx中是否有适合此模型的特定内置图形,或者只要我具有正确的节点属性,是否可接受任何图形?
这是一个更复杂的网络的简化,没有节点离开,也没有边缘消失。
对此示例的任何帮助或链接都将受到赞赏。
答案 0 :(得分:1)
这近似于你的需要:
import networkx as nx
import matplotlib.pyplot as plt
import random
N = 20 # number of nodes
K = 3 # number of "long" edges
G = nx.cycle_graph(N)
for node in G.nodes():
while len(G.neighbors(node)) < K+2:
# Add K neighbors to each node
# (each node already has two neighbors from the cycle)
valid_target_found = False
while not valid_target_found:
# CAUTION
# This loop will not terminate
# if K is too high relative to N
target = random.randint(0,N-1)
# pick a random node
if (not target in G.neighbors(node)
and len(G.neighbors(target)) < K+2):
# Accept the target if (a) it is not already
# connected to source and (b) target itself
# has less than K long edges
valid_target_found = True
G.add_edge(node, target)
nx.draw_circular(G)
plt.show()
它会创建下面的图表。有一些改进,例如,更有效地选择长边的目标节点,但这可以让你开始,我希望。
答案 1 :(得分:0)
在NetworkX中,如果有关于连接节点的任何逻辑,应该留给你一切。
然而,如果你想迭代Python中的节点(未经测试):
for (nodeId, data) in yourGraph.nodes(data=True):
// some logic here over data
// to connect your node
yourGraph.add_edge(nodeId, otherNodeId)
附注:如果你想留在Java,你也可以考虑使用Jung和Gephi。