Buena biblioteca de algoritmo de gráficos de Java?

Alguien ha tenido buenas experiencias con cualquier biblioteca de Java para algoritmos de Graph. He probado JGraph y encontré que está bien, y hay muchos otros en Google. ¿Hay alguna que las personas realmente utilicen con éxito en el código de producción o recomendarían?

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

Si usaba JGraph, debería probar con JGraphT, que está diseñado para algoritmos. Una de sus características es la visualización utilizando la biblioteca JGraph. Aún está desarrollado, pero 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 los va a implementar por su cuenta y necesita mostrar su gráfico, entonces podría ser la mejor opción. Me gustó mucho usar su API, cuando rápidamente tuve que escribir una aplicación que estaba trabajando en un gráfico y mostrarla más tarde.

Resumen:

  • JGraphT si está más interesado en estructuras de datos y algoritmos.
  • JGraph si tu enfoque principal es la visualización.
  • Jung , yWorks y BFG son otras cosas que las personas intentaron usar.
  • Prefuse es un no no, ya que uno tiene que reescribir la mayor parte.
  • Google Guava si solo necesita buenas estructuras de datos.
  • Gráfico Apache Commons . Actualmente inactivo, pero proporciona implementaciones para muchos algoritmos. 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

Eche un vistazo a JGraphT para obtener una biblioteca de gráficos Java muy simple y poderosa que está muy bien hecha y, para disipar cualquier confusión, es diferente de JGraph . Algunos ejemplos de código :

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

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

Apache Commons ofrece commons-graph . En http://svn.apache.org/viewvc/commons/sandbox/graph/trunk/, uno 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 de gráficos con muchos algoritmos implementados y que tiene (en mi opinión) un buen modelo de gráfico. Ejemplo de Helloworld . Licencia: LGPL + EPL.

JUNG2 también es una biblioteca con licencia de BSD con una estructura de datos similar a JGraphT. Ofrece algoritmos de diseño, que actualmente faltan en JGraphT. El compromiso 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 el tenedor github y eliminar esa dependencia. Commit f4ca0cd está duplicando la última confirmación de CVS. Los commits actuales parecen eliminar la funcionalidad de visualización. Commit d0fb491c agrega un .gitignore .

Prefuse almacena los gráficos utilizando una estructura de matriz, que no es eficiente en la 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 inyectados a través de Generics (como ocurre en Apache Commons Graph, JGraphT y JUNG2).

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

echa un vistazo a Blueprints :

Blueprints es una colección de interfaces, implementaciones, complementos y suites de prueba para el modelo de datos de gráficos de propiedades. Blueprints es análogo al JDBC, pero para bases de datos de gráficos. Dentro de la stack de software de fuente abierta TinkerPop, Blueprints sirve como la tecnología fundamental para:

Pipes : un marco de flujo de datos lento y perezoso

Gremlin : un lenguaje de cruce de gráficos

Marcos : un mapeador objeto a gráfico

Horno : un paquete de algoritmos gráficos

Rexster : un servidor de gráficos

http://incubator.apache.org/hama/ es un paquete científico distribuido en Hadoop para datos masivos de matriz y gráfico.

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

Para la visualización, nuestro grupo tuvo cierto éxito con el prefuse . Lo extendimos para que maneje las plantas arquitectónicas y el diagtwig de burbujas, y no se quejó demasiado. También tienen un nuevo kit de herramientas de 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 / resolviendo las limitaciones de los prefijos. No puedo decir que empezando desde cero hubiera sido mejor, ya que pudimos demostrar el progreso desde el día 1 al usar el prefuse. Por otro lado, si estuviéramos haciendo una segunda implementación de las mismas cosas, podría omitir el prefuse ya que entenderíamos los requisitos mucho mejor.

Prueba Annas es un paquete de código abierto que es fácil de entender

http://annas.googlecode.com

También es bueno estar convencido de que un gráfico se puede representar de la siguiente manera:

 class Node { int value; List adj; } 

e implemente la mayoría de los algoritmos que le parezcan interesantes. Si se cae en esta pregunta en medio de una sesión de práctica / aprendizaje en gráficos, esa es la mejor opción para considerar. 😉

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

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

o una matriz para algunas operaciones:

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

No sé si lo llamaría listo para producción, pero está jGABL .

Si necesita rendimiento, puede echarle un vistazo a Grph. La biblioteca se desarrolla en la Universidad francesa y el CNRS / Inria.

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

¡El proyecto está activo y se proporciona soporte reactivo!

Las implementaciones del algoritmo gráfico instruccional en Java se pueden encontrar aquí (por el profesor Sedgewick et al.): http://algs4.cs.princeton.edu/code/

Me presentaron a ellos mientras asistía a estos cursos de algoritmo excepcionales en coursera (también impartido por el profesor Sedgewick):

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

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

Si realmente está buscando librerías Charting y no para bibliotecas Node / Edge Graph sugeriría derrochar en Big Faceless Graph Library ( 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.

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

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