计算加权最短路径的未加权长度

时间:2014-11-21 04:40:23

标签: r algorithm igraph

我已经开始研究igraph是否是计算最低成本路径长度的更有效方法。使用包gdistance,可以直接在两个(或多个)点之间提供成本曲面和生成最低成本路径。函数costDistance返回路径的实际长度,作为所有段长度的总和(即不是最低成本路径的累积COST)。

我的问题是,是否有办法在igraph中执行此操作,以便我可以比较计算时间。使用get.shortest.paths,我可以获得顶点之间最短路径的长度,但是,当提供边权重时,路径路径长度将报告为加权路径长度。

简而言之:我想在加权网络上找到最短路径但是根据边长而不是加权边长报告长度。

注意:通过循环每个最短路径,然后编写一些额外的代码来加上未加权的边长,我可以看到这是如何实现的,但我担心这会抵消我对提高成对距离计算效率的原始需求通过大规模网络。

2 个答案:

答案 0 :(得分:0)

get.shortest.paths中,有一个weights参数!如果您阅读?get.shortest.paths,您会发现weights

  

可能是给出边权重的数字向量。如果这是NULL并且图形具有权重边缘属性,则使用该属性。如果这是NA,则不使用权重(即使图表具有权重属性)。

所以你应该设置weights = NA。请参阅下面的示例:

require(igraph)
# make a reproducible example
el <- matrix(nc=3, byrow=TRUE,
             c(1,2,.5, 1,3,2, 2,3,.5) )
g2 <- add.edes(graph.empty(3), t(el[,1:2]), weight=el[,3])
# calculate weighted shortest distance between vertice 1 and 3
get.shortest.paths(g2, 1, 3)
# calculate unweighted shortest distance between vertice 1 and 3
get.shortest.paths(g2, 1, 3, weights=NA)

答案 1 :(得分:0)

我不确定我是否完全明白了什么&#34;边长&#34;和#34;加权边长&#34;意思是在你的帖子中(我猜这&#34;边长&#34;简单地是&#34;沿路径的边数&#34;和#34;加权边长&#34;是&#34;沿着路径的边缘的总权重&#34;),但如果我正确,你的问题简单地归结为&#34;找到边缘按一个特定标准加权的最短路径,然后为每个边缘返回一个长度路径,它是所涉及的边缘的一些其他属性的总和&#34;。

如果是这种情况,您可以将output="epath"参数传递给get.shortest.paths;在这种情况下,igraph将报告沿两个节点之间的加权最短路径的边缘的ID。然后,您可以将这些ID用作向量的索引,该向量包含计算长度时要使用的其他属性的值。 E.g:

> g <- grg.game(100, 0.2)
> E(g)$weight <- runif(ecount(g), min=1, max=20)
> E(g)$length <- runif(ecount(g), min=1, max=20)
> path <- unlist(get.shortest.paths(g, from=1, to=100, output="epath")[[1]]$epath)
> sum(E(g)$length[path])

这将为您提供节点1和100之间最短路径中所涉及边的length属性的总和,而使用weight属性(这是默认值)计算最短路径对于get.shortest.paths,但您也可以使用weights=...参数覆盖它。

如果您只是对路径边缘的数字感兴趣,可以使用常量1作为长度,或者只需在最后一行中调用length(path)