长度l在R中的最短路径

长度l在R中的最短路径,r,graph,igraph,shortest-path,R,Graph,Igraph,Shortest Path,我想在一个由顶点和边组成的加权图中找到长度为l或更小且代价最小的最短路径 shortest_paths(g,from,to,output="both",weights=wts) 在R中(来自IGRAPHE包),给出了从和到最小代价顶点之间的最短路径,长度l不受约束 例如,在这个图中,2和7之间的最短路径是长度为3的2 1 3 7,但我想要长度为2的最短路径,即最小成本的2 1 7 maxlength = 2 ## maximum number of links ASP =

我想在一个由顶点和边组成的加权图中找到长度为l或更小且代价最小的最短路径

  shortest_paths(g,from,to,output="both",weights=wts) 
在R中(来自IGRAPHE包),给出了从和到最小代价顶点之间的最短路径,长度l不受约束

例如,在这个图中,2和7之间的最短路径是长度为3的2 1 3 7,但我想要长度为2的最短路径,即最小成本的2 1 7

maxlength = 2       ## maximum number of links
ASP = all_simple_paths(G, "2", "7")
ShortPaths = which(sapply(ASP, length) <= maxlength+1)
ASP[ShortPaths]
[[1]]
+ 3/7 vertices, named, from af35df8:
[1] 2 1 7
[[2]]
+ 3/7 vertices, named, from af35df8:
[1] 2 6 7

有人能指导我如何进行吗

在您的示例中,只有一条路径的长度为2到7。这使得我们很难测试我们是否真的获得了最低成本路径。因此,我添加了一个链接来创建长度为2的额外路径

## Extended example
to     = c(1,1,1,1,1,1,2,2,3,3,6)
from   = c(2,3,4,5,6,7,4,6,5,7,7)
weight = c(19,39,40,38,67,68,14,98,38,12,10)
EDF = data.frame(to, from, weight)
G   = graph_from_data_frame(EDF, directed = FALSE)
LO = layout_as_star(G, center=1, order = c(1,4,2,5,6,3,7))
plot(G, layout=LO, edge.label=E(G)$weight)


我们的想法是从2到7的所有路径开始,只选择那些满足约束条件的路径-路径长度可以提供一个示例数据集,并从中访问包最短路径。我编辑了这个问题,添加了一个示例,以更好地澄清我的问题。感谢您的回答:)ASP=所有简单路径(G,“2”,“7”)函数在计算上非常昂贵,因为它枚举了所有可能的路径,需要花费大量时间,对于大型图来说根本不可能。有没有办法避免这种情况?
PathWeight = function(VP) {
    EP = rep(VP, each=2)[-1]
    EP = EP[-length(EP)]
    sum(E(G)$weight[get.edge.ids(G, EP)])
}
sapply(ASP[ShortPaths], PathWeight)
[1]  87 108
SP = which.min(sapply(ASP[ShortPaths], PathWeight))
ASP[ShortPaths[SP]]
[[1]]
+ 3/7 vertices, named, from af35df8:
[1] 2 1 7