如何防止igraph中某些节点之间的边缘生成?

时间:2017-11-26 23:49:52

标签: r igraph

我目前使用以下代码生成随机图:

set.seed(123); g <- erdos.renyi.game(30, 151 , type = "gnm" , directed = F , loops = F)

有没有办法防止节点1,7,13,19和25之间的边缘随机生成?我仍然希望这些5通过随机边缘连接到其他25个节点,而不是彼此连接。

1 个答案:

答案 0 :(得分:1)

你的模特

erdos.renyi.game(30, 151 , type = "gnm" , directed = F , loops = F)` 

可以被认为是从30个节点之间的所有可能边缘采集151个边缘的随机样本。除了某些边缘被排除外,你想要的是那样的。生成所有链接以及排除的链接都很容易。因此,您可以生成所有可能的链接,删除排除的链接以获取可接受链接的列表并对其进行采样。然后,从链接列表生成图表。

library(igraph)

AllEdges = as.data.frame(t(matrix(combn(30,2), ncol=2, byrow=TRUE)))
SpecialNodes = c(1, 7, 13, 19, 25)
ForbiddenEdges = 
    as.data.frame(t(matrix(combn(SpecialNodes,2), ncol=2, byrow=TRUE)))
AcceptableEdges = setdiff(AllEdges, ForbiddenEdges)
set.seed(123)
EL = t(as.matrix(sample(AcceptableEdges, 151)))

g = graph_from_edgelist(EL, directed=FALSE)
par(mar=rep(0,4))
plot(g)

Random graph with some exclusions

您可以检查没有不良连接

EL[EL[,1] %in% SpecialNodes, ]
any(EL[EL[,1] %in% SpecialNodes, 2] %in% SpecialNodes)
[1] FALSE

此解决方案适用于适度数量的节点。对于非常大的图,它可能效率太低。