Boa biblioteca de algoritmos de gráficos Java? [fechadas]


237

Alguém já teve boas experiências com bibliotecas Java para algoritmos Graph. Eu tentei o JGraph e achei ok, e existem muitos diferentes no google. Existe alguém que as pessoas estão usando com sucesso no código de produção ou recomendaria?

Para esclarecer, não estou procurando uma biblioteca que produz gráficos / tabelas, estou procurando uma que ajude com algoritmos de gráfico, por exemplo, árvore de abrangência mínima, nós do algoritmo de Kruskal, arestas, etc. Idealmente, uma com alguns bons algoritmos / dados estruturas em uma boa API Java OO.

Respostas:


108

Se você estava usando o JGraph, tente o JGraphT, projetado para algoritmos. Uma de suas características é a visualização usando a biblioteca JGraph. Ainda está desenvolvido, mas bastante estável. Analisei a complexidade dos algoritmos JGraphT há algum tempo. Alguns deles não são os mais rápidos, mas se você for implementá-los por conta própria e precisar exibir seu gráfico, talvez seja a melhor opção. Eu realmente gostei de usar sua API, quando rapidamente tive que escrever um aplicativo que estava trabalhando no gráfico e exibi-lo mais tarde.


O JGraph agora possui um pacote de análise que inclui várias funções de análise, jgraph.github.com/mxgraph/java/docs/index.html .
David

63

Resumo:


Muitos deles são extremamente complicados ... Usando métodos de fábrica e assim por diante. Eu só preciso de algo simples para preparar uma entrevista. Alguma ideia?
SoftwareSavant

4
Se estes são complicados do que o tipo de trabalho que você está procurando
maytham-ɯɐɥʇʎɐɯ

1
Algoritmos de grafos são explicados aqui geeksforgeeks.org/graph-data-structure-and-algorithms com código simples
mosh

40

Confira o JGraphT para obter uma biblioteca de gráficos Java muito simples e poderosa que é muito bem feita e, para acalmar qualquer confusão, é diferente do JGraph . Algum código de exemplo :

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

O JUNG é uma boa opção para visualização e também possui um conjunto razoavelmente bom de algoritmos de gráficos disponíveis, incluindo vários mecanismos diferentes para criação de gráficos aleatórios, religação, etc. .


Os pacotes hep.aida. * São LGPL ( acs.lbl.gov/software/colt/license.html ). Isso é importado via colt ( jung.sourceforge.net/download.html ). Isso impede que o JUNG seja usado em projetos sob o guarda-chuva do ASF e do FSE. Talvez você deva usar o garfo do github github.com/rortian/jung2 e remover essa dependência. github.com/rortian/jung2/commit/… está espelhando o último commit do CVS. As confirmações atuais parecem remover a funcionalidade de visualização.
Koppor # 26/13

Não há como lançado desde 2010, eu acho que este projeto é abandonado
Yacino

14

O Apache Commons oferece o gráfico comum . Em http://svn.apache.org/viewvc/commons/sandbox/graph/trunk/, pode-se inspecionar a fonte. O uso de API de amostra também está no SVN . Consulte https://issues.apache.org/jira/browse/SANDBOX-458 para obter uma lista dos algoritmos implementados, também comparados com Jung, GraphT, Prefuse, jBPT

Google Guava se você precisar apenas de boas estruturas de dados.

O JGraphT é uma biblioteca de gráficos com muitos algoritmos implementados e com (na minha opinião) um bom modelo de gráfico. Exemplo do Helloworld . Licença: LGPL + EPL.

O JUNG2 também é uma biblioteca licenciada por BSD com a estrutura de dados semelhante ao JGraphT. Ele oferece algoritmos de layout, que estão ausentes no JGraphT. O commit mais recente é de 2010 e os pacotes hep.aida.*são LGPL (através da biblioteca colt , que é importada pelo JUNG ). Isso impede que o JUNG seja usado em projetos sob a égide do ASF e do ESF. Talvez alguém deva usar o garfo do github e remover essa dependência. A confirmação f4ca0cd está espelhando a última confirmação do CVS. As confirmações atuais parecem remover a funcionalidade de visualização. A confirmação d0fb491c adiciona a .gitignore.

Prefuse armazena os gráficos usando uma estrutura matricial, que não é eficiente em termos de memória para gráficos esparsos. Licença: BSD

O Eclipse Zest construiu algoritmos de layout de gráfico, que podem ser usados ​​independentemente do SWT. Consulte org.eclipse.zest.layouts.algorithms . A estrutura gráfica usada é a do Eclipse Draw2d , onde os nós são objetos explícitos e não são injetados via genéricos (como acontece no Apache Commons Graph, JGraphT e JUNG2).


