1

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

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

这是它可能看起来的示例图像:http: //i.imgur.com/PkYk5bz.png 给定的是一个交响乐网络,但我的实现是它的简化。

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

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

对此,我们将不胜感激任何帮助或示例链接。

4

2 回答 2

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

它创建了下面的图表。有待改进,例如,为长边更有效地选择目标节点,但我希望这能让你开始。

循环图与

于 2013-04-06T20:25:27.687 回答
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。

于 2013-04-06T18:40:24.877 回答