有向非巡回グラフ (DAG) で、あるノードと別のノードの間のすべてのパスを探しています。
ツリーは常に DAG ですが、DAG は必ずしもツリーではありません。違いは、循環が導入されない限り、ツリーのブランチは結合できず、分割のみが許可されるのに対し、DAG のブランチは一緒に流れることができることです。
find_all_paths()
あなたのソリューションは、「Python パターン - グラフの実装」のように見つけることができます。これを igraph で使用するには、少し調整が必要です。私は igraph をインストールしていませんが、モックを使用すると、これはうまくいくようです:
def adjlist_find_paths(a, n, m, path=[]):
"Find paths from node index n to m using adjacency list a."
path = path + [n]
if n == m:
return [path]
paths = []
for child in a[n]:
if child not in path:
child_paths = adjlist_find_paths(a, child, m, path)
for child_path in child_paths:
paths.append(child_path)
return paths
def paths_from_to(graph, source, dest):
"Find paths in graph from vertex source to vertex dest."
a = graph.get_adjlist()
n = source.index
m = dest.index
return adjlist_find_paths(a, n, m)
adjlist が頂点インデックスのリストのリストなのか、頂点オブジェクト自体のリストのリストなのかは、ドキュメントからは不明でした。リストには、adjlist を使用して単純化するためのインデックスが含まれていると想定しました。その結果、返されるパスは頂点インデックスに基づいています。代わりに必要な場合は、これらを頂点オブジェクトにマップし直すか、インデックスではなく頂点を追加するようにコードを調整する必要があります。