
数学、特にグラフ理論、およびコンピュータ科学において、有向非巡回グラフ(DAG)は、有向サイクルを持たない有向グラフです。つまり、頂点と辺(アークとも呼ばれる)から構成され、各辺はある頂点から別の頂点へと方向付けられており、その方向をたどっても閉じたループは形成されません。有向グラフがDAGであるのは、すべての辺の方向と整合する線形順序で頂点を配置することにより、位相的に順序付けできる場合に限ります。DAGは、生物学(進化、家系図、疫学)から情報科学(引用ネットワーク)、計算(スケジューリング)まで、数多くの科学的および計算的応用があります。
グラフは頂点と、頂点同士を結ぶ辺によって構成されます。頂点は、辺によってペアで結ばれるあらゆる種類のオブジェクトです。有向グラフの場合、各辺にはある頂点から別の頂点への方向があります。有向グラフにおけるウォークとは、(有限または無限の)シーケンスのことです。連続する各ペアが有向エッジで接続されている。パスとは、すべての頂点が異なるウォークである。サイクルとは、唯一の重複する頂点はつまり、最後の頂点が最初の頂点と等しいということです。有向非巡回グラフは、サイクルを持たない有向グラフです。[ 1 ] [ 2 ] [ 3 ]
DAG の到達可能性関係は、DAG の頂点上の部分順序 ≤ として形式化できます。この部分順序では、頂点uとvは、 DAG内にuからvへの有向パスが存在する場合、つまりu がvに到達できる場合(またはv がuから到達可能である場合)にのみ、 u ≤ vと順序付けられます。 [ 4 ]ただし、異なる DAG でも同じ到達可能性関係と部分順序が生じる場合があります。[ 5 ]例えば、2 つのエッジu → vとv → wを持つ DAG は、3 つのエッジu → v、v → w、およびu → wを持つ DAG と同じ到達可能性関係を持ちます。これらの DAG はどちらも同じ部分順序を生成し、その部分順序では頂点はu ≤ v ≤ wと順序付けられます。
DAG の推移閉包とは、DAG と同じ到達可能性関係を持つエッジが最も多いグラフのことです。DAGの到達可能性関係≤におけるすべての頂点ペア ( u , v ) に対してエッジu → vが存在するため、到達可能性関係≤をグラフ理論の用語に直接変換したものと考えることができます。部分順序を DAG に変換する同じ方法は、より一般的にも機能します。すべての有限部分順序集合( S , ≤)に対して、 Sのすべての要素に対応する頂点と≤のすべての要素ペアに対応するエッジを持つグラフは、自動的に推移閉 DAG となり、到達可能性関係として( S , ≤)を持ちます。このようにして、すべての有限部分順序集合を DAG として表現できます。

