如何解决R中所有指定长度的简单路径
我有以下代码来查找图中两个节点(1和5)之间的所有路径。
pxy= all_simple_paths(graph,1,5) #get all paths between node 1 and 5
它为我提供了节点之间的所有路径,但是从计算上来说太昂贵了。如果有一个带有数千个节点和边的大型图,则仅查找两个节点之间的路径将花费数小时甚至数小时。我有成千上万的节点对,我将找到所有指定长度的简单路径(,即长度2,长度3,长度4等)。以下代码使我满足了所有指定长度的简单路径的要求,但这太昂贵了。有人帮我。
L=2 #set length
for (i in 1:length(pxy)){
plist = as.vector(pxy[[i]]) #check every path one by one
if(length(plist)==L){ #find path of specified length
print(plist) #display path
}
}
解决方法
您可以使用简单的递归函数找到长度为n的简单路径。您没有提供任何测试数据,因此我以一个简单的示例开始。
## test data
set.seed(1234)
g2 = erdos.renyi.game(20,0.2)
plot(g2,layout=layout_with_graphopt)
## Commented out because this will run a LONG time
## all_simple_paths(g2,3,9)
即使此图不大,在其上运行all_simple_paths
仍需要很长时间。如果我们不需要全部 简单路径,而只需要一定长度的路径,则可以有效地获取它们(对于较小的长度)。
## Recursively find simple paths of length n
SimplePathsLengthN = function(graph,node1,node2,pathlength=2) {
SP = list()
if(pathlength == 1) {
if(node2 %in% neighbors(graph,node1)) {
SP[[1]] = c(node1,node2) }
return(SP) }
Nbrs2 = neighbors(graph,node2)
for(nbr2 in Nbrs2) {
ASPn2 = SimplePathsLengthN(graph,nbr2,pathlength-1)
for(i in seq_along(ASPn2)) {
if(!(node2 %in% ASPn2[[i]])) {
SP = append(SP,list(c(ASPn2[[i]],node2))) }
}
}
return(SP)
}
一些测试示例:
SimplePathsLengthN(g2,4,17,3)
[[1]]
[1] 4 13 1 17
[[2]]
[1] 4 19 2 17
SimplePathsLengthN(g2,1,4)
[[1]]
[1] 4 19 2 8 1
[[2]]
[1] 4 19 11 13 1
[[3]]
[1] 4 19 2 17 1
这些实际上是瞬时运行的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。