グラフの導関数は隣接リストに関連していますか?


14

Conor McBrideの作品の一部であるDiffDissectは、データ型の導関数を「ワンホー​​ルコンテキストの型」に関連付けます。つまり、型の導関数を取得すると、任意の時点で内部からデータ型がどのように見えるかを示すデータ型が残ります。

したがって、たとえば、リストがある場合(Haskellに)

data List a = [] | a : List a

これは

data List a = 1 + a * List a

少し数学的な魔法を通して、導関数は

data ListDeriv a = List a * List a

これは、リスト内の任意の時点で、左側にリストがあり、右側にリストがあることを意味すると解釈されます。派生データ構造を使用して、元のリストを圧縮できます。

今、私はグラフで似たようなことをすることに興味があります。グラフの一般的な表現は、頂点とエッジのセットです。これらは、次のようなデータ型で単純に実装できます。

data Gr a b i = Gr [(i,a)] [(i,i,b)]

私がそれを正しく理解していれば、グラフのインデックスに関するこのデータ型の導関数はi次のようになります。

data GrDeriv a b i = d/di (Gr a b i)
     = d\di ( [a*i] * [b*i^2] )
     = (d\di [a*i]) * [b*i^2] ) + [a*i]*(d/di [b*i^2])
     = (a* [a*i] * [a*i]) * [b*i^2] ) 
       + [a*i] * (2*b*i) *[b*i^2]*[b*i^2])
     = InNodes { nodesLeft :: [(a,i)]
               , nodeLbl :: a
               , nodesRight :: [(a,i)]
               , edges :: [(b,i,i)] }
     | InEdges { nodes :: [(a,i)]
               , adjNode :: Either (b,i) (b,i)
               , edgesLeft :: [(b,i,i)]
               , edgesRight :: [(b,i,i)] }

これは、デリバティブのプロダクトルールとチェーンルールを使用することで得られました。おそらくいくつかのエラーはありますが、一般的なスキームに従っているようです。この構造では、ノード(InNodesコンストラクター)またはエッジ(エッジ内)に焦点を合わせ、関連データが表示される場所を指定します。

しかし、これは私が望んでいたことではありません。Martin Erwigs Functional Graph Libraryのインターフェースにより密接に関連する構成体を期待していました。具体的には、ノードのラベルと、発信用と着信用の2つの隣接リストを表すコンテキストをノードで表示したいと思います。

Node a b = ([(i,b)],a,[(i,b)])

ただし、隣接関係の表現にはa、各穴の位置での派生物、孤立したラベル、各エッジの隣接関係の表現/解剖と共通の用語があるため、希望があります。

導関数は元のものと同じ関数ではないが、導関数の統合は(kindof)であるため、導関数をノードコンテキストのコレクションに変換するのに役立つ何らかの統合アナログがありますか?元の構造を復元するための直接的な統合ではなく、元の構造と同等ですが、よりアルゴリズムに適した表現の構造です。

存在する場合、リレーションシップタイプ構造が簡単な「頂点とエッジのセット」言語で指定でき、その構造を操作するための効率的なライブラリを導出できることを願っています。このような実装は、「グラフ理論を超えて」構造を研究するために使用できます:ハイパーグラフ、単体の複合体...

そう。このアイデアは実現可能ですか?有用?この種のことについて、私がもっと読むことができる研究はありましたか?

補遺

Curtis Fがコメントしたように、ノードとエッジのセットは正確なグラフではありません。ただし、すべてのグラフはそのように表すことができ、十分に一般的な表現であることがわかります。私は、さまざまな方法で無線ネットワークの最適化にグラフ理論を適用する研究で使用される非常に粗い仕様)を見てきました。以下は、オープンアクセスの例、DRAND *です。これにより、プレゼンテーションと、研究に基づいてソフトウェアを実装する方法との間のリンクは何かという疑問が生じます。G=VE

