假设我有以下无权(所有边的权重均为1)、无向、未标记的连通图,并且我想要查找最大给定长度的所有唯一路径。同时,路径中节点不能重复出现。我目前在networkx中找不到这样的常规操作。
请问是否有任何类似的方法存在? 或者这个问题有什么好的解决方案吗?
import networkx as nx
G = nx.Graph()
G.add_nodes_from([1, 2, 3, 4, 5, 6, 7, 8, 9])
G.add_edges_from([(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (2, 4), (6, 9), (8, 9), (9, 6)])
示例图如下所示
假设我需要最大长度=2,我想要以下输出结果
[1 2]
[2 3]
[2 4]
[3 4]
[4 5]
[5 6]
[6 7]
[7 8]
[8 9]
[6 9]
[1 2 3]
[1 2 4]
[2 3 4]
[2 4 5]
[3 4 5]
[4 5 6]
[5 6 7]
[5 6 9]
[6 7 9]
[6 7 8]
[7 8 9]
[6 9 8]
编辑:我正在寻找比使用itertools生成所需最大路径长度减1个节点的所有节点组合并在组合内检查连通性(例如使用G.has_edge(node_1, node_2))等更好的解决方案,这似乎是一个超级糟糕的解决方案。
all_simple_paths
。它允许您指定一个截止点。由于您需要指定每个起始和结束节点,因此仍然是n^2。 - user3483203all_simple_paths
,但不得不指定起点和终点,让我觉得这是一个不好的解决方案。但你建议使用itertools
来获取所有成对节点组合 + 最大长度截止点之间的all_simple_paths
,并过滤所有生成的路径以确保唯一性,对吗? 我想这可以起作用,但我仍然在思考是否可能有更好的解决方案。 - Charly Empereur-mot