良いJavaグラフアルゴリズムライブラリ?[閉まっている]


237

グラフアルゴリズム用のJavaライブラリを使った経験がありましたか。私はJGraphを試してみましたが、大丈夫でした。Googleにはさまざまなものがあります。人々が実際に製品コードで正常に使用しているものや推奨するものはありますか?

明確にするために、私はグラフ/チャートを作成するライブラリを探していません。たとえば、最小スパニングツリー、クラスカルのアルゴリズムノード、エッジなど、グラフアルゴリズムを支援するライブラリを探しています。素敵なJava OO APIの構造。

回答:


108

JGraphを使用していた場合は、アルゴリズム用に設計されたJGraphTを試してみてください。その機能の1つは、JGraphライブラリを使用した視覚化です。まだ開発中ですが、かなり安定しています。JGraphTアルゴリズムの複雑さを少し前に分析しました。そのうちのいくつかは最速ではありませんが、自分で実装してグラフを表示する必要がある場合は、それが最良の選択かもしれません。グラフを操作して後で表示するアプリをすぐに作成しなければならなかったとき、私はそのAPIを使用することが本当に好きでした。


JGraphには、さまざまな分析関数jgraph.github.com/mxgraph/java/docs/index.htmlを含む分析パッケージが含まれています。
David

63

概要:

  • データ構造とアルゴリズムにもっと興味がある場合はJGraphT
  • 主な焦点が視覚化である場合はJGraph
  • JungyWorks、およびBFGは、人々が使用しようとした他のものです。
  • Prefuseはそのほとんどを書き直さなければならないので、ノーノーです。
  • 優れたデータ構造のみが必要な場合は、Googleグアバ
  • Apache Commons Graph。現在休止していますが、多くのアルゴリズムの実装を提供しています。実装されているアルゴリズムのリストについては、https: //issues.apache.org/jira/browse/SANDBOX-458を参照してください。これは、Jung、GraphT、Prefuse、jBPTとも比較されます。

それらの多くは非常に複雑です...ファクトリーメソッドなどを使用します。面接に備えて簡単なものが必要なだけです。何か案は?
SoftwareSavant

4
これらがあなたが探している仕事の種類よりも複雑な場合
maytham-ɯɐɥʇʎɐɯ

1
グラフのアルゴリズムはここで説明されていますgeeksforgeeks.org/graph-data-structure-and-algorithms with simple code
モッシュ

40

JGraphTをチェックして、非常にシンプルで強力なJavaグラフライブラリを確認してください。Javaグラフライブラリは非常によくできており、混乱を和らげるために、JGraphは異なります。ます。いくつかのサンプルコード

UndirectedGraph<String, DefaultEdge> g =
        new SimpleGraph<String, DefaultEdge>(DefaultEdge.class);

    String v1 = "v1";
    String v2 = "v2";
    String v3 = "v3";
    String v4 = "v4";

    // add the vertices
    g.addVertex(v1);
    g.addVertex(v2);
    g.addVertex(v3);
    g.addVertex(v4);

    // add edges to create a circuit
    g.addEdge(v1, v2);
    g.addEdge(v2, v3);
    g.addEdge(v3, v4);
    g.addEdge(v4, v1);


37

ジャングは視覚化に適したオプションであり、ランダムグラフの作成、再配線などのいくつかの異なるメカニズムを含む、かなり優れた利用可能なグラフアルゴリズムのセットも備えています。 。


パッケージhep.aida。*はLGPL(acs.lbl.gov/software/colt/license.html)です。これはcolt(jung.sourceforge.net/download.html)経由でインポートされます。これにより、ASFおよびESFの傘下のプロジェクトでJUNGが使用されなくなります。おそらくgithub fork github.com/rortian/jung2を使用して、その依存関係を削除する必要があります。github.com/rortian/jung2/commit/…は最後のCVSコミットをミラーリングしています。現在のコミットは視覚化機能を削除しているようです。
koppor 2013年

2010年以降リリースされていない、私はこのプロジェクトが放棄されたと思います
ヤシノ2017年

14

Apache Commonsはcommons-graphを提供しています。http://svn.apache.org/viewvc/commons/sandbox/graph/trunk/の下で 、ソースを検査できます。APIの使用例もSVNにあります。実装されているアルゴリズムのリストについては、https: //issues.apache.org/jira/browse/SANDBOX-458を参照してください。これは、Jung、GraphT、Prefuse、jBPTとも比較されます。

優れたデータ構造のみが必要な場合は、Googleグアバ

JGraphTは、多くのアルゴリズムが実装され、(私の意見では)優れたグラフモデルを持つグラフライブラリです。Helloworldの例。ライセンス:LGPL + EPL。

JUNG2は、JGraphTと同様のデータ構造を持つBSDライセンスライブラリでもあります。現在JGraphTにはないレイアウトアルゴリズムを提供します。最も最近では2010年からでコミットしたパッケージは、hep.aida.*(経由LGPLをあるコルトライブラリJUNGによってインポートされます)。これにより、ASFおよびESFの傘下のプロジェクトでJUNGが使用されなくなります。おそらくgithub forkを使用してその依存関係を削除する必要があります。コミットf4ca0cdは最後のCVSコミットをミラーリングしています。現在のコミットは視覚化機能を削除しているようです。コミットd0fb491cはを追加し.gitignoreます。

