【发布时间】:2016-08-27 19:22:31
【问题描述】:
我有一个如下所示的 DAG: Example DAG
我想提取这张图中4个节点构成的所有路径。
我的预期结果应该是这样的:
N1 -> N2 -> N3 -> N4
N1 -> N2 -> N3 -> N5
N1 -> N3 -> N4 -> N5
N2 -> N3 -> N4 -> N5
我目前的尝试是这样的
def path_finder(n1):
paths = []
if DAG.has_node(n1):
for n2 in DAG.successors(n1):
for n3 in DAG.successors(n2):
for n4 in DAG.successors(n3):
paths.append([n1, n2, n3, n4])
return paths
我正在为每个节点调用这个函数。 DAG 是一个全局变量,更具体地说,它是一个 networkx 对象 (DAG = networkx.DiGraph() ) 这个幼稚的函数慢得可怜。有没有更有效的策略来做到这一点?
我看过问题20262712,但问题的作者以相当模糊的方式自行解决了。
谢谢
更新:
由于我找不到任何令人满意的算法来解决这个问题,我最终使用我的幼稚函数作为工作人员并行化了这项工作,同时将所有数据转储到队列中。我使用pool.imap_unordered 启动工作函数并聚合队列中的结果。它仍然很慢(5M 节点需要几个小时)。我还应该提供我正在处理的节点的平均程度的数据,因为这会影响我的工人运行的速度。但是,我暂时不提这个。
【问题讨论】:
-
注意 - 您链接的问题的答案中描述的回溯基本上是利用这样一个事实,即一旦您计算了节点的所有路径,如果您不需要再次这样做您再次遇到该节点(如果您已保存该数据)。我的回答以不同的方式使用它。
-
你能说一下你需要这个做什么吗?您确定需要列表而不是生成器吗?
-
这是我正在尝试开发的更大算法的一部分,用于在人类基因组中寻找特定的重复序列(基本上是一个由四个字母 A、T、G、C 组成的大字符串) .这里的每个节点都标记了特定重复的位置并确定了它们的距离。只有当它们的距离小于定义值时,节点才会连接。现在我想确定这个重复的块,因为它们在四个重复的任何组合中都是有意义的。
-
我想将所有路径转储到 HDF5 文件中。我希望这不会是一个快速的过程,因为我可能有多达 1 亿个节点。因此,我需要在所有昂贵的图形遍历之后转储。
-
我没有看到好的解决方案。你应该检查一下,但我怀疑你的运行时间是由
paths.append([n1, n2, n3, n4])控制的。如果是这样,您将无能为力。
标签: python algorithm graph networkx graph-traversal