DAG の推移的縮小は、DAG と同じ到達可能性関係を持つ、辺の数が最も少ないグラフです。DAGの到達可能性関係≤の被覆関係にあるすべての頂点ペア ( u、v )に対して、辺u → vを持ちます。これは、 DAG にuからvへのより長い有向パスも含まれる辺u → vを破棄することによって形成される、DAG の部分グラフです。推移的閉包と同様に、推移的縮小は DAG に対して一意に定義されます。対照的に、非巡回的ではない有向グラフの場合、同じ到達可能性関係を持つ最小部分グラフが複数存在する可能性があります。[ 6 ]推移的縮小は、同じ順序を表す他のグラフよりも辺の数が少ないため、グラフの描画が単純になるため、それが表す部分順序を視覚化するのに役立ちます。部分順序のハッセ図は、推移的縮小の描画であり、すべての辺の向きは、辺の開始頂点を終了頂点よりも低い位置に配置することによって示されます。[ 7 ]
有向グラフのトポロジカル順序とは、頂点をシーケンスに並べた順序であり、すべてのエッジについて、そのエッジの開始頂点がシーケンスの終了頂点よりも前に現れるようにする。トポロジカル順序を持つグラフはサイクルを持つことができない。なぜなら、サイクルの最初の頂点へのエッジは間違った方向に向けられなければならないからである。したがって、トポロジカル順序を持つすべてのグラフは非巡回グラフである。逆に、すべての有向非巡回グラフは少なくとも1つのトポロジカル順序を持つ。したがって、トポロジカル順序の存在は、有向非巡回グラフの同等の定義として使用できる。それらはまさにトポロジカル順序を持つグラフである。[ 2 ] 一般に、この順序は一意ではない。DAGは、すべての頂点を含む有向パスを持つ場合に限り一意のトポロジカル順序を持ち、その場合、順序はパスに頂点が現れる順序と同じである。[ 8 ]
DAG の位相順序の族は、DAG の到達可能性関係の線形拡張の族と同じであるため、 [ 9 ]同じ部分順序を表す任意の 2 つのグラフは同じ位相順序の集合を持つ。
有向非巡回グラフの数を数えるグラフ列挙問題は、Robinson (1973) によって研究された。[ 10 ] n個のラベル付き頂点 を持つ DAG の数( n = 0, 1, 2, 3, …、これらの数が DAG のトポロジカル順序に現れる順序に制限なし) は、
これらの数値は漸化式によって計算できる。
エリック・W・ワイススタインは、[ 11 ]同じ数がすべての固有値が正の実数である (0,1) 行列の数を数えることを証明した。証明は全単射である。行列AがDAG の隣接行列であるのは、 A + Iがすべての固有値が正である (0,1) 行列である場合のみである。ここで、 I は単位行列を表す。DAG は自己ループを持つことができないため、その隣接行列は対角成分がゼロでなければならない。したがって、Iを追加しても、すべての行列係数が 0 または 1 であるという性質は維持される。[ 12 ]
マルチツリー(強曖昧性のないグラフまたはマングローブとも呼ばれる)は、任意の2つの頂点間に有向パスが最大で1つしかないDAGである。言い換えれば、任意の頂点から到達可能な部分グラフが無向木を誘導するDAGである。[ 13 ]
ポリツリー(有向木とも呼ばれる)は、無向木の辺の向きを変えることによって形成されるマルチツリーである。[ 14 ]
樹状構造とは、無向木の辺を特定の頂点(樹状構造の根と呼ばれる)から離れる方向に向けることによって形成される多木構造のことである。
トポロジカルソートは、与えられたDAGのトポロジカル順序を見つけるアルゴリズムの問題です。これは線形時間で解くことができます。[ 15 ]トポロジカルソートのためのKahnのアルゴリズムは、頂点の順序を直接構築します。部分的に構築されたトポロジカル順序にまだ含まれていない他の頂点からの入力エッジを持たない頂点のリストを保持します。最初は、このリストは入力エッジがまったくない頂点で構成されます。次に、このリストから1つの頂点を繰り返し部分的に構築されたトポロジカル順序の末尾に追加し、その隣接頂点をリストに追加する必要があるかどうかを確認します。すべての頂点がこのように処理されると、アルゴリズムは終了します。[ 16 ]あるいは、深さ優先探索グラフの走査の後順番号付けを反転することによって、トポロジカル順序を構築することもできます。[ 15 ]
与えられた有向グラフがDAGであるかどうかは、線形時間でチェックすることも可能で、トポロジカル順序付けを試み、各エッジについて結果として得られる順序付けが有効かどうかをテストする方法[ 17 ]、または、一部のトポロジカルソートアルゴリズムでは、アルゴリズムがエラー条件を満たさずにすべての頂点を正しく順序付けすることを検証する方法[ 16 ]がある。
任意の無向グラフは、頂点の全順序を選択し、その順序の早い端点から遅い端点まですべての辺を方向付けることで、DAG にすることができます。結果として得られる辺の向きは、非巡回向きと呼ばれます。異なる全順序で同じ非巡回向きが得られる場合があるため、n頂点のグラフはn !個未満の非巡回向きを持つ可能性があります。非巡回向きの数は| χ (−1) |に等しく、ここでχは与えられたグラフの彩色多項式です。 [ 18 ]

