Networkx使用节点属性创建图形以确定连接哪些边

时间:2013-04-06 16:19:42

标签: python graph networkx

我正在尝试创建一个连接图,其中每个节点都有一些属性,用于确定它连接到的其他节点。网络是一个圆形空间,可以很容易地建立链接(有1000个节点)。

这个网络的工作方式是一个节点有两个邻居(左边/右边的邻居 - 即节点3有邻居1和2),还有 k 长途链接。节点选择长距离链路的方式是它只是从顺时针方向随机选择节点(即节点25可能有200作为其长距离链路而不是15)。

以下是可能的示例图片:http://i.imgur.com/PkYk5bz.png 鉴于是一个交响乐网络,但我的实现是对它的简化。

我在java中部分实现了这个(通过一个包含arraylist的链接列表),但在NetworkX中如何做到这一点却很遗憾。我特别感到困惑的是如何添加这些特定节点属性,这些属性表示节点将找到k个长链接,但在k之后将不再接受任何链接。在networkx中是否有适合此模型的特定内置图形,或者只要我具有正确的节点属性,是否可接受任何图形?

这是一个更复杂的网络的简化,没有节点离开,也没有边缘消失。

对此示例的任何帮助或链接都将受到赞赏。

2 个答案:

答案 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()

它会创建下面的图表。有一些改进,例如,更有效地选择长边的目标节点,但这可以让你开始,我希望。

Cycle graph with "long" edges

答案 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。