座標系で構成要素/依存関係の混合グラフを描画するための適切なアルゴリズムはありますか?


9

(言語アプリケーションの)混合した支持体/依存関係グラフを描画するアルゴリズムを探しています。このようなグラフには、2種類の頂点(トークン、ノード)と2種類のエッジ(階層型、非階層型)があります。

私は一般にグラフ理論とアルゴリズムに慣れていないので、この質問がこのサイトの研究レベルの要件などと衝突しないことを願っています。ただし、一般的にはcstheoryの範囲内である必要があります。

すべてのトークンは同じy座標で表示される必要があり、トークンをグループ化するノードやノードを構成要素にグループ化するy座標を動的に計算する必要があるため、グラフはボトムアップで描画する必要があります(私はそう思います)。たとえば、トークンへの最長パスを介して。

階層的なエッジ(トークン/ノードを構成要素にグループ化するために使用)には、最小数のベンドポイント(理想的には0)が必要ですが、交差の数も最小である必要があり、必要に応じて前の要件を上書きします。

非階層エッジ(依存関係に使用)には、最小数の交差があり、ベジェ曲線として描画される必要があります。

私が遭遇した次善の事は、ブッフハイム等によって記述されたアルゴリズムです。、ウォーカーのアルゴリズムを線形時間で実行するように改善しました。

私の質問を改善する必要がある場合は、私に知らせてください。ポインタについては、事前に感謝します。

編集:

コメントで指摘したように、基本的にはアルゴリズムによるデフォルトのグラフレイアウトが必要であり、長期的にはEclipse GEFの可能性の範囲内で編集および修正する必要があることを述べておきます。以前にGraphvizをGEFで動作させるためのオプションを検討しましたが、GEFから継承されたすべての編集機能を保持する実用的なソリューションはないようです。


アルゴリズムまたは既存のツールが必要ですか?Graphviz(graphviz.org)はこれを行うことができます。グラフを指定し、場合によってはいくつかのフォーマットオプション(さまざまな種類のノードとエッジ用)を指定すると、ツールは適切にレンダリングされたグラフを出力します。
デイブクラーク

@DaveClarke:ありがとう。Graphvizがこれを実行できることを知っています。残念ながら、[Eclipse Graphical Editing Framework](www.eclipse.org/gef)に基づくエディターでGraphvizを使用する可能性は現在のところないようです。したがって、私は実際のアルゴリズムを探しています。もちろん、GraphvizをGEFにプラグイン/移植する方法を誰かが知っている場合を除きます。
sd

OPがアルゴリズム(または仕様を取り込む問題の定式化)を探しているようです
Suresh Venkat

@SureshVenkat:はい、明確にしていただきありがとうございます。
sd

1
Qには編集についての言及はありませんが、コメントでgraphvizを拒否し、GEFで編集することを示しているようです。GEFは、他の「プラグイン」を構築できる一般的なビジュアル編集フレームワーク/ APIです。アルゴリズムを変更できるデフォルトのグラフレイアウトが必要なようです。それを反映するように質問を編集することを提案します。ちなみに、graphvizを使用して座標を生成し、それをグラフエディタに入力できると考えています。GEFグラフの編集については、たとえばGEFのプロフェッショナルなグラフレイアウトを
vzn

回答:


1

あなたは以下を望んでいるようです

  • グラフレイアウトアルゴリズム。多くのstdアルゴリズムは、通常、力に基づく方法を使用します。ノードは隠蔽的/魅力的な「ばね」によって接続され、平衡/低エネルギー状態は、(対応するグローバルに構築された力関連微分方程式の)反復の一部を通じて取得されます。アルゴリズムの出力は、ノードと(通常は)エッジの2次元または3次元の座標のセットです。
  • そのアルゴリズムの結果を手動で変更する機能。通常は「グラフエディター」と呼ばれます。これは、レイアウトアルゴリズムの座標から始まり、調整を可能にします。

re(1)最前線のソフトウェアはgraphvizのようです。re(2)たとえば、mathoverflowのこの質問「ベストグラフエディターとは」を参照してください

graphvizギャラリーの閲覧ここにあなたが望むものに似た2つのグラフタイプがあります。

ER図信号機

2種類のエッジがあると言います。単純な方法は、信号機の例のようにエッジを「前または後ろ」に向けることです。または、ERダイアグラムのように2つの方法でエッジにラベルを付けることができます。どちらの例も、異なる形状やラベル、またはシェーディングなどを使用した2つの異なるノードタイプを示しています。他のアプローチでは、カラーリングを使用します。

mathoverflow Q / Aが示すように、多くのグラフエディターがあります。graphvizのstdは「dotty」です。たとえば、Koutsofiousによるpdf "editing graphs with dotty "を参照してください。

グラフを作成するためのもう1つの手法は、場合によっては大きなグラフであり、構造の構成、たとえばクリーク分解を調べることです。

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