我目前使用以下代码生成随机图:
set.seed(123); g <- erdos.renyi.game(30, 151 , type = "gnm" , directed = F , loops = F)
有没有办法防止节点1,7,13,19和25之间的边缘随机生成?我仍然希望这些5通过随机边缘连接到其他25个节点,而不是彼此连接。
答案 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)
您可以检查没有不良连接
EL[EL[,1] %in% SpecialNodes, ]
any(EL[EL[,1] %in% SpecialNodes, 2] %in% SpecialNodes)
[1] FALSE
此解决方案适用于适度数量的节点。对于非常大的图,它可能效率太低。