如何防止在 igraph 中的某些节点之间生成边?
How do I prevent the generation of edges between certain nodes in igraph?
我目前使用如下代码生成随机图:
set.seed(123); g <- erdos.renyi.game(30, 151 , type = "gnm" , directed = F , loops = F)
有没有办法防止节点1、7、13、19、25之间随机生成边?我仍然希望这 5 个通过随机边连接到其他 25 个节点,而不是彼此连接。
您的模特
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)
您可以检查没有不需要的连接
EL[EL[,1] %in% SpecialNodes, ]
any(EL[EL[,1] %in% SpecialNodes, 2] %in% SpecialNodes)
[1] FALSE
此解决方案适用于少量节点。对于非常大的图,它可能效率太低。
我目前使用如下代码生成随机图:
set.seed(123); g <- erdos.renyi.game(30, 151 , type = "gnm" , directed = F , loops = F)
有没有办法防止节点1、7、13、19、25之间随机生成边?我仍然希望这 5 个通过随机边连接到其他 25 个节点,而不是彼此连接。
您的模特
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)
您可以检查没有不需要的连接
EL[EL[,1] %in% SpecialNodes, ]
any(EL[EL[,1] %in% SpecialNodes, 2] %in% SpecialNodes)
[1] FALSE
此解决方案适用于少量节点。对于非常大的图,它可能效率太低。