2008-09-09 8 views
240

Est-ce que quelqu'un a eu de bonnes expériences avec des bibliothèques Java pour les algorithmes de graphes. J'ai essayé JGraph et l'ai trouvé correct, et il y a beaucoup de différents dans google. Y en a-t-il des que les gens utilisent avec succès dans le code de production ou recommanderaient? Pour clarifier, je ne cherche pas une bibliothèque qui produise des graphiques/diagrammes, je cherche celle qui aide avec des algorithmes de graphe, par exemple spanning tree minimum, l'algorithme de Kruskal Nodes, Edges, etc. Idéalement un avec quelques de bons algorithmes/structures de données dans une belle API Java OO.Bonne bibliothèque d'algorithme graphique Java?

Répondre

98

Si vous utilisez JGraph, vous devez donner un essai à JGraphT qui est conçu pour les algorithmes. Une de ses fonctionnalités est la visualisation en utilisant la bibliothèque JGraph. C'est encore développé, mais assez stable. J'ai analysé la complexité des algorithmes de JGraphT il y a quelque temps. Certains d'entre eux ne sont pas les plus rapides, mais si vous voulez les utiliser vous-même et que vous avez besoin d'afficher votre graphique, alors c'est peut-être le meilleur choix. J'ai vraiment aimé utiliser son API, quand j'ai rapidement dû écrire une application qui travaillait sur un graphique et l'afficher plus tard.

+0

JGraph a maintenant un paquet d'analyse qui comprend une gamme de fonctions d'analyse, http://jgraph.github.com/mxgraph/java/docs/index.html. – David

5

Pour la visualisation notre groupe a eu un certain succès avec prefuse. Nous l'avons étendu pour gérer les planchers architecturaux et les diagrammes à bulles, et il ne s'est pas trop plaint. Ils ont une nouvelle boîte à outils Flex appelée Flare qui utilise une API très similaire.

MISE À JOUR: Je serais d'accord avec le commentaire, nous avons fini par écrire beaucoup de fonctionnalités personnalisées/contourner les limitations de préfuse. Je ne peux pas dire que partir de rien aurait été mieux, car nous avons été en mesure de démontrer les progrès réalisés dès le premier jour en utilisant prefuse. D'un autre côté, si nous étions en train de faire une seconde implémentation de la même chose, je pourrais sauter la préfecture car nous comprendrions mieux les exigences.

+0

Quelles étaient vos pensées personnelles avec prefuse? Lors de mon dernier emploi, un projet a commencé à l'utiliser, mais a fini avec une version réécrite (et optimisée, avec des ajouts de nouvelles fonctionnalités) de 90% + de prefuse. –

10

Dans un projet universitaire j'ai joué avec yFiles par yWorks et j'ai trouvé qu'il avait une très bonne API.

+0

J'ai utilisé yFiles pour la visualisation des interdépendances entre les éléments de données (dans le cadre d'une plate-forme logicielle commerciale). Je n'ai pas vraiment utilisé d'algorithmes d'analyse graphique, mais vérifiez si le paquet y.algo a ce dont vous avez besoin: http://www.yworks.com/products/yfiles/doc/api/ – Jonik

+1

yFiles n'est pas opensource, mais offre des licences commerciales – koppor

0

Si vous recherchez réellement des bibliothèques de diagrammes et pas pour des bibliothèques de Node/Edge Graph je suggérerais de faire des folies sur la bibliothèque de Big Faceless Graph (BFG). C'est beaucoup plus facile à utiliser que JFreeChart, plus joli, plus rapide, plus d'options de sortie, vraiment pas de comparaison.

+0

Vous avez mal compris la question: il s'agit du type de graphes qui ont des nœuds et des arêtes, pas du genre qui a des tartes et des barres. – amarillion

36

JUNG est une bonne option pour la visualisation, et a également un assez bon ensemble d'algorithmes de graphes disponibles, y compris plusieurs mécanismes différents pour la création de graphes aléatoires, recâblage, etc .. J'ai également trouvé assez facile à étendre et adapter si nécessaire.

+0

Les paquets hep.aida. * Sont des fichiers LGPL (http://acs.lbl.gov/software/colt/license.html). Ceci est importé via colt (http://jung.sourceforge.net/download.html). Ceci empêche JUNG d'être utilisé dans des projets sous l'égide d'ASF et d'ESF. Peut-être que l'on devrait utiliser le fork github https: // github.com/rortian/jung2 et supprimez cette dépendance. https://github.com/rortian/jung2/commit/f4ca0cdcd3312589cbb48de7350b84cbff6067b9 reflète la dernière validation CVS. Les commits actuels semblent supprimer la fonctionnalité de visualisation. – koppor

+0

Il n'y a pas publié depuis 2010, je pense que ce projet est abandonné – Yacino

4

Je ne sais pas si je l'appellerais prêt pour la production, mais il y a jGABL.

38

Consultez JGraphT pour une bibliothèque de graphes Java très simple et puissante qui est plutôt bien faite et, pour dissiper toute confusion, est différent de JGraph. Certains sample code:

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); 
+0

Ceci est une grande démo ici https://github.com/jgrapht/jgrapht/wiki/DirectedGraphDemo –

7

JDSL (Structures de données Bibliothèque en Java) devrait être assez bon si vous êtes dans les algorithmes de graphique - http://www.cs.brown.edu/cgc/jdsl/

