次のような 3 つのオブジェクト (Vertex、Edge、Graph) と 1 つの関数 (topo_sort) を持つ軽量のグラフ ライブラリを作成しました。
class DAGError(Exception): pass
def topo_sort(graph):
sorted_list = []
def visit(vertex):
nonlocal sorted_list
if vertex.idle:
raise DAGError('Graph has at least one cycle.')
if not vertex.done:
vertex.idle = True
for neighbor in vertex.vertices():
visit(neighbor)
vertex.done = True
vertex.idle = False
sorted_list.insert(0, vertex)
queue = [vertex for vertex in graph.vertices() if not vertex.done]
while queue:
visit(queue.pop(0))
return iter(sorted_list)
フラットな DAG を使用している場合、これは正常に機能しています。しかし、私が達成したいのは、私が描いたこの図でわかるように、メイン グラフにサブグラフ(またはネストされたグラフ)を追加することです。
これはまだ DAG なので、これで関数を実行すると、通常の topo_sort
出力は次のようになります。
V0, V3, V1, V5, V4, V8, V7, V12, V11, V13, V14, V2, V6, V10, V9, V15, V17, V16
ただし、サブグラフの頂点が処理される前に、サブグラフが依存するすべての頂点が「処理」される場合、私の好ましい出力は次のようになります。
V0, V1, V8, # vertices of maingraph
V3, V5, V4, V12 # vertices of subgraph_0
V7, V11, V13, # vertices of subgraph_1
V14 # vertex of subgraph_0
V2 # vertex of maingraph
V6, V10, V9, V15 # vertices of subgraph_2
V16, V17 # vertices of maingraph
しかし、次のリソースは見つかりませんでした。
- サブグラフの一部としてグラフの頂点を「マーク」または「保存」する方法は?
- サブグラフの依存関係に基づいて頂点をソートする方法(上記の例のように)?
- サブグラフを独立したグラフとして取得または処理する方法は?
私の問題を十分に詳しく説明できればと思いますが、何か不足している場合はお知らせください。不足している部分について質問を広げます。
前もって感謝します!
編集:
私はこれ(Boost Graph Library、BGL)を見つけましたが、私が抱えている非常によく似た(またはまったく同じ?)問題を解決しているように見えますが、C ++に慣れていないので、それがどのようになっているのかわかりません動作していて、正確には何をしているのか--しかし、私はこれをここに入れました。多分誰かが私の質問に答えるのに役立つと思うでしょう..
編集2:
Pythonだけでなく疑似コードも受け付けます!もちろん、既存のpythonライブラリがこれを知っていれば興味がありますが、graph-tools
たとえば、私はそのような巨大なライブラリを使用したくありません.