【问题标题】:Longest path in adjacency matrix in RR中邻接矩阵中的最长路径
【发布时间】:2019-11-04 12:51:43
【问题描述】:

有一个描述性示例的假设场景:我有一个由 10 个部分(顶点)组合在一起的模型。根据连接表的定义,每个部分都可以连接到其他部分(边)。

igraph 中有一个shortest.paths 函数。然而,这里的目的是找到一种方法来计算邻接矩阵中的最长路径。导致路径使用尽可能多的部分,理想情况下是全部,因此最终模型的任何部分都不会单独存在。 MWE如下:

library(igraph)
connections <- read.table(text="A B 
1 2
1 7
1 9
1 10
2 7
2 9  
2 10 
3 1  
3 7  
3 9 
3 10 
4 1  
4 6  
4 7 
7 5  
7 9  
7 10  
8 9 
8 10 
9 10", header=TRUE)  

adj <- get.adjacency(graph.edgelist(as.matrix(connections), directed=FALSE))
g1 <- graph_from_adjacency_matrix(adj, weighted=TRUE, mode="undirected")
plot(g1)

编辑: 结果应该是这样的:例如,如果模型的第一部分是 8,它可以与 9 或 10 组合。假设选择了 10,下一部分可以是 1、2、7 或 9。如果选择 9 作为接下来的后续可能是 1、2、3、7 或 8。如果选择了 8,则模型将完成,因为第 10 部分已经在使用中。那么问题将是如何找到一种方法/路径来组合尽可能多的部分,理想情况下是所有部分。后者只能从 6 或 5 开始。

【问题讨论】:

  • 这个问题在很多方面都不清楚。由不同顶点组成的路径?它必须是某些顶点的最短路径吗?
  • 对不起,含糊不清,这不是我的家乡。希望我的编辑有助于澄清。

标签: r igraph adjacency-matrix


【解决方案1】:

您的图表中有循环,我认为您没有说过我们不能多次使用相同的顶点(部分):在这种情况下,最长的路径可能是无限长的,只要您可以遍历循环无限多次,然后前往目的地。

根据您的编辑,我认为这是不允许的。我希望你可以使用动态编程。您可以从类似 DFS 的算法开始,并标记除以 unvisited 开头的所有顶点。然后应用递归来选择从给定顶点我们可以到达的所有可能顶点(除了已经访问过的)的最长路径之间的最大值。

这是一个 NP 难题,因此您必须检查所有可能的路径!

你可以看到:https://en.wikipedia.org/wiki/Longest_path_problem。如前所述,您将通过添加一个标志来告知哪些顶点已被访问,从而修改算法以在具有循环的图中工作。

【讨论】:

  • 非常感谢@prime_hit 提供这些指示。我需要仔细看看,有很多东西要为我承担:)
【解决方案2】:

如果我说得对,请告诉我,您是否正在尝试找到一条触及最大节点数的路径? 如果是这样,这基本上是Hamiltonian path 问题的一个实例,如果您可以多次传递一个节点,我会说它是一个更简单的版本。 您可以尝试观看该算法。 为了尊重您的编辑,您可以尝试查看图形搜索算法,您可以找到 here,但是请注意,这种类型的算法在内存复杂性方面非常繁重。

【讨论】:

  • 非常感谢@A.Mattia 的这些指点!我使用adagio 中的hamiltonian 函数从顶点5 或6 开始得到结果。我将研究一下图形搜索算法。
  • 回答你的问题,是的,我们的目标是找到一条触及最大节点/顶点数的路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
相关资源
最近更新 更多