Buona libreria algoritmo grafico Java?

Qualcuno ha avuto buone esperienze con qualsiasi libreria Java per algoritmi Graph. Ho provato JGraph e l’ho trovato ok, e ce ne sono molti in google. Ci sono persone che stanno effettivamente utilizzando con successo nel codice di produzione o che raccomanderebbero?

Per chiarire, non sto cercando una libreria che produca grafici / diagrammi, ne sto cercando uno che aiuti con algoritmi Graph, ad esempio spanning tree minimo, l’algoritmo di Kruskal Nodi, bordi, ecc. Idealmente uno con alcuni buoni algoritmi / dati strutture in una bella API OO Java.

Se stavi usando JGraph, dovresti provare a JGraphT che è progettato per gli algoritmi. Una delle sue caratteristiche è la visualizzazione utilizzando la libreria JGraph. È ancora sviluppato, ma piuttosto stabile. Ho analizzato la complessità degli algoritmi di JGraphT qualche tempo fa. Alcuni di essi non sono i più veloci, ma se li implementi da soli e devi visualizzare il tuo grafico, potrebbe essere la scelta migliore. Mi è davvero piaciuto usare la sua API, quando ho dovuto scrivere rapidamente un’app che stava lavorando sul grafico e mostrandola in seguito.

Sommario:

  • JGraphT se sei più interessato a strutture e algoritmi di dati.
  • JGraph se il tuo objective principale è la visualizzazione.
  • Jung , yWorks e BFG sono altre cose che le persone hanno provato a usare.
  • Prefuse è un no no dal momento che si deve riscrivere la maggior parte di esso.
  • Google Guava se hai bisogno solo di buone strutture dati.
  • Apache Commons Graph . Attualmente dormiente, ma fornisce implementazioni per molti algoritmi. Vedere https://issues.apache.org/jira/browse/SANDBOX-458 per un elenco di algoritmi implementati, confrontati anche con Jung, GraphT, Prefuse, jBPT

Scopri JGraphT per una libreria di grafi Java molto semplice e potente che è abbastanza ben fatta e, per dissipare ogni confusione, è diversa da JGraph . Alcuni esempi di codice :

UndirectedGraph g = new SimpleGraph(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); 

JUNG è una buona opzione per la visualizzazione e ha anche un discreto set di algoritmi di grafi disponibili, inclusi diversi meccanismi per la creazione di grafici casuali, ricablaggio, ecc. Ho anche trovato che è generalmente abbastanza facile estenderlo e adattarlo dove necessario .

http://neo4j.org/ è un database grafico che contiene molti algoritmi e scale di grafici migliori della maggior parte delle librerie in memoria.

Apache Commons offre il grafico delle commons . Sotto http://svn.apache.org/viewvc/commons/sandbox/graph/trunk/ si può ispezionare la fonte. L’utilizzo dell’API di esempio è anche in SVN . Vedere https://issues.apache.org/jira/browse/SANDBOX-458 per un elenco di algoritmi implementati, confrontati anche con Jung, GraphT, Prefuse, jBPT

Google Guava se hai bisogno solo di buone strutture dati.

JGraphT è una libreria di grafi con molti algoritmi implementati e avendo (a mio parere) un buon modello di grafico. Esempio di Helloworld . Licenza: LGPL + EPL.

JUNG2 è anche una libreria con licenza BSD con la struttura dati simile a JGraphT. Offre algoritmi di layout, che sono attualmente mancanti in JGraphT. Il commit più recente è del 2010 e i pacchetti hep.aida.* Sono LGPL (tramite la libreria colt , che viene importata da JUNG ). Ciò impedisce a JUNG di essere utilizzato in progetti sotto l’egida di ASF e ESF. Forse si dovrebbe usare la forchetta Github e rimuovere quella dipendenza. Configura f4ca0cd sta eseguendo il mirroring dell’ultimo commit CVS. I commit correnti sembrano rimuovere la funzionalità di visualizzazione. Commit d0fb491c aggiunge un .gitignore .

Prefuse memorizza i grafici usando una struttura a matrice, che non è efficiente in memoria per i grafici sparsi. Licenza: BSD