任意の有向グラフは、フィードバック頂点集合またはフィードバック弧集合(それぞれ、すべてのサイクルに接する頂点または辺の集合)を削除することによって、DAG にすることができます。ただし、そのような最小の集合を見つけるのはNP 困難です。 [ 19 ]任意の有向グラフは、その強連結成分をそれぞれ単一のスーパー頂点に縮約することによって、その凝縮と呼ばれる DAG に変換することもできます。 [ 20 ]グラフがすでに非巡回である場合、その最小のフィードバック頂点集合とフィードバック弧集合は空であり、その凝縮はグラフ自体です。
n個の頂点とm個のエッジを持つ与えられた DAG の推移閉包は、各頂点からの到達可能性を幅優先探索または深さ優先探索のいずれかを使用してテストすることにより、 O ( mn )の時間で構築できます。 [ 21 ]あるいは、行列乗算アルゴリズムの指数ω < 2.373 であるO ( n ω )の時間で解くこともできます。これは、密グラフのO ( mn )の上限に対する理論的な改善です。[ 22 ]
これらの推移閉包アルゴリズムすべてにおいて、長さ2以上のパスが少なくとも1つ存在する頂点のペアと、長さ1のパスでしか接続できない頂点のペアを区別することが可能です。推移的縮小は、端点を結ぶ唯一のパスである長さ1のパスを形成するエッジで構成されます。したがって、推移的縮小は推移閉包と同じ漸近時間で構築できます。[ 23 ]
閉包問題は、頂点重み付き有向非巡回グラフを入力として受け取り、閉包(頂点の集合Cからどの辺も出ないような集合C )の最小(または最大)重みを求めます。この問題は、非巡回性の仮定なしに有向グラフに対して定式化できますが、この場合、グラフの縮約に関する同じ問題と同等であるため、より一般的なものではありません。最大フロー問題への還元を用いることで、多項式時間で解くことができます。[ 24 ]
トポロジカル順序の原理に基づき、一般的なグラフではなくDAGに適用すると、一部のアルゴリズムはより単純になります。たとえば、DAGでは、頂点をトポロジカル順序で処理し、各頂点のパス長をその頂点への任意の入力エッジを介して得られる最小または最大の長さとして計算することで、与えられた開始頂点からの最短パスと最長パスを線形時間で見つけることができます。[ 25 ]対照的に、任意のグラフでは、最短パスにはダイクストラ法やベルマン・フォード法などのより遅いアルゴリズムが必要になる場合があり、[ 26 ]任意のグラフにおける最長パスを見つけるのはNP困難です。 [ 27 ]
部分順序の有向非巡回グラフ表現は、順序制約のあるタスクシステムのスケジューリングにおいて多くの応用例がある。 [ 28 ]この種の重要な問題のクラスは、スプレッドシートのセルの 1 つが変更された後のセル、またはコンピュータ ソフトウェアのソース コードが変更された後のオブジェクト ファイル など、更新が必要なオブジェクトの集合に関するものである。この文脈では、依存グラフは、更新される各オブジェクトに対応する頂点と、一方のオブジェクトが他方のオブジェクトよりも先に更新される必要がある場合に 2 つのオブジェクトを接続するエッジを持つグラフである。このグラフのサイクルは循環依存と呼ばれ、サイクルに関係するタスクを一貫してスケジュールする方法がないため、一般には許可されない。循環依存のない依存グラフは DAG を形成する。[ 29 ]
例えば、スプレッドシートのセルが1つ変更されると、変更されたセルに直接的または間接的に依存する他のセルの値を再計算する必要があります。この問題では、スケジュールするタスクは、スプレッドシートの個々のセルの値の再計算です。依存関係は、あるセルの式が別のセルの値を使用する場合に発生します。このような場合、使用される値は、それを使用する式よりも先に再計算する必要があります。依存関係グラフをトポロジー的に順序付けし、このトポロジー順序を使用してセルの更新をスケジュールすると、セルごとに1回の評価だけでスプレッドシート全体を更新できます。[ 30 ]タスクの順序付けに関する同様の問題は、プログラムコンパイル用のメイクファイル[ 30 ]や、低レベルのコンピュータプログラム最適化のための命令スケジューリング[ 31 ]でも発生します。

