【问题标题】:How to get all possible paths between leaf nodes in a graph?如何获取图中叶节点之间的所有可能路径?
【发布时间】:2021-12-10 13:48:03
【问题描述】:

我想在图表中获取“连接组”列表。 这是一个例子:

library(igraph)
G <- graph(c(1,2,2,3,2,5,4,5,5,6,4,7,4,8,7,8,8,9), directed=F)
plot(G)

我想获取两个叶节点之间的所有可能路径:

[1] 1 2 3
[2] 1 2 5 6
[3] 1 2 5 4 8 9
[4] 1 2 5 4 7 8 9
[5] 3 2 5 6
[6] 3 2 5 4 8 9
[7] 3 2 5 4 7 8 9
[8] 6 5 4 7 8 9
[9] 6 5 4 8 9

我正在使用 R。感谢您的帮助。

【问题讨论】:

    标签: r graph-theory igraph


    【解决方案1】:

    我不太确定这里的确切逻辑是什么,但您似乎想要获取从每个叶节点到所有其他叶节点的路径。我们可以编写一个辅助函数来做到这一点。

    get_leaf_paths <- function(G) {
      leafs <- V(G)[degree(G)==1]
      do.call("c", lapply(1:(length(leafs)-1), function(i) {
        all_simple_paths(G,leafs[[i]], leafs[[-(1:i)]])
      }))  
    }
    

    基本上,我们通过查找仅连接到一个其他节点的那些来找到叶节点,然后我们为每个节点调用 all_simple_paths 以获取到所有其他叶节点的连接。我们只在列表中寻找与其他人的联系以避免重复。最后,我们将所有最短路径调用的结果合并到一个对象中,该对象将收集所有路径。输出看起来像这样

    get_leaf_paths(G)
    # [[1]]
    # + 3/9 vertices, from 6d0bb8d:
    # [1] 1 2 3
    # [[2]]
    # + 7/9 vertices, from 6d0bb8d:
    # [1] 1 2 5 4 7 8 9
    # [[3]]
    # + 6/9 vertices, from 6d0bb8d:
    # [1] 1 2 5 4 8 9
    # [[4]]
    # + 4/9 vertices, from 6d0bb8d:
    # [1] 1 2 5 6
    # [[5]]
    + 7/9 vertices, from 6d0bb8d:
    # [1] 3 2 5 4 7 8 9
    # [[6]]
    # + 6/9 vertices, from 6d0bb8d:
    # [1] 3 2 5 4 8 9
    # [[7]]
    # + 4/9 vertices, from 6d0bb8d:
    # [1] 3 2 5 6
    # [[8]]
    # + 6/9 vertices, from 6d0bb8d:
    # [1] 6 5 4 7 8 9
    # [[9]]
    # + 5/9 vertices, from 6d0bb8d:
    # [1] 6 5 4 8 9
    

    【讨论】:

    • 抱歉问题不清楚。我想知道如何获取两个叶节点之间的所有可能路径,而不是计算最短路径。
    • 这里的输出和你说的你想要的输出一致。你真的想要一个不同的输出吗?我不确定你到底想要什么。
    • 我编辑了我的问题,并以具有更多链接和节点的网络为例。基本上,我想获得两个叶节点之间的所有可能路径。提前感谢您的帮助。
    • 好吧,我把all_simple_paths换成了get_shortest_paths
    【解决方案2】:

    也许我们遵循以下步骤:

    1. 根据degree过滤所有叶子
    2. 使用combn枚举所有叶子组合
    3. 为每对叶子生成all_simple-paths 列表

    你可以试试这个

    unlist(
      combn(
        V(G)[degree(G) == 1],
        2,
        function(x) all_simple_paths(G, x[1], x[2]),
        simplify = FALSE
      ),
      recursive = FALSE
    )
    

    给了

    [[1]]
    + 3/9 vertices, from 27e9df3:
    [1] 1 2 3
    
    [[2]]
    + 4/9 vertices, from 27e9df3:
    [1] 1 2 5 6
    
    [[3]]
    + 7/9 vertices, from 27e9df3:
    [1] 1 2 5 4 7 8 9
    
    [[4]]
    + 6/9 vertices, from 27e9df3:
    [1] 1 2 5 4 8 9
    
    [[5]]
    + 4/9 vertices, from 27e9df3:
    [1] 3 2 5 6
    
    [[6]]
    + 7/9 vertices, from 27e9df3:
    [1] 3 2 5 4 7 8 9
    
    [[7]]
    + 6/9 vertices, from 27e9df3:
    [1] 3 2 5 4 8 9
    
    [[8]]
    + 6/9 vertices, from 27e9df3:
    [1] 6 5 4 7 8 9
    
    [[9]]
    + 5/9 vertices, from 27e9df3:
    [1] 6 5 4 8 9
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多