12

http://neo4j.org/ é um banco de dados de gráficos que contém muitos algoritmos de gráficos e dimensiona melhor do que a maioria das bibliotecas da memória.


1
existe algum cliente Neo4J (cliente java) onde você pode visualizá-lo?
Vishrant #

10

Em um projeto universitário, brinquei com o yFiles do yWorks e descobri que ele tinha uma API muito boa.


Eu usei o yFiles para visualização de interdependências entre itens de dados (como parte de uma plataforma de software comercial). Eu realmente não usa nenhum algoritmo de análise gráfica, mas verifique se o pacote y.algo tem o que você precisa: yworks.com/products/yfiles/doc/api
Jonik

2
yFiles não é opensource, mas licenças ofertas comerciais
koppor

9

confira Blueprints :

Blueprints é uma coleção de interfaces, implementações, implementações e suítes de testes para o modelo de dados do gráfico de propriedades. Blueprints é análogo ao JDBC, mas para bancos de dados gráficos. Na pilha de software de código aberto TinkerPop, o Blueprints serve como a tecnologia fundamental para:

Pipes : uma estrutura lenta de fluxo de dados

Gremlin : Uma linguagem transversal de gráfico

Quadros : um mapeador de objeto para gráfico

Forno : Um pacote de algoritmos gráficos

Rexster : um servidor de gráficos



7

O JDSL (Data Structures Library em Java) deve ser bom o suficiente se você estiver usando algoritmos de gráficos - http://www.cs.brown.edu/cgc/jdsl/


Obrigado por isso, eu nunca me deparei com isso. Você está usando?
24611 Nick Fortescue

1
Sim, estou usando. Comecei a usá-lo talvez 4 anos atrás. Até aí tudo bem, eu só queria que houvesse uma porta disso para o .NET também.
24410 mr.sverrir

Infelizmente, a página jdsl.org parece ser uma página de spam agora.
Ross Judson

1
Eu atualizei o link na postagem original. Obrigado.
mr.sverrir

5

Para visualização, nosso grupo teve algum sucesso com o prefuse . Nós o estendemos para lidar com placas de piso arquitetônicas e diagramação de bolhas, e não reclamou muito. Eles também têm um novo kit de ferramentas Flex chamado Flare, que usa uma API muito semelhante.

ATUALIZAÇÃO: Eu teria que concordar com o comentário, acabamos escrevendo muitas funcionalidades personalizadas / contornando as limitações do prefuse. Não posso dizer que começar do zero teria sido melhor, pois conseguimos demonstrar o progresso desde o primeiro dia usando o prefuse. Por outro lado, se estivéssemos fazendo uma segunda implementação do mesmo material, eu poderia pular o prefuse, pois entenderíamos os requisitos muito melhor.


Quais foram seus pensamentos pessoais com o prefuso? No meu último trabalho, um projeto começou a usá-lo, mas acabou com uma versão de prefuse 90% + reescrita (e otimizada, com adições de novos recursos).
Thomas Owens


5

Também é bom estar convencido de que um gráfico pode ser representado da maneira mais simples possível:

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

e implemente a maioria dos algoritmos que você achar interessante. Se você se deparar com essa questão no meio de alguma sessão de prática / aprendizado em gráficos, essa é a melhor lib a considerar. ;)

Você também pode preferir a matriz de adjacência para os algoritmos mais comuns:

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

ou uma matriz para algumas operações:

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


4

Se você precisar de desempenho, pode dar uma olhada no Grph. A biblioteca é desenvolvida na Universidade Francesa e no CNRS / Inria.

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

O projeto está ativo e é fornecido suporte reativo!



0

Se você está realmente procurando bibliotecas de gráficos e não para bibliotecas de gráficos de nó / borda, sugiro fazer splurging na biblioteca Big Faceless Graph ( BFG ). É muito mais fácil de usar do que o JFreeChart, parece mais agradável, roda mais rápido, tem mais opções de saída, realmente sem comparação.


Você entendeu mal a pergunta: trata-se do tipo de gráfico que possui nós e arestas, não do tipo que possui tortas e barras.
precisa

-1

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

Fornece um software poderoso para trabalhar com gráficos (diretos ou indiretos). Também gera código Graphivz, você pode ver representações gráficas. Você pode colocar seus próprios algoritmos de código no pakage, por exemplo: código de retorno. O pacote fornece alguns algoritmos: Dijkstra, backtracking minimun path cost, etc.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.