16

美的グラフとして整理する必要のあるオブジェクトのリストがあります。私の現在のアプローチにはIronPythonと遺伝的アルゴリズムが含まれますが、これには時間がかかりすぎます。

Graphviz、QuickGraph、Graph#を読んでいますが、視覚化の部分は必要ありません。x/y座標を指定してノードを表示するアプリをすでに持っています。杉山アルゴリズムと力ベースのアルゴリズムファミリーはどちらも心地よいグラフを出力する傾向があると言われていますが、かなり厳しいソースコードがないと、画像の代わりに座標を出力する.NETライブラリを見つけることができないようです。ハッキング。

誰かがライブラリやアルゴリズムなどをお勧めできますか?

4

6 に答える 6

28

さまざまな長所と短所を備えたいくつかのオプションがあります-あなたはこれをふるいにかけることができます。これはあなたが探していることを多かれ少なかれ実行するソフトウェアのリストです。

以前はオープンソースソリューションを見つけるのが困難でしたが、かつて商業的にライセンスされていたMSAGLは現在オープンソースのようです。

Graph#QuickGraphの違いは、後者はグラフの走査と操作のプリミティブを提供しますが、レイアウトアルゴリズムを提供しないことです。Graph#には利用可能なすべてのソースがあり、私が(簡単に)見てきたことから、レイアウトエンジンと図面の実装がきちんと分離されています。

Graphvizは純粋なC/C ++で記述されており、かなりモノリシックであり、グラフを説明するテキストファイルを入力として受け取り、ベクトルベースとラスターベースの両方のさまざまなタイプの出力を生成します。プラグインレイアウトエンジンとしてはあまり適していませんが、必要な入力ファイルをシェルアウトして提供し、出力を解析することで使用できます。ただし、あまりクリーンなソリューションではありません。

OGDFと呼ばれるものもあります。完全にC++で記述されていますが、レイアウトエンジンライブラリとして使用するように設計されており、このための適切に構造化されたインターフェイスを備えています。それがあなたが興味を持っているのであれば、それは最適化された杉山を含む様々なレイアウトアルゴリズムをサポートします。

杉山に最適化されたバリエーションを実装することに興味がある場合は、アルゴリズムのきちんとした説明を使用して、いつでも自分でロールすることができます:)

ただし、最終的には、ライブラリを決定する前に、どのタイプのレイアウトを使用するかを決定する必要があります。

于 2009-08-09T06:40:14.900 に答える
5

Microsoft Researchには、この取り組みを支援する可能性のある自動グラフレイアウトエンジンがあります。

あなたはここでそれについてもっと読むかもしれません:

http://research.microsoft.com/en-us/downloads/f1303e46-965f-401a-87c3-34e1331d32c5/

于 2009-08-08T23:16:52.163 に答える
4

誰かが同様の問題に直面する場合に備えて。視覚化エンジンから分離された多くのレイアウトアルゴリズムを組み込んだGraphXfor.NETオープンソースプロジェクトがあります。したがって、ロジックライブラリを取得して計算を実行し、独自のvisツールで使用する座標パックを取得できます。

https://github.com/panthernet/GraphX

于 2018-02-16T15:26:14.877 に答える
3

yFilesには、フォースディレクテッド(「Organic」と呼ばれる)とSugiyamaベース(「Hierarchic」と呼ばれる)の両方のレイアウトアルゴリズムの非常に洗練された実装があります。これらは、Java、.net、Silverlight、Flex、およびJavascriptのビューアレス実装を提供します。座標を取得するためのAPIは、ここからオンラインで入手できます。

アルゴリズムとその品質は、無料のyEd Graph Editorアプリケーションでテストできますが、ライブラリは市販されているだけです。

于 2012-07-18T07:36:06.763 に答える
2

modslシステムの一部としてJavaにSugiyamaレイアウトの実装、Apacheライセンスがあります。ソースはこちらです。

私はそれを有向グラフに基づいたObjective-C/Objective-C++の混合実装にかなり簡単に変換することができました。

于 2012-08-14T18:17:24.650 に答える
2

このようにしてノードの座標を取得しました

namespace GleeTest
{
    class GleeTest
    {

        static void Main() {
            Microsoft.Glee.GleeGraph oGleeGraph = new Microsoft.Glee.GleeGraph();

            Microsoft.Glee.Splines.ICurve oCurve =
               Microsoft.Glee.Splines.CurveFactory.CreateEllipse(
                   1, 1,
                   new Microsoft.Glee.Splines.Point(0, 0)
                   );
            Microsoft.Glee.Node strNode1 = new Microsoft.Glee.Node("Circle", oCurve);

            Microsoft.Glee.Node strNode3 = new Microsoft.Glee.Node("Diamond", oCurve);
            Microsoft.Glee.Node strNode4 = new Microsoft.Glee.Node("Standard", oCurve);
            Microsoft.Glee.Node strNode2 = new Microsoft.Glee.Node("Home", oCurve);

            oGleeGraph.AddNode(strNode1);
            oGleeGraph.AddNode(strNode2);
            oGleeGraph.AddNode(strNode3);
            oGleeGraph.AddNode(strNode4);

            Microsoft.Glee.Edge oGleeEdge1 =
               new Microsoft.Glee.Edge(strNode1, strNode2);
            Microsoft.Glee.Edge oGleeEdge2 =
            new Microsoft.Glee.Edge(strNode2, strNode1);
            Microsoft.Glee.Edge oGleeEdge3 =
            new Microsoft.Glee.Edge(strNode2, strNode2);
            Microsoft.Glee.Edge oGleeEdge4 =
            new Microsoft.Glee.Edge(strNode1, strNode3);
            Microsoft.Glee.Edge oGleeEdge5 =
            new Microsoft.Glee.Edge(strNode1, strNode4);
            Microsoft.Glee.Edge oGleeEdge6 =
          new Microsoft.Glee.Edge(strNode4, strNode1);


            oGleeGraph.AddEdge(oGleeEdge1);
            oGleeGraph.AddEdge(oGleeEdge2);
            oGleeGraph.AddEdge(oGleeEdge3);
            oGleeGraph.AddEdge(oGleeEdge4);
            oGleeGraph.AddEdge(oGleeEdge5);
            oGleeGraph.AddEdge(oGleeEdge6);

            oGleeGraph.CalculateLayout();


            System.Console.WriteLine("Circle position  " + oGleeGraph.FindNode("Circle").Center.X + "," + oGleeGraph.FindNode("Circle").Center.Y);
            System.Console.WriteLine("Home position = " + oGleeGraph.FindNode("Home").Center.X + "," + oGleeGraph.FindNode("Home").Center.Y);
            System.Console.WriteLine("Diamond position = " + oGleeGraph.FindNode("Diamond").Center.X + "," + oGleeGraph.FindNode("Diamond").Center.Y);
            System.Console.WriteLine("Standard position = " + oGleeGraph.FindNode("Standard").Center.X + "," + oGleeGraph.FindNode("Standard").Center.Y);




        }

    }
}
于 2013-09-23T08:35:15.607 に答える