Pustaka algoritma grafik Java yang bagus? [Tutup]


237

Adakah yang punya pengalaman baik dengan perpustakaan Java untuk algoritma Graph. Saya sudah mencoba JGraph dan menemukannya ok, dan ada banyak yang berbeda di google. Apakah ada orang yang benar-benar berhasil menggunakan kode produksi atau akan merekomendasikan?

Untuk memperjelas, saya tidak mencari perpustakaan yang menghasilkan grafik / grafik, saya sedang mencari perpustakaan yang membantu dengan algoritma Grafik, misalnya pohon rentang minimum, algoritma Algoritma Kruskal, Tepi, dll. Idealnya satu dengan beberapa algoritma / data yang baik struktur dalam Java OO API yang bagus.

Jawaban:


108

Jika Anda menggunakan JGraph, Anda harus mencoba JGraphT yang dirancang untuk algoritma. Salah satu fiturnya adalah visualisasi menggunakan perpustakaan JGraph. Ini masih dikembangkan, tetapi cukup stabil. Saya menganalisis kompleksitas algoritma JGraphT beberapa waktu lalu. Beberapa dari mereka bukan yang tercepat, tetapi jika Anda akan mengimplementasikannya sendiri dan perlu menampilkan grafik Anda, maka itu mungkin merupakan pilihan terbaik. Saya sangat suka menggunakan API-nya, ketika saya dengan cepat harus menulis aplikasi yang sedang bekerja pada grafik dan menampilkannya nanti.


JGraph memang memiliki paket analisis sekarang yang mencakup berbagai fungsi analisis, jgraph.github.com/mxgraph/java/docs/index.html .
David

63

Ringkasan:


Banyak dari itu sangat rumit ... Menggunakan Metode pabrik dan sebagainya. Saya hanya perlu sesuatu yang sederhana untuk persiapan wawancara. Ada ide?
SoftwareSavant

4
Jika ini rumit dari pekerjaan seperti apa yang Anda cari
maytham-ɯɐɥʇʎɐɯ

1
Algoritma grafik dijelaskan di sini geeksforgeeks.org/graph-data-structure-and-algorithms dengan kode sederhana
mosh

40

Lihat JGraphT untuk pustaka grafik Java yang sangat sederhana dan kuat yang dilakukan dengan cukup baik dan, untuk menghilangkan kebingungan, berbeda dari JGraph . Beberapa kode contoh :

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 adalah pilihan yang baik untuk visualisasi, dan juga memiliki serangkaian algoritma grafik yang cukup baik, termasuk beberapa mekanisme berbeda untuk pembuatan grafik acak, rewiring, dll. Saya juga menemukan bahwa secara umum cukup mudah untuk memperluas dan beradaptasi jika perlu .


Paket hep.aida. * Adalah LGPL ( acs.lbl.gov/software/colt/license.html ). Ini diimpor melalui colt ( jung.sourceforge.net/download.html ). Ini mencegah JUNG dari digunakan dalam proyek-proyek di bawah payung ASF dan ESF. Mungkin kita harus menggunakan garpu github github.com/rortian/jung2 dan menghapus ketergantungan itu. github.com/rortian/jung2/commit/… mencerminkan mirror CVS terakhir. Komit saat ini tampaknya menghapus fungsi visualisasi.
koppor

Tidak ada yang dirilis sejak 2010, saya pikir proyek ini ditinggalkan
Yacino

14

Apache Commons menawarkan commons-graph . Di bawah http://svn.apache.org/viewvc/commons/sandbox/graph/trunk/ orang dapat memeriksa sumbernya. Contoh penggunaan API juga ada di SVN . Lihat https://issues.apache.org/jira/browse/SANDBOX-458 untuk daftar algoritma yang diimplementasikan, juga dibandingkan dengan Jung, GraphT, Prefuse, jBPT

Google Guava jika Anda hanya membutuhkan struktur data yang bagus.

JGraphT adalah perpustakaan grafik dengan banyak Algoritma yang diimplementasikan dan memiliki (menurut pendapat saya) model grafik yang baik. Contoh Helloworld . Lisensi: LGPL + EPL.

JUNG2 juga merupakan perpustakaan berlisensi BSD dengan struktur data yang mirip dengan JGraphT. Ini menawarkan algoritma tata letak, yang saat ini hilang di JGraphT. Komit terbaru berasal dari 2010 dan paket hep.aida.*- paketnya adalah LGPL (via colt library , yang diimpor oleh JUNG ). Ini mencegah JUNG dari digunakan dalam proyek-proyek di bawah payung ASF dan ESF. Mungkin kita harus menggunakan garpu github dan menghapus ketergantungan itu. Commit f4ca0cd mencerminkan mirror CVS terakhir. Komit saat ini tampaknya menghapus fungsi visualisasi. Commit d0fb491c menambahkan a .gitignore.

Prefuse menyimpan grafik menggunakan struktur matriks, yang tidak efisien memori untuk grafik jarang. Lisensi: BSD

