【问题标题】:Obtain weight of a path with iGraph in R在 R 中使用 iGraph 获取路径的权重
【发布时间】:2018-04-07 01:25:15
【问题描述】:

我有一个从数据框创建的图表,格式为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

【问题讨论】:

    标签: r igraph directed-graph


    【解决方案1】:

    您将路径作为顶点序列。如果您有边的序列,这将很容易 - 只需将每条边的权重相加即可。所以你需要做的就是将顶点序列转换为边序列。这就是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)
    

    好的,现在假设我们要对从节点 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))])
    

    【讨论】:

    • 哇,这是一个非常优雅的解决方案!我能够复制您的示例,但似乎无法使其与我的数据一起使用。我在第一篇文章中添加了数据。我收到错误消息:Cannot get edge ids, invalid vertex id, Invalid vertex id
    • 将查找并添加到答案
    • 添加回答
    • @G5W,你能告诉我如何计算圆 c(2,7,6,2) 的权重,即双边三角形的权重吗?从顶点 2 到顶点 7 和从顶点 7 到顶点 2 的边应该在总和中。
    • @G5W 我没有任何路径序列,我有节点名称/标签(从)和(到)。我已经浏览了这篇文章,但没有任何想法。你介意检查一下这个问题吗 (stackoverflow.com/questions/69860347/…)
    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    相关资源
    最近更新 更多