Buena biblioteca de algoritmos de gráficos Java? [cerrado]


237

¿Alguien ha tenido buenas experiencias con bibliotecas Java para algoritmos Graph? Intenté JGraph y lo encontré bien, y hay muchos diferentes en google. ¿Hay alguna que la gente realmente esté usando con éxito en el código de producción o recomendaría?

Para aclarar, no estoy buscando una biblioteca que produzca gráficos / tablas, estoy buscando una que ayude con los algoritmos de gráficos, por ejemplo, árbol de expansión mínima, algoritmos de Kruskal, nodos, bordes, etc. Idealmente uno con algunos buenos algoritmos / datos estructuras en una bonita API Java OO.

Respuestas:


108

Si estaba utilizando JGraph, debería probar JGraphT, que está diseñado para algoritmos. Una de sus características es la visualización utilizando la biblioteca JGraph. Todavía está desarrollado, pero es bastante estable. Analicé la complejidad de los algoritmos JGraphT hace algún tiempo. Algunos de ellos no son los más rápidos, pero si va a implementarlos por su cuenta y necesita mostrar su gráfico, entonces podría ser la mejor opción. Realmente me gustó usar su API, cuando tuve que escribir rápidamente una aplicación que estaba trabajando en gráficos y mostrarla más tarde.


JGraph ahora tiene un paquete de análisis que incluye una gama de funciones de análisis, jgraph.github.com/mxgraph/java/docs/index.html .
David

63

Resumen:


Muchos de ellos son extremadamente complicados ... Usando métodos de fábrica, etc. Solo necesito algo simple para preparar para una entrevista. ¿Algunas ideas?
SoftwareSavant

44
Si estos son complicados que el tipo de trabajo que está buscando
maytham-ɯɐɥʇʎɐɯ

1
Algoritmos de grafos se explican aquí geeksforgeeks.org/graph-data-structure-and-algorithms~~V~~plural~~3rd con código simple
mosh el

40

Echa un vistazo a JGraphT para obtener una biblioteca de gráficos Java muy simple y potente que está bastante bien hecha y, para disipar cualquier confusión, es diferente a JGraph . Algún código de muestra :

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 es una buena opción para la visualización, y también tiene un conjunto bastante bueno de algoritmos de gráficos disponibles, incluidos varios mecanismos diferentes para la creación aleatoria de gráficos, cableado, etc. También he encontrado que en general es bastante fácil de extender y adaptar cuando sea necesario .


Los paquetes hep.aida. * Son LGPL ( acs.lbl.gov/software/colt/license.html ). Esto se importa a través de colt ( jung.sourceforge.net/download.html ). Esto evita que JUNG se use en proyectos bajo el paraguas de ASF y ESF. Tal vez uno debería usar el github fork github.com/rortian/jung2 y eliminar esa dependencia. github.com/rortian/jung2/commit/… está reflejando la última confirmación de CVS. Las confirmaciones actuales parecen eliminar la funcionalidad de visualización.
koppor

No se ha lanzado desde 2010, creo que este proyecto está abandonado
Yacino

14

Apache Commons ofrece commons-graph . En http://svn.apache.org/viewvc/commons/sandbox/graph/trunk/ se puede inspeccionar la fuente. El uso de API de muestra también está en el SVN . Consulte https://issues.apache.org/jira/browse/SANDBOX-458 para obtener una lista de algoritmos implementados, también en comparación con Jung, GraphT, Prefuse, jBPT

Google Guava si solo necesita buenas estructuras de datos.

JGraphT es una biblioteca gráfica con muchos algoritmos implementados y que tiene (en mi opinión) un buen modelo gráfico. Helloworld Ejemplo . Licencia: LGPL + EPL.

JUNG2 también es una biblioteca con licencia BSD con una estructura de datos similar a JGraphT. Ofrece algoritmos de diseño, que actualmente faltan en JGraphT. La confirmación más reciente es de 2010 y los paquetes hep.aida.*son LGPL (a través de la biblioteca colt , que es importada por JUNG ). Esto evita que JUNG se use en proyectos bajo el paraguas de ASF y ESF. Tal vez uno debería usar la bifurcación de github y eliminar esa dependencia. Commit f4ca0cd está reflejando el último commit de CVS. Las confirmaciones actuales parecen eliminar la funcionalidad de visualización. Commit d0fb491c agrega a .gitignore.

Prefuse almacena los gráficos utilizando una estructura matricial, que no es eficiente en memoria para gráficos dispersos. Licencia: BSD

Eclipse Zest ha incorporado algoritmos de diseño gráfico, que se pueden usar independientemente de SWT. Ver org.eclipse.zest.layouts.algorithms . La estructura gráfica utilizada es la de Eclipse Draw2d , donde los nodos son objetos explícitos y no se inyectan a través de genéricos (como sucede en Apache Commons Graph, JGraphT y JUNG2).