そうは言っても、入力仕様をから他の何かに変更することに完全に反対するわけではありません。たとえば、インデックスタイプI、ノードラベルV、エッジラベルEを指定します。その場合、グラフは(およそ)インデックスからラベルおよびエッジリストへの関数です。G=VEVE

G=VE

これは、次のように表現できると確信しています(カテゴリー理論?)

(1)G=VE

または

G=VE

1

G=lnVEVElnEVE

私はそれがいくらかの約束を示すと思うが、私はさらに進むために洗練されていない。接続をさらに調査するための作業が必要だと思います。

*リンクが切れた場合、引用:リー、インジョンなど 「DRAND:ワイヤレスアドホックネットワーク用の分散ランダム化TDMAスケジューリング」。IEEE Transactions on Mobile Computing 8.10(2009):1384-1396。


研究用に提供したリンクは無効です。DOIやそれが発行されたジャーナルなど、より永続的なリンクを提供できますか?
カーティスF

回答:


5

Grエッジインデックスは実際の頂点インデックスである必要はないため、明らかにグラフではない多くのインスタンスが含まれているため、タイプは実際にはグラフに対応していません。

例えば、

V={AB}E={CDe}

はグラフではありませんが、あなたのタイプでは

Gr [(1, A), (2, B)] [(3, 4, e)]

むしろ、あなたGrは文字通りラベル付けされたインデックスのリストとラベル付けされたインデックスのペアの別個の、無関係なリストに対応します。これがGr、グラフの「穴」に対応しない、そのような「リテラル」導関数を取得する理由です。

また、頂点とエッジの順序を気にするという不幸な問題もあります(nodesLeft/RightとのedgesLeft/Right区別で表示されます)が、これはSetリストの代わりにを使用することで修正できます。


Haskellで表現されたタイプは、(空でない)グラフにより密接に対応すると思います。

data Graph v e = Lone v | Joined v (Graph (v, ([e], [e])) e)

単純にするために、代わりに完全で単純な無向グラフを検討します。

data Graph v e = Lone v | Joined v (Graph (v, e) e)

(完全性を緩和するには、e = Boolエッジの存在をマークしてください)

Graphは再帰的であることに注意してください(実際、パラメーター的に再帰的です)。これにより、頂点リストと組み合わせた隣接リストだけでなく、グラフだけにタイプを制限できます。

より代数的に書かれ、

Gve=v+vGvee

evG

Gv=v+vGve

繰り返し展開することにより、不動点を取得します

Gv=v1e12+v2e22+v3e32+v4e42+

(完全な)グラ​​フは次のいずれかであるため、これは理にかなっています

  • 1つの頂点とエッジなし
  • 2つの頂点と1つのエッジ
  • 3つの頂点と3つのエッジ
  • 4つの頂点と4つの2 = 6エッジを選択
  • ....

kGkv=vkek2Gv=G1v+G2v+

派生物を持っています

ddvGv==1Gv

Gkv=ddv[vkekk12]=kvk1ekk12

Gk1v=vk1ek1k22Gkv=Gk1vkek1

kk1k1k1k

data SimpleGraph v e = Lone v | Joined v (SimpleGraph (v, e) e)

data SimpleGraphHole v e = Empty
                         | InsertLater v (SimpleGraphHole (v, e) e)
                         | InsertHere (SimpleGraph (v, e) e)

このグラフの修正順序

このバージョンのGraphデータ構造は基本的にリンクリストであるため、頂点の順序をエンコードします。Setを使用して隣接リストバージョンで修正できますが、ここではそれほど直接的なものではありません。

ツリーのデータ構造を変更して同じ種類のパラメトリックな再帰を行うことができ、ルートが「ヘッド」の役割を果たしていると思いますSimpleGraph。結果のツリーセットのインターフェースにより、順序/基礎となる構造は見えなくなります(高速更新に興味がない場合は標準的ですらあります)。

提案されたデリバティブ

派生型を提案しました。ラベルとインデックスを統合するように変更します。([(v,e)], [(v,e)])

11ve2C+v1ve(v, [(v, e)])

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.