+0

Merci pour cela, je ne le rencontrerais jamais. L'utilisez-vous? –

+1

Oui, je l'utilise. J'ai commencé à l'utiliser il y a peut-être 4 ans. Jusqu'ici tout va bien, j'aurais juste aimé qu'il y ait aussi un port pour .NET. –

+0

Malheureusement, la page jdsl.org semble être une page de spam maintenant. –

45

Résumé:

  • JGraphT si vous êtes plus intéressés par les structures de données et algorithmes.
  • JGraph si votre objectif principal est la visualisation.
  • Jung, yWorks, et BFG sont d'autres choses que les gens ont essayé d'utiliser.
  • Prefuse est un non non car il faut en réécrire la plus grande partie.
  • Google Guava si vous avez besoin de bonnes infrastructures de données seulement.
  • Apache Commons Graph. Actuellement dormant, mais fournit des implémentations pour de nombreux algorithmes. Voir https://issues.apache.org/jira/browse/SANDBOX-458 pour une liste d'algorithmes mis en œuvre, également par rapport à Jung, GraphT, Prefuse, jBPT
+0

Beaucoup de ceux-ci sont extrêmement compliqués ... En utilisant des méthodes d'usine et ainsi de suite. J'ai juste besoin de quelque chose de simple pour préparer une interview. Des idées? – SoftwareSavant

+2

Si elles sont compliquées que le type de travail que vous recherchez –

+0

Les algorithmes de graphes sont expliqués ici http://www.geeksforgeeks.org/graph-data-structure-and-algorithms/ avec le code simple – mosh

11

http://neo4j.org/ est une base de données de graphes qui contient beaucoup d'algorithmes de graphes et qui est plus performante que la plupart des bibliothèques en mémoire.

+0

Y at-il un client Neo4J (client Java) où vous pouvez le visualiser? – Vishrant

-2

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

Fournit un logiciel puissant pour travailler avec des graphiques (directes ou undirect). Génère également du code Graphivz, vous pouvez voir des représentations graphiques. Vous pouvez mettre vos propres algorithmes de code dans pakage, par exemple: backtracking code. Le paquet fournit quelques algorithmes: Dijkstra, retour sur le chemin de minimun path, ect ..

10

Apache Commons offre commons-graph. Sous http://svn.apache.org/viewvc/commons/sandbox/graph/trunk/ on peut inspecter la source. L'exemple d'utilisation de l'API est également in the SVN. Voir https://issues.apache.org/jira/browse/SANDBOX-458 pour une liste des algorithmes mis en œuvre, également comparé avec Jung, GraphT, Prefuse, jBPT

Google Guava si vous avez besoin de bonnes structures de données seulement.

JGraphT est une bibliothèque de graphes avec beaucoup d'algorithmes implémentés et ayant (dans mon oppinion) un bon modèle de graphe. Helloworld Example. Licence: LGPL + EPL.

JUNG2 est également une bibliothèque sous licence BSD avec la structure de données similaire à JGraphT. Il propose des algorithmes de mise en page, qui manquent actuellement dans JGraphT. Le plus récent commit date de 2010 et les paquets hep.aida.* sont des LGPL (via le colt library, dont is imported by JUNG). Ceci empêche JUNG d'être utilisé dans des projets sous l'égide d'ASF et d'ESF. Peut-être que l'on devrait utiliser le github fork et supprimer cette dépendance. Commit f4ca0cd reflète la dernière validation CVS. Les commits actuels semblent supprimer la fonctionnalité de visualisation. Commit d0fb491c ajoute un .gitignore.

Prefuse stocke les graphiques en utilisant une structure matricielle, qui n'est pas efficace en mémoire pour les graphes épars. Licence: BSD

Eclipse Zest a construit dans les algorithmes de disposition de graphique, qui peuvent être utilisés indépendamment de SWT. Voir org.eclipse.zest.layouts.algorithms. La structure de graphe utilisée est celle de Eclipse Draw2d, où Nodes are explicit objects et non injectée via Generics (comme cela se produit dans Apache Commons Graph, JGraphT et JUNG2).

3

Si vous avez besoin de performances, vous pouvez jeter un oeil à Grph. La bibliothèque est développée à l'Université française et au CNRS/Inria.

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

Le projet est actif et support réactif est fourni!

4

Il est également bon d'être convaincu qu'un graphique peut être représenté simplement comme:

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

et d'implémenter la plupart des algorithmes que vous trouvez intéressants par vous-même. Si vous tombez sur cette question au milieu d'une session de pratique/apprentissage sur les graphiques, c'est la meilleure bibliothèque à considérer. ;)

Vous pouvez aussi préférer la matrice de contiguïté pour les algorithmes les plus courants:

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

ou une matrice pour certaines opérations:

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

départ Blueprints:

Blueprints est une collection des interfaces, implémentations, ouplementations et suites de tests pour le modèle de données du graphe de propriétés. Blueprints est analogue à la JDBC, mais pour les bases de données graphiques. Au sein de la TinkerPop pile logicielle open source, Blueprints sert de la technologie fondamentale pour:

Pipes: Un cadre paresseux, flux de données

Gremlin: Un parcours de graphe langue

Frames: Un objet à graphique Mapper

Furnace: Un algorithme graphique package

Rexster: Un serveur graphique

Questions connexes