我使用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)将原始网络分成两个网络并在两个网络的相同节点之间创建边缘,如原始网络')被选中。
很抱歉,如果这有点令人困惑,很难解释。
非常感谢任何帮助。非常感谢提前。
答案 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%)与随机网络逐元素相乘,以产生平均一个网络随机选择原始随机网络中的一半边缘。然后将随机矩阵的补码乘以随机网络,得到具有原始网络剩余联系的第二个网络。
如果您以矩阵格式取两个结果并按元素添加它们,您将再次拥有原始网络(以矩阵格式)。