12

http://neo4j.org/ es una base de datos de gráficos que contiene muchos algoritmos de gráficos y escalas mejor que la mayoría de las bibliotecas en memoria.


1
¿hay algún cliente Neo4J (cliente java) donde pueda visualizarlo?
Vishrant

10

En un proyecto universitario, jugué con yFiles de yWorks y descubrí que tenía una API bastante buena.


He usado yFiles para visualizar interdependencias entre elementos de datos (como parte de una plataforma de software comercial). Realmente no utilicé ningún algoritmo de análisis gráfico, pero verifique si el paquete y.algo tiene lo que necesita: yworks.com/products/yfiles/doc/api
Jonik

2
yFiles no es de código abierto, pero ofrece licencias comerciales
koppor

9

echa un vistazo a Blueprints :

Blueprints es una colección de interfaces, implementaciones, implementaciones y conjuntos de pruebas para el modelo de datos del gráfico de propiedades. Blueprints es análogo al JDBC, pero para bases de datos gráficas. Dentro de la pila de software de código abierto TinkerPop, Blueprints sirve como la tecnología fundamental para:

Tubos : un marco de flujo de datos perezoso

Gremlin : un lenguaje gráfico transversal

Marcos : un mapeador de objeto a gráfico

Horno : un paquete de algoritmos gráficos

Rexster : un servidor de gráficos



7

JDSL (Biblioteca de estructuras de datos en Java) debería ser lo suficientemente bueno si te gustan los algoritmos de gráficos: http://www.cs.brown.edu/cgc/jdsl/


Gracias por esto, nunca lo había encontrado. ¿Lo estás usando?
Nick Fortescue

1
Sí, lo estoy usando. Empecé a usarlo tal vez hace 4 años. Hasta ahora todo bien, solo desearía que hubiera un puerto de eso para .NET también.
Sr.sverrir

Lamentablemente, la página jdsl.org parece ser una página de spam ahora.
Ross Judson

1
He actualizado el enlace en la publicación original. Gracias.
Sr.Sverrir

5

Para la visualización, nuestro grupo tuvo cierto éxito con prefuse . Lo extendimos para manejar planchas arquitectónicas y diagramas de burbujas, y no se quejó demasiado. También tienen un nuevo kit de herramientas Flex llamado Flare que usa una API muy similar.

ACTUALIZACIÓN: tendría que estar de acuerdo con el comentario, terminamos escribiendo muchas funcionalidades personalizadas / solucionando las limitaciones de prefuse. Sin embargo, no puedo decir que comenzar desde cero hubiera sido mejor, ya que pudimos demostrar el progreso desde el día 1 usando prefuse. Por otro lado, si estuviéramos haciendo una segunda implementación de las mismas cosas, podría omitir prefuse ya que entenderíamos los requisitos mucho mejor.


¿Cuáles fueron tus pensamientos personales con prefuse? En mi último trabajo, un proyecto comenzó a usarlo, pero terminó con una versión de prefuse reescrita en más del 90% (y optimizada, con nuevas funciones).
Thomas Owens


5

También es bueno estar convencido de que un gráfico se puede representar tan simplemente como:

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

e implementa la mayoría de los algoritmos que encuentres interesantes por ti mismo. Si caes en esta pregunta en medio de una sesión de práctica / aprendizaje en gráficos, esa es la mejor opción a considerar. ;)

También puede preferir la matriz de adyacencia para los algoritmos más comunes:

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

o una matriz para algunas operaciones:

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


4

Si necesita rendimiento, puede echar un vistazo a Grph. La biblioteca está desarrollada en la Universidad francesa y CNRS / Inria.

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

El proyecto está activo y se proporciona soporte reactivo.



0

Si realmente está buscando bibliotecas de gráficos y no bibliotecas de gráficos de nodo / borde, sugeriría derrochar en la biblioteca Big Faceless Graph ( BFG ). Es mucho más fácil de usar que JFreeChart, se ve mejor, funciona más rápido, tiene más opciones de salida, realmente no hay comparación.


Usted no entendió la pregunta: se trata del tipo de gráficos que tienen nodos y bordes, no del tipo que tiene pasteles y barras.
amarillion

-1

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

Proporciona un software potente para trabajar con gráficos (directos o indirectos). También genera código Graphivz, puede ver representaciones gráficas. Puede poner sus propios algoritmos de código en el paquete, por ejemplo: código de retroceso. El paquete proporciona algunos algoritmos: Dijkstra, retroceso de costo mínimo de ruta, etc.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.