Prefuseはマトリックス構造を使用してグラフを格納しますが、これはスパースグラフではメモリ効率が良くありません。ライセンス:BSD

Eclipse Zestにはグラフレイアウトアルゴリズムが組み込まれており、SWTとは独立して使用できます。org.eclipse.zest.layouts.algorithmsを参照してください。使用されるグラフ構造はEclipse Draw2dの1つです。ノードは明示的なオブジェクトであり、Genericsを介して挿入されません(Apache Commons Graph、JGraphT、およびJUNG2で発生します)。



10

大学のプロジェクトで、yWorksのyFilesをいじってみたところ、APIが非常に優れていることがわかりました。


yFilesを使用して(商用ソフトウェアプラットフォームの一部として)データ項目間の相互依存関係を視覚化しました。実際にはグラフ分析アルゴリズムを使用していませんが、y.algoパッケージに必要なものが含まれているかどうかを確認します。yworks.com
products

2
yFilesはオープンソースではありませんが、商用ライセンスを提供しています
koppor

9

ブループリントをチェックしてください:

ブループリントは、プロパティグラフデータモデルのインターフェイス、実装、実装、およびテストスイートのコレクションです。ブループリントはJDBCに似ていますが、グラフデータベース用です。TinkerPopオープンソースソフトウェアスタック内で、Blueprintsは以下の基盤テクノロジーとして機能します。

パイプ:遅延したデータフローフレームワーク

Gremlin:グラフ探索言語

フレーム:オブジェクトからグラフへのマッパー

かまど:グラフアルゴリズムパッケージ

Rexster:グラフサーバー



7

JDSL(Javaのデータ構造ライブラリ)は、グラフアルゴリズムに慣れていれば十分です。 http://www.cs.brown.edu/cgc/jdsl/


このおかげで、私はそれに出くわすことはなかったでしょう。使っていますか?
Nick Fortescue、

1
はい、使用しています。多分4年前から使い始めました。これまでのところ、.NET用の移植版もあればいいのにと思います。
mr.sverrir、2009

残念ながら、jdsl.orgページは現在スパムページのようです。
ロスジャドソン

1
元の投稿のリンクを更新しました。ありがとう。
mr.sverrir

5

視覚化のために、私たちのグループはprefuseである程度成功しました。建築の床板とバブル図表を処理するように拡張しましたが、それほど不満はありませんでした。彼らには、非常によく似たAPIを使用するFlareと呼ばれる新しいFlexツールキットがあります。

更新:コメントに同意する必要があります。結局、prefuseの制限を回避するために多くのカスタム機能/作業を記述してしまいました。prefuseを使用して1日目からの進捗を示すことができたので、ゼロから始めた方が良かったとは言えません。一方、同じものの2番目の実装を行っている場合は、要件をよりよく理解しているため、prefuseをスキップすることがあります。


prefuseについてのあなたの個人的な考えは何でしたか?私の最後の仕事で、プロジェクトはそれを使い始めましたが、90%以上のバージョンのprefuseが書き直された(そして最適化され、新機能が追加された)バージョンになりました。
トーマス・オーエンス


5

グラフは次のように簡単に表すことができると確信するのもよいでしょう。

class Node {
   int value;
   List<Node> adj;
}

自分で興味深いと思うアルゴリズムのほとんどを実装します。グラフに関するいくつかの練習/学習セッションの途中でこの質問に当てはまる場合、それは検討するのに最適なライブラリです。;)

また、最も一般的なアルゴリズムの隣接行列を優先することもできます。

class SparseGraph {
  int[] nodeValues;
  List<Integer>[] edges;     
}

または一部の操作のマトリックス:

class DenseGraph {
  int[] nodeValues;
  int[][] edges;     
}


4

パフォーマンスが必要な場合は、Grphをご覧ください。ライブラリは、フランスの大学とCNRS / Inriaで開発されています。

http://www.i3s.unice.fr/~hogie/grph/

プロジェクトはアクティブで、反応的なサポートが提供されます!



0

ノード/エッジグラフライブラリではなくチャートライブラリを実際に探している場合は、ビッグフェースレスグラフライブラリ(BFG)を使用することをお勧めします。JFreeChartよりも使いやすく、見栄えがよく、実行速度が速く、出力オプションが多く、比較はありません。


あなたは質問を誤解しました:それはノードとエッジを持つグラフの種類についてであり、パイとバーを持つ種類のグラフではありません。
11

-1

http://mmengineer.blogspot.com/2009/10/java-graph-floyd-class.htmlの JGraph

グラフを操作するための強力なソフトウェアを提供します(直接または間接)。また、Graphivzコードを生成し、グラフィック表現を確認できます。独自のコードアルゴリズムをパッケージに入れることができます。たとえば、コードのバックトラッキングです。パッケージはいくつかのアルゴリズムを提供します:ダイクストラ、バックトラックミニムパスコストなど。

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