我有一个DAG,看起来像这样: Example DAG如何在有向无环图中有效地找到由k个节点构成的所有路径?
我想提取在该图中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,但问题的作者用自己的方式自我解决。
感谢
UPDATE:
因为我无法得到任何满意的算法来解决这个问题,我结束了用我的天真功能作为一个工人,而所有的数据卸入队列并行工作。我使用pool.imap_unordered
启动工作人员功能并汇总队列中的结果。它仍然很慢(5M节点需要几个小时)。我还应该提供我正在处理的平均节点度数据,因为这会影响我的工作人员运行速度。但是,我现在就把它留在外面。
注意 - 您链接问题的答案中描述的回溯基本上利用了这样一个事实,即一旦您计算了节点中的所有路径,如果遇到该节点,则不需要再次执行该操作再次(如果你已经保存了这些数据)。我的答案以不同的方式使用这个。 – Joel
你能说一些你需要的吗?你确定你需要列表而不是发电机吗? – Joel
这是我试图开发的用于在人类基因组中寻找特定重复序列(基本上是由四个字母A,T,G,C组成的大字符串)的较大算法的一部分。这里的每个节点都标记了特定重复的位置并确定了它们的距离。节点仅在距离小于定义值时才连接。现在我想确定这个重复的块,因为它们可以在任何四个重复组合中有意义。 – Parashar