グラフアルゴリズム用のJavaライブラリを使った経験がありましたか。私はJGraphを試してみましたが、大丈夫でした。Googleにはさまざまなものがあります。人々が実際に製品コードで正常に使用しているものや推奨するものはありますか?
明確にするために、私はグラフ/チャートを作成するライブラリを探していません。たとえば、最小スパニングツリー、クラスカルのアルゴリズムノード、エッジなど、グラフアルゴリズムを支援するライブラリを探しています。素敵なJava OO APIの構造。
グラフアルゴリズム用のJavaライブラリを使った経験がありましたか。私はJGraphを試してみましたが、大丈夫でした。Googleにはさまざまなものがあります。人々が実際に製品コードで正常に使用しているものや推奨するものはありますか?
明確にするために、私はグラフ/チャートを作成するライブラリを探していません。たとえば、最小スパニングツリー、クラスカルのアルゴリズムノード、エッジなど、グラフアルゴリズムを支援するライブラリを探しています。素敵なJava OO APIの構造。
回答:
JGraphを使用していた場合は、アルゴリズム用に設計されたJGraphTを試してみてください。その機能の1つは、JGraphライブラリを使用した視覚化です。まだ開発中ですが、かなり安定しています。JGraphTアルゴリズムの複雑さを少し前に分析しました。そのうちのいくつかは最速ではありませんが、自分で実装してグラフを表示する必要がある場合は、それが最良の選択かもしれません。グラフを操作して後で表示するアプリをすぐに作成しなければならなかったとき、私はそのAPIを使用することが本当に好きでした。
概要:
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);
ジャングは視覚化に適したオプションであり、ランダムグラフの作成、再配線などのいくつかの異なるメカニズムを含む、かなり優れた利用可能なグラフアルゴリズムのセットも備えています。 。
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で発生します)。
http://neo4j.org/は、多くのグラフアルゴリズムを含むグラフデータベースであり、ほとんどのインメモリライブラリよりも優れています。
http://incubator.apache.org/hama/は、Hadoop上の分散科学パッケージであり、大規模なマトリックスおよびグラフデータ用です。
JDSL(Javaのデータ構造ライブラリ)は、グラフアルゴリズムに慣れていれば十分です。 http://www.cs.brown.edu/cgc/jdsl/
視覚化のために、私たちのグループはprefuseである程度成功しました。建築の床板とバブル図表を処理するように拡張しましたが、それほど不満はありませんでした。彼らには、非常によく似たAPIを使用するFlareと呼ばれる新しいFlexツールキットがあります。
更新:コメントに同意する必要があります。結局、prefuseの制限を回避するために多くのカスタム機能/作業を記述してしまいました。prefuseを使用して1日目からの進捗を示すことができたので、ゼロから始めた方が良かったとは言えません。一方、同じものの2番目の実装を行っている場合は、要件をよりよく理解しているため、prefuseをスキップすることがあります。
Annasを試してみて、簡単に理解できるオープンソースのグラフパッケージを試してください。
グラフは次のように簡単に表すことができると確信するのもよいでしょう。
class Node {
int value;
List<Node> adj;
}
自分で興味深いと思うアルゴリズムのほとんどを実装します。グラフに関するいくつかの練習/学習セッションの途中でこの質問に当てはまる場合、それは検討するのに最適なライブラリです。;)
また、最も一般的なアルゴリズムの隣接行列を優先することもできます。
class SparseGraph {
int[] nodeValues;
List<Integer>[] edges;
}
または一部の操作のマトリックス:
class DenseGraph {
int[] nodeValues;
int[][] edges;
}
パフォーマンスが必要な場合は、Grphをご覧ください。ライブラリは、フランスの大学とCNRS / Inriaで開発されています。
http://www.i3s.unice.fr/~hogie/grph/
プロジェクトはアクティブで、反応的なサポートが提供されます!
Javaでのインストラクショナルグラフアルゴリズムの実装は、Sedgewickらによってここにあります:http : //algs4.cs.princeton.edu/code/
コースラのこれらの例外的なアルゴリズムコース(これもセジウィック教授が教えた)に参加しているときに紹介されました。
http://mmengineer.blogspot.com/2009/10/java-graph-floyd-class.htmlの JGraph
グラフを操作するための強力なソフトウェアを提供します(直接または間接)。また、Graphivzコードを生成し、グラフィック表現を確認できます。独自のコードアルゴリズムをパッケージに入れることができます。たとえば、コードのバックトラッキングです。パッケージはいくつかのアルゴリズムを提供します:ダイクストラ、バックトラックミニムパスコストなど。