【问题标题】:Computing the un-weighted length of a weighted shortest path计算加权最短路径的未加权长度
【发布时间】:2014-11-21 18:09:11
【问题描述】:

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

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

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

注意:我可以通过遍历每条最短路径然后编写一些额外的代码来将未加权的边长相加来了解这是如何实现的,但我担心这会抵消我最初对提高成对距离计算效率的需求通过海量网络。

【问题讨论】:

    标签: r algorithm igraph


    【解决方案1】:

    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)
    

    【讨论】:

      【解决方案2】:

      我不确定我是否完全理解您帖子中的“边长”和“加权边长”的含义(我猜“边长”只是“沿路径的边数”和“加权边长”长度”是“沿路径的边缘的总权重”),但如果我是对的,那么您的问题简单地归结为“找到边缘由一个特定标准加权的最短路径,然后返回每个路径的长度是所涉及的边的一些其他属性的总和”。

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

      > 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)

      【讨论】:

      • 这正是我需要做的。我正在尝试使用 igraph 来计算地理距离。因此,边的值是顶点之间的欧几里得距离,“加权边长度”是欧几里得距离乘以与在两个节点之间移动相关的成本值(您正确指出的 other 属性)。您的解决方案肯定会奏效。我会测试一下,看看它是如何计算整个网络的成对距离的。
      猜你喜欢
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多