スケジュール制約のDAGベースの定式化は、DAGの初期アプリケーションの一つである大規模な人的プロジェクトの管理方法であるプログラム評価レビュー技法(PERT)でやや異なっています。この方法では、DAGの頂点は、実行すべき特定のタスクではなく、プロジェクトのマイルストーンを表します。代わりに、タスクまたはアクティビティは、タスクの開始と完了を示す2つのマイルストーンを接続するDAGのエッジで表されます。このような各エッジには、作業チームがタスクを実行するのにかかる時間の見積もりがラベル付けされています。このDAGの最長パスは、プロジェクトのクリティカルパス、つまりプロジェクトの総時間を制御するパスを表します。個々のマイルストーンは、その頂点で終わる最長パスの長さに応じてスケジュールできます。[ 32 ]
有向非巡回グラフは、処理要素のネットワークを表すために使用できる。この表現では、データは入力エッジを通して処理要素に入り、出力エッジを通して要素から出る。
例えば、電子回路設計では、静的組み合わせ論理ブロックは、入力の関数を計算する論理ゲートの非巡回システムとして表現できます。ここで、関数の入力と出力は個々のビットとして表現されます。一般に、これらのブロックの出力は、非巡回特性を維持するレジスタまたは状態要素によってキャプチャされない限り、入力として使用することはできません。[ 33 ]紙またはデータベース上の電子回路図は、インスタンスまたはコンポーネントを使用して下位レベルのコンポーネントへの有向参照を形成する有向非巡回グラフの形式です。電子回路自体は、必ずしも非巡回または有向ではありません。
データフロープログラミング言語は、データストリームに対する操作のシステムと、一部の操作の出力と他の操作の入力との間の接続を記述します。これらの言語は、同じ非巡回的に接続された操作の集合が多数のデータ項目に適用される反復的なデータ処理タスクを記述するのに便利です。これらは並列アルゴリズムとして実行でき、各操作は別の入力セットが利用可能になるとすぐに並列プロセスによって実行されます。[ 34 ]
コンパイラでは、直線コード(つまり、ループや条件分岐のないステートメントのシーケンス)は、コード内で実行される各算術演算の入力と出力を記述するDAGで表現されることがあります。この表現により、コンパイラは共通部分式の除去を効率的に実行できます。[ 35 ]より高いレベルのコード編成では、非巡回依存性の原則は、大規模ソフトウェアシステムのモジュールまたはコンポーネント間の依存関係が有向非巡回グラフを形成する必要があると述べています。[ 36 ]
フィードフォワードニューラルネットワークもその一例です。
頂点が特定の時間に発生するイベントを表し、辺が常に前の時間の頂点から後の時間の頂点を指しているグラフは、必然的に有向かつ非巡回です。巡回がないのは、グラフ内の任意の有向パスをたどると頂点に関連付けられた時間が常に増加するため、パス上の頂点に戻ることができないからです。これは、因果関係とはイベントが未来にのみ影響を与え、過去には決して影響を与えないことを意味するという私たちの自然な直感を反映しており、したがって因果ループは存在しません。この種の有向非巡回グラフの例としては、量子重力に対する因果集合アプローチで見られるものがありますが、この場合、考慮されるグラフは推移的に完全です。以下のバージョン履歴の例では、ソフトウェアの各バージョンは一意の時間に関連付けられており、通常はバージョンが保存、コミット、またはリリースされた時間です。以下の引用グラフの例では、ドキュメントは一度に公開され、古いドキュメントのみを参照できます。
時には、イベントは特定の物理的な時間とは関連付けられていないことがあります。イベントのペアが純粋に因果関係にある場合、つまりエッジがイベント間の因果関係を表す場合、有向非巡回グラフが得られます。 [ 37 ]例えば、ベイジアンネットワークは、有向非巡回グラフの頂点として確率的イベントのシステムを表し、イベントの尤度はDAG内の先行イベントの尤度から計算できます。[ 38 ]この文脈では、 DAGのモラルグラフは、同じ頂点のすべての親の間に(無向)エッジを追加し(結婚と呼ばれることもあります)、すべての有向エッジを無向エッジに置き換えることによって作成される無向グラフです。[ 39 ]同様の因果構造を持つ別のタイプのグラフは影響図であり、その頂点は決定または未知の情報のいずれかを表し、そのエッジはある頂点から別の頂点への因果的影響を表します。[ 40 ]例えば疫学では、これらの図は介入のさまざまな選択肢の期待値を推定するためによく使用されます。[ 41 ] [ 42 ]
その逆もまた真である。つまり、有向非巡回グラフで表されるあらゆるアプリケーションには因果構造が存在し、それは明示的な順序または時間(例)であるか、グラフ構造から導き出せる順序のいずれかである。これは、すべての有向非巡回グラフには位相順序が存在する、すなわち、頂点をある順序に並べる方法が少なくとも1つあり、その順序に沿ってすべての辺が同じ方向を向くということである。

