R

时间:2018-04-19 04:49:43

标签: r graph igraph shortest-path

我想在由顶点和边组成的加权图中找到长度为l或更小的最短路径,且成本最低。

  shortest_paths(g,from,to,output="both",weights=wts) 
R中的

(来自igraph包)给出了成本最低的顶点之间的最短路径,没有长度l的约束。

See sample graph

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

有人可以指导我如何继续。

1 个答案:

答案 0 :(得分:1)

在您的示例中,从2到7只有一条长度为2的路径。这使得测试我们是否真正获得最低成本路径变得困难。所以,我添加了一个链接来创建一个长度为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)

Extended network

我们的想法是从所有路径开始,从2到7并仅选择那些符合约束的路径 - 路径长度< = 2(注意这意味着顶点数< = 3) 。对于这些路径,我们计算权重并选择成本最低的路径。

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的路径。我们需要找到成本最低的那个。为了简化这一过程,我们创建了一个计算路径权重的函数。

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