代码之家  ›  专栏  ›  技术社区  ›  Carrol

用R中的iGraph获取路径的权重

  •  2
  • Carrol  · 技术社区  · 8 年前

    我有一个从数据框创建的图形,形式为 from, to, cost 列。我还有一条路径(作为一系列顶点 vpath 格式为 igraph )这是有效的(我的图表是定向的)。

    如果给定我的图形和路径,是否有任何函数可以为我提供该路径的成本?

    我不是在问最短路径,因为我是从 all_shortest_paths 但是,我只得到节点序列,而没有得到路径的权重,这也是我需要的。

    编辑:数据

    这是我的数据帧,我将其转换为图表: http://www.sharecsv.com/s/47209742f0052a37e17db37ea3af63ac/arcsWithCost.csv

    我的道路是 15 4 50 212 183 112 114 37 228 119

    1 回复  |  直到 8 年前
        1
  •  4
  •   G5W    8 年前

    将路径作为顶点序列。如果你有一系列的边,这将很容易-只需为每条边加上权重。因此,您需要做的是将顶点序列转换为边序列。这就是 get.edge.ids 是的,尽管您需要将数据转换为正确的格式。

    由于您没有提供任何数据,我将用一个随机示例进行说明。

    library(igraph)
    set.seed(1234)
    g = erdos.renyi.game(10,0.15, directed=TRUE)
    E(g)$weight = sample(5, length(E(g)), replace=TRUE)
    plot(g)
    

    Graph

    好,现在假设我们要沿着节点1-4-10-3的路径求和权重。 我想你有一份清单 c(1,4,10,3)

    VP = c(1,4,10,3)
    EP = rep(VP, each=2)[-1]
    EP = EP[-length(EP)]
    E(g)$weight[get.edge.ids(g, EP)]
    [1] 1 5 4
    sum(E(g)$weight[get.edge.ids(g, EP)])
    [1] 10
    

    添加内容:

    在添加到问题的数据中,有110个节点,但它们的编号最多为281个。这些数字是节点的标签,但不是节点ID。可以使用标签访问节点,但必须将其转换为字符串,才能将其视为标签。这段代码适用于您的示例。

    VP = c(15, 4, 50, 212, 183, 112, 114, 37, 228, 119)
    EP = rep(VP, each=2)[-1]
    EP = EP[-length(EP)]
    E(g)$cost[get.edge.ids(g, as.character(EP))]
    sum(E(g)$cost[get.edge.ids(g, as.character(EP))])