Eclipse Zest telah membangun algoritma tata letak grafik, yang dapat digunakan secara independen dari SWT. Lihat org.eclipse.zest.layouts.algorithms . Struktur grafik yang digunakan adalah salah satu dari Eclipse Draw2d , di mana Nodes adalah objek eksplisit dan tidak disuntikkan melalui Generics (seperti yang terjadi di Apache Commons Graph, JGraphT, dan JUNG2).


12

http://neo4j.org/ adalah basis data grafik yang berisi banyak algoritma grafik dan skala yang lebih baik daripada kebanyakan perpustakaan di memori.


1
apakah ada klien Neo4J (klien java) di mana Anda dapat memvisualisasikannya?
Vishrant

10

Dalam sebuah proyek universitas, saya bermain-main dengan yFiles oleh yWorks dan menemukan itu memiliki API yang cukup bagus.


Saya telah menggunakan yFiles untuk visualisasi interdependensi antara item data (sebagai bagian dari platform perangkat lunak komersial). Saya tidak benar-benar menggunakan algoritma analisis grafik, tetapi periksa apakah paket y.algo memiliki apa yang Anda butuhkan: yworks.com/products/yfiles/doc/api
Jonik

2
yFiles bukan opensource, tetapi menawarkan lisensi komersial
koppor

9

lihat Cetak Biru :

Blueprints adalah kumpulan antarmuka, implementasi, ouplementasi, dan suite uji untuk model data grafik properti. Cetak biru analog dengan JDBC, tetapi untuk basis data grafik. Di dalam tumpukan perangkat lunak sumber terbuka TinkerPop, Blueprints berfungsi sebagai teknologi dasar untuk:

Pipes : Kerangka kerja aliran data yang malas

GREMLIN : Bahasa traversal grafik

Bingkai : Mapper objek-ke-grafik

Tungku : Paket algoritma grafik

Rexster : Server grafik



7

JDSL (Pustaka Struktur Data di Jawa) harus cukup baik jika Anda menyukai algoritma grafik - http://www.cs.brown.edu/cgc/jdsl/


Terima kasih untuk ini, saya tidak pernah menemukan itu. Apakah Anda menggunakannya?
Nick Fortescue

1
Ya, saya menggunakannya. Saya mulai menggunakannya mungkin 4 tahun yang lalu. Sejauh ini bagus, saya hanya berharap ada port untuk itu. NET, juga.
mr.sverrir

Sayangnya, halaman jdsl.org tampaknya menjadi halaman spam sekarang.
Ross Judson

1
Saya telah memperbarui tautan di pos asli. Terima kasih.
mr.sverrir

5

Untuk visualisasi, kelompok kami berhasil dengan prefuse . Kami memperluasnya untuk menangani pelat lantai arsitektur dan diagram bubble, dan itu tidak banyak mengeluh. Mereka memiliki toolkit Flex baru yang disebut Flare yang menggunakan API yang sangat mirip.

UPDATE: Saya harus setuju dengan komentar, kami akhirnya menulis banyak fungsi khusus / bekerja di sekitar batasan prefuse. Saya tidak bisa mengatakan bahwa mulai dari awal akan lebih baik karena kami dapat menunjukkan kemajuan dari hari 1 dengan menggunakan prefuse. Di sisi lain jika kita melakukan implementasi kedua dari hal yang sama, saya mungkin melewatkan prefuse karena kita akan memahami persyaratan jauh lebih baik.


Apa pemikiran pribadi Anda dengan prefuse? Di pekerjaan terakhir saya, sebuah proyek mulai menggunakannya, tetapi berakhir dengan versi 90% + ditulis ulang (dan dioptimalkan, dengan penambahan fitur baru).
Thomas Owens


5

Juga bagus untuk diyakinkan bahwa Grafik dapat direpresentasikan sesederhana:

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

dan terapkan sebagian besar algoritma yang menurut Anda menarik untuk Anda sendiri. Jika Anda jatuh pada pertanyaan ini di tengah-tengah beberapa sesi latihan / pembelajaran pada grafik, itu lib terbaik untuk dipertimbangkan. ;)

Anda juga dapat memilih matriks kedekatan untuk sebagian besar algoritma umum:

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

atau matriks untuk beberapa operasi:

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




0

Jika Anda benar-benar mencari perpustakaan Charting dan bukan untuk perpustakaan Node / Edge Graph saya akan menyarankan splurging di Big Graph Grafik berwajah ( BFG ). Ini cara yang lebih mudah digunakan daripada JFreeChart, terlihat lebih bagus, berjalan lebih cepat, memiliki lebih banyak opsi keluaran, benar-benar tidak ada perbandingan.


Anda salah memahami pertanyaan: ini tentang jenis grafik yang memiliki simpul dan tepi, bukan jenis yang memiliki pai dan bilah.
amarillion

-1

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

Menyediakan perangkat lunak yang kuat untuk bekerja dengan grafik (langsung atau tidak langsung). Juga menghasilkan kode Graphivz, Anda dapat melihat representasi grafik. Anda dapat memasukkan algoritma kode Anda sendiri ke dalam pakage, misalnya: kode backtracking. Paket ini menyediakan beberapa algoritme: Dijkstra, melacak biaya jalur minimun, dll.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.