家系図は、各家族構成員を頂点とし、各親子関係を辺とする有向非巡回グラフと見なすことができる。[ 43 ]名前とは裏腹に、これらのグラフは必ずしも木構造ではない。親族間の結婚(つまり、子供が母親側と父親側の両方に共通の祖先を持つ)によって家系図が崩壊する可能性があるためである。[ 44 ]母系継承(母娘関係)と父系継承(父息子関係)のグラフは、このグラフ内の木構造である。誰も自分の祖先になることはできないため、家系図は非巡回グラフである。[ 45 ]
Gitなどの分散型リビジョン管理システムのバージョン履歴は、一般的に有向非巡回グラフの構造を持ち、各リビジョンに対応する頂点と、直接派生したリビジョンのペアを接続するエッジがあります。マージがあるため、これらは一般的にツリーではありません。[ 46 ]
計算幾何学における多くのランダム化アルゴリズムでは、アルゴリズムは、構造に対する一連の変更の過程における幾何学的構造のバージョン履歴を表す履歴DAGを保持します。たとえば、ドロネー三角形分割のランダム化増分アルゴリズムでは、各点が追加されるたびに1つの三角形を3つのより小さな三角形に置き換えること、および三角形のペアを別の三角形のペアに置き換える「反転」操作によって三角形分割が変更されます。このアルゴリズムの履歴DAGには、アルゴリズムの一部として構築された各三角形の頂点と、各三角形からそれを置き換える他の2つまたは3つの三角形へのエッジがあります。この構造により、点位置クエリに効率的に回答できます。ドロネー三角形分割内のクエリ点qの位置を見つけるには、履歴DAG内のパスをたどり、各ステップでqを含む置換三角形に移動します。このパスで最後に到達する三角形は、 qを含むドロネー三角形でなければなりません。[ 47 ]
引用グラフでは、頂点は単一の出版日を持つ文書です。エッジは、ある文書の書誌から、必然的にそれより前の文書への引用を表します。古典的な例は、1965年の論文「科学論文のネットワーク」[ 48 ]で指摘された学術論文間の引用です。この論文は、後に引用ネットワークの最初のモデルであるプライスモデル[ 49 ]を作成しました。この場合、論文の引用数は、引用ネットワークの対応する頂点の入次数に等しくなります。これは、引用分析において重要な尺度です。裁判所の判決も別の例であり、裁判官は、ある事件における結論を、以前の事件で下された他の判決を想起することによって裏付けています。最後の例は特許であり、特許は、現在の特許請求に関連する以前の先行技術、つまり以前の特許を参照する必要があります。有向非巡回グラフの特別な特性を考慮に入れることで、ネットワーク分析を用いた多くの研究で考慮される一般的なグラフを分析する際には利用できない手法で引用ネットワークを分析することができます。たとえば、推移的縮約は、さまざまなアプリケーションで見られる引用分布に関する新しい洞察を与え、さまざまなコンテキストで引用ネットワークを作成するメカニズムの明確な違いを強調します。[ 50 ]もう1つの手法は、引用リンクをたどり、特定の引用グラフで最も重要な引用チェーンを提案するメインパス分析です。
プライスモデルは引用ネットワークの現実的なモデルとしては単純すぎるが、その特性のいくつかを解析的に解くには十分単純である。これらの多くは、プライスモデルの無向バージョンであるバラバシ・アルバートモデルから得られる結果を使用することで見つけることができる。しかし、プライスモデルは有向非巡回グラフを与えるため、有向非巡回グラフに固有の特性の解析的計算を探す際には有用なモデルとなる。例えば、ネットワークに追加されたn番目のノードからネットワークの最初のノードまでの最長パスの長さは、[ 51 ]のようにスケーリングする。。
有向非巡回グラフは、シーケンスの集合のコンパクトな表現としても使用できます。この種のアプリケーションでは、パスが与えられたシーケンスを形成するDAGを見つけます。多くのシーケンスが同じサブシーケンスを共有する場合、これらの共有サブシーケンスはDAGの共有部分で表現できるため、すべてのシーケンスを個別にリストする場合よりも少ないスペースで表現できます。たとえば、有向非巡回ワードグラフは、単一のソースを持ち、エッジが文字または記号でラベル付けされた有向非巡回グラフによって形成されるコンピュータサイエンスのデータ構造です。このグラフのソースからシンクへのパスは、英語の単語などの文字列の集合を表します。 [ 52 ]任意のシーケンスの集合は、シーケンスの各接頭辞に対してツリーの頂点を形成し、これらの頂点の1つの親が1つ少ない要素を持つシーケンスを表すようにすることで、ツリー内のパスとして表現できます。このようにして文字列の集合に対して形成されたツリーは、トライと呼ばれます。
同様に、二分探索木は、パスがキーのソートされた順序を表すルート付きDAGと見なすことができますが、より複雑なDAGに見られるパスマージ圧縮はありません。[ 53 ]有向非巡回単語グラフは、パスが分岐して再結合することを可能にすることでトライ木よりもスペースを節約し、同じ接尾辞を持つ単語のセットを単一のツリー頂点で表すことができます。[ 54 ]
パスのファミリーを表すために DAG を使用するという同じ考え方は、バイナリ関数を表すための DAG ベースのデータ構造であるバイナリ決定図 [ 55 ] [ 56 ] にも見られます。バイナリ決定図では、各非シンク頂点にはバイナリ変数の名前がラベル付けされ、各シンクと各エッジには 0 または 1 がラベル付けされます。変数への任意の真偽割り当てに対する関数値は、単一のソース頂点から始まるパスをたどってシンクで見つかる値です。このパスは、各非シンク頂点で、その頂点の変数の値でラベル付けされた出力エッジをたどります。有向非巡回ワードグラフがトライの圧縮形式と見なせるのと同様に、バイナリ決定図は、残りのすべての決定の結果に一致するときにパスが再結合できるようにすることでスペースを節約する決定木の圧縮形式と見なすことができます。 [ 57 ]
{{cite web}}: CS1 maint: 設定の上書き (リンク){{cite book}}: CS1 maint: 上書きされた設定 (リンク) セクション 22.4、トポロジカルソート、pp. 549–552。{{cite web}}: CS1 maint: 設定の上書き (リンク)