一个具有描述性示例的假设场景:我有一个模型,该模型包含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开始才可能。
答案 0 :(得分:1)
图形中存在循环,我认为您不能说我们不能多次使用同一顶点(部分):在这种情况下,最长的路径可能是无限长的,因为您可以遍历循环无限次,然后继续前往目的地。
根据您的修改,我认为这是不允许的。我希望您可以为此使用动态编程。您可以像算法一样使用DFS开头,并标记所有顶点(除了开头为unvisited
之外)。然后应用递归,从给定顶点可以到达的所有可能顶点(除了已访问的顶点)的最长路径之间选择最大值。
这是一个NP难题,因此您必须检查所有可能的路径!
您会看到:https://en.wikipedia.org/wiki/Longest_path_problem。如前所述,您将修改算法以使其具有周期图,方法是添加一个标志以告知已经访问了哪些顶点。
答案 1 :(得分:1)
告诉我,如果我做对了,您正在尝试找到一条路径,该路径接触最大的节点数? 如果是这样,那么这基本上是Hamiltonian path问题的一个实例,如果您可以传递一个节点多次以上,那么我会说它是一个更简单的版本。 您可以尝试观看该算法。 为了尊重您的编辑能力,您可以尝试查看图形搜索算法,可以找到here,但是请注意,这种类型的算法在内存复杂性方面非常繁琐。