将随机网络拆分为R中的两个网络

时间:2014-01-10 00:00:27

标签: r networking graph igraph

我使用igraph库在R中创建了一个无向随机(Erdos-Renyi)网络。它由100个节点组成,两个节点之间存在边缘的概率p为0.2。

这是我创建随机网络的代码:

original <- erdos.renyi.game(100, 0.2, type = c("gnp", "gnm"), directed = FALSE,
    loops = FALSE)

所以原始网络看起来像这样:

      O
      |                    Please note: O represent nodes, and the lines
      |                                 represent the edges between the nodes
O-----O-----O
|     | \
|     |  \
O-----O   O

我需要将这个随机网络分成两个网络(称为net1和net2),这样如果选择一个随机数“1”,原始网络中两个节点之间的边将存在于net1的两个相同节点之间(或者如果选择了随机数'2',则边缘将存在于net2中,同样位于相同的两个节点之间。)

然后net1和net2看起来像这样,取决于它们边缘的随机数('1'和'2'):

      O                   O
                          |
                          |
O-----O     O       O     O-----O
      | \           |
      |  \          |
O     O   O         O-----O   O
     net1                net2

因此,如果net1在最初位于原始网络中的两个节点之间具有边缘,则net2将不会在相同的两个节点之间具有该边缘(并且如果边缘在net2中则相同,则不应该在net1中同样)。

我不知道如何根据随机数('1'或'2)将原始网络分成两个网络并在两个网络的相同节点之间创建边缘,如原始网络')被选中。

很抱歉,如果这有点令人困惑,很难解释。

非常感谢任何帮助。非常感谢提前。

1 个答案:

答案 0 :(得分:2)

对于某些igraph随机网络对象a

# what is the order of a?
n <- length(V(a))

# random network
# we're only interested in this for that fact that it provides a
# random symmetric matrix with approx. half of its edges present
ran <- erdos.renyi.game(n, .5, type="gnp", directed=F)

# network 1 (as an igraph graph object)
g1 <- graph.adjacency(a[,] * ran[,])

# network 2 (also as an igraph graph object)
g2 <- graph.adjacency(a[,] * !ran[,])

生成的对象将是您的拆分网络的igraph图形表示。您可以轻松地将它们转换为您需要的任何形式。例如,如果没有graph.adjacency(),则最后两次计算会导致稀疏矩阵表示。

这里的基本逻辑是0和1的随机矩阵(与随机网络不同)(每个的约50%)与随机网络逐元素相乘,以产生平均一个网络随机选择原始随机网络中的一半边缘。然后将随机矩阵的补码乘以随机网络,得到具有原始网络剩余联系的第二个网络。

如果您以矩阵格式取两个结果并按元素添加它们,您将再次拥有原始网络(以矩阵格式)。