Buona libreria di algoritmi per grafici Java? [chiuso]


237

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 diversi su Google. C'è qualcuno che le persone stanno effettivamente usando con successo nel codice di produzione o lo consiglierebbero?

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

Risposte:


108

Se stavi usando JGraph, dovresti provare JGraphT che è progettato per gli algoritmi. Una delle sue caratteristiche è la visualizzazione mediante la libreria JGraph. È ancora sviluppato, ma abbastanza stabile. Ho analizzato la complessità degli algoritmi JGraphT qualche tempo fa. Alcuni di questi non sono i più veloci, ma se li implementerai da solo e devi visualizzare il tuo grafico, allora 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 mostrarla in seguito.


JGraph ha ora un pacchetto di analisi che include una gamma di funzioni di analisi, jgraph.github.com/mxgraph/java/docs/index.html .
David

63

Sommario:


Molti di questi sono estremamente complicati ... Usando i metodi di fabbrica e così via. Ho solo bisogno di qualcosa di semplice da preparare per un'intervista. Qualche idea?
SoftwareSantant,

4
Se questi sono complicati rispetto al tipo di lavoro che stai cercando
Maytham-ɯɐɥʇʎɐɯ

1
Gli algoritmi dei grafici sono spiegati qui geeksforgeeks.org/graph-data-structure-and-algorithms con codice semplice
mosh

40

Dai un'occhiata a JGraphT per una libreria di grafici Java molto semplice e potente che è abbastanza ben fatta e, per dissipare qualsiasi confusione, è diversa da JGraph . Qualche codice di esempio :

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

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


I pacchetti hep.aida. * Sono LGPL ( acs.lbl.gov/software/colt/license.html ). Questo viene importato tramite colt ( jung.sourceforge.net/download.html ). Ciò impedisce a JUNG di essere utilizzato in progetti sotto l'egida di ASF e FSE. Forse si dovrebbe usare la forcella github github.com/rortian/jung2 e rimuovere quella dipendenza. github.com/rortian/jung2/commit/… rispecchia l'ultimo commit CVS. Gli attuali commit sembrano rimuovere la funzionalità di visualizzazione.
Koppor,

Non è stato rilasciato dal 2010, penso che questo progetto sia abbandonato
Yacino,

14

Apache Commons offre un grafico comune . Sotto http://svn.apache.org/viewvc/commons/sandbox/graph/trunk/ è possibile controllare la fonte. Anche l'utilizzo dell'API di esempio è in SVN . Vedi https://issues.apache.org/jira/browse/SANDBOX-458 per un elenco di algoritmi implementati, confrontato anche con Jung, GraphT, Prefuse, jBPT

Google Guava se hai bisogno solo di buone strutture di dati.

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

JUNG2 è anche una libreria con licenza BSD con la struttura dei dati simile a JGraphT. Offre algoritmi di layout, 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 FSE. Forse uno dovrebbe usare il fork di github e rimuovere quella dipendenza. Commit f4ca0cd rispecchia l'ultimo commit CVS. Gli attuali commit sembrano rimuovere la funzionalità di visualizzazione. Commit d0fb491c aggiunge a .gitignore.

Il prefuso memorizza i grafici utilizzando una struttura a matrice, che non è efficiente in termini di memoria per i grafici sparsi. Licenza: BSD

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



10

In un progetto universitario ho giocato con yFiles di yWorks e ho scoperto che aveva API abbastanza buone.


Ho usato yFiles per la visualizzazione di interdipendenze tra elementi di dati (come parte di una piattaforma software commerciale). Non ho davvero usato alcun algoritmo di analisi dei grafici, ma controlla se il pacchetto y.algo ha quello che ti serve: yworks.com/products/yfiles/doc/api
Jonik

2
yFiles non è open source, ma offre licenze commerciali
koppor

9

controlla i progetti :

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

Pipes : un framework di flusso di dati pigro

Gremlin : un linguaggio di attraversamento grafico

Frame : un mappatore da oggetto a grafico

Fornace : un pacchetto di algoritmi grafici

Rexster : un server grafico



7

JDSL (Data Structures Library in Java) dovrebbe essere abbastanza buono se ti piacciono gli algoritmi grafici - http://www.cs.brown.edu/cgc/jdsl/


Grazie per questo, non mi sarei mai imbattuto. Lo stai usando?
Nick Fortescue,

1
Sì, lo sto usando. Ho iniziato a usarlo forse 4 anni fa. Fin qui tutto bene, vorrei solo che ci fosse una porta anche per .NET.
sig .verrir,

Purtroppo, la pagina jdsl.org sembra essere una pagina di spam ora.
Ross Judson,

1
Ho aggiornato il link nel post originale. Grazie.
sig .verrir,

5

Per la visualizzazione il nostro gruppo ha avuto qualche successo con il prefuso . L'abbiamo esteso per gestire le placche architettoniche e i diagrammi a bolle e non si è lamentato troppo. Hanno anche un nuovo toolkit Flex chiamato Flare che utilizza un'API molto simile.

AGGIORNAMENTO: dovrei essere d'accordo con il commento, abbiamo finito per scrivere molte funzionalità personalizzate / aggirare le limitazioni del prefuso. Non posso dire che partire da zero sarebbe stato meglio, dato che siamo stati in grado di dimostrare i progressi dal primo giorno usando il prefuso. D'altra parte, se stessimo eseguendo una seconda implementazione delle stesse cose, potrei saltare il prefuso poiché capiremmo molto meglio i requisiti.


Quali erano i tuoi pensieri personali con prefuso? Nel mio ultimo lavoro, un progetto ha iniziato a usarlo, ma è finito con una versione del prefuso del 90% + riscritta (e ottimizzata, con aggiunte di nuove funzionalità).
Thomas Owens,


5

È anche bello essere convinti che un grafico possa essere rappresentato semplicemente come:

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

e implementa la maggior parte degli algoritmi che ritieni interessanti da solo. Se cadi su questa domanda nel mezzo di una sessione di pratica / apprendimento sui grafici, questa è la migliore lib da considerare. ;)

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

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

o una matrice per alcune operazioni:

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


4

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

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

Il progetto è attivo e viene fornito supporto reattivo!



0

Se in realtà stai cercando librerie per grafici e non per librerie Node / Edge Graph, ti suggerirei di fare una purga nella libreria Big Faceless Graph ( BFG ). È molto più facile da usare rispetto a JFreeChart, sembra più bello, funziona più velocemente, ha più opzioni di output, davvero nessun confronto.


Hai frainteso la domanda: riguarda il tipo di grafici che hanno nodi e bordi, non il tipo che ha torte e barre.
amarillion,

-1

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

Fornisce un potente software per lavorare con i grafici (diretti o non diretti). Genera anche il codice Graphivz, puoi vedere le rappresentazioni grafiche. Puoi mettere in pakage i tuoi algoritmi di codice, ad esempio: codice di backtracking. Il pacchetto fornisce alcuni algoritmi: Dijkstra, backtracking minimun path cost, ect ..

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.