Eclipse Zest ha incorporato algoritmi di layout grafico, che possono essere usati indipendentemente da SWT. Vedi org.eclipse.zest.layouts.algorithms . La struttura grafica utilizzata è quella di Eclipse Draw2d , dove i nodes sono oggetti espliciti e non vengono iniettati tramite Generics (come accade in Apache Commons Graph, JGraphT e JUNG2).

In un progetto universitario mi sono divertito con yFiles di yWorks e ho scoperto che aveva API piuttosto buone.

controlla i progetti :

Blueprints è una raccolta di interfacce, implementazioni, ouplementation e suite di test per il modello di dati del grafico delle proprietà. I progetti sono analoghi al JDBC, ma per i database di grafici. All’interno dello stack di software open source TinkerPop, Blueprints funge da tecnologia fondamentale per:

Pipes : un pigro framework per il stream dei dati

Gremlin : un linguaggio di attraversamento grafico

Cornici : un mappatore da object a grafico

Fornace : un pacchetto di algoritmi grafici

Rexster : un server grafico

http://incubator.apache.org/hama/ è un pacchetto scientifico distribuito su Hadoop per massivi dati su matrice e grafico.

JDSL (Data Structures Library in Java) dovrebbe essere abbastanza buono se si è in algoritmi grafici – http://www.cs.brown.edu/cgc/jdsl/

Per la visualizzazione il nostro gruppo ha avuto qualche successo con il prefuse . Lo abbiamo esteso per gestire le floorplates architettoniche e il bubble diagraming, e non si lamentava troppo. Hanno un nuovo kit di strumenti Flex chiamato anche Flare che utilizza un’API molto simile.

AGGIORNAMENTO: Dovrei essere d’accordo con il commento, abbiamo finito per scrivere un sacco di funzionalità personalizzate / lavorando intorno alle limitazioni dei prefuse. Non posso dire che partire da zero sarebbe stato meglio, visto che siamo stati in grado di dimostrare i progressi dal primo giorno usando il prefuse. D’altra parte, se stessimo realizzando una seconda implementazione della stessa roba, potrei saltare il prefuse poiché comprenderemmo i requisiti molto meglio.

Prova ad Annas il suo pacchetto di grafici open source facile da gestire

http://annas.googlecode.com

È anche bene essere convinti che un grafico può essere rappresentato semplicemente come:

 class Node { int value; List adj; } 

e implementa la maggior parte degli algoritmi che trovi interessanti da solo. Se cadi su questa domanda nel bel mezzo di una sessione di pratica / apprendimento sui grafici, quella è la migliore alternativa da considerare. 😉

Puoi anche preferire la matrice di adiacenza per gli algoritmi più comuni:

 class SparseGraph { int[] nodeValues; List[] edges; } 

o una matrice per alcune operazioni:

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

Non so se lo chiamerei pronto per la produzione, ma c’è jGABL .

Se hai bisogno di prestazioni, potresti dare un’occhiata a Grph. La biblioteca è sviluppata nell’università francese e nel CNRS / Inria.

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

Il progetto è attivo e viene fornito supporto reattivo!

Qui è ansible trovare implementazioni di algoritmi di grafi didattici in java (dal prof Sedgewick et al.): http://algs4.cs.princeton.edu/code/

Mi è stato presentato loro mentre frequentavo questi corsi di algoritmo eccezionale sulla coursera (anche insegnato dal professor Sedgewick):

https://www.coursera.org/course/algs4partI

https://www.coursera.org/course/algs4partII

Se si stanno effettivamente cercando librerie Charting e non per librerie Node / Edge Graph, suggerirei splurging sulla libreria Big Faceless Graph ( BFG ). È molto più semplice da usare rispetto a JFreeChart, sembra più bello, corre più veloce, ha più opzioni di output, davvero nessun confronto.

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

Fornisce un potente software per lavorare con i grafici (diretti o indiretti). Genera anche codice Graphivz, puoi vedere rappresentazioni grafiche. È ansible inserire i propri algoritmi di codice in pakage, ad esempio: codice di backtracking. Il pacchetto fornisce alcuni algoritmi: Dijkstra, backtracking minimo costo percorso, ecc ..