【发布时间】:2019-12-20 01:07:34
【问题描述】:
假设我有以下未加权(所有边权重 = 1)、无向、未标记、连通图,并且我想找到最大给定长度的所有唯一路径。此外,节点不能在路径中出现两次。我在 networkx atm 中找不到执行此操作的例程。
有谁知道这样的事情是否存在? 或者有什么好的方法可以解决这个问题?
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 生成 required_max_path_length-1 节点数的所有节点组合 + 使用 G.has_edge(node_1, node_2) 在组合组或类似的东西中检查连通性,这似乎是一个非常糟糕的解决方案。
【问题讨论】:
-
小于2的路径怎么办?
-
这也是必需的,我正在编辑我的例子谢谢
-
看看
all_simple_paths。它允许您指定截止值。它仍然是 n^2 因为您需要指定每个开始和结束节点 -
我在考虑
all_simple_paths,但必须指定开始和结束节点让我觉得这是一个糟糕的解决方案。但是您是说使用itertools获得所有成对节点组合+all_simple_paths在每个节点组合之间以最大长度截止+过滤所有生成的路径以获得唯一性,对吗?我猜它会起作用,但我仍然想知道是否有更好的解决方案。 -
你不应该需要 itertools。
标签: python-3.x networkx enumeration