Thư viện thuật toán đồ thị Java tốt? [đóng cửa]


237

Có ai có kinh nghiệm tốt với bất kỳ thư viện Java nào cho các thuật toán đồ thị. Tôi đã dùng thử JGraph và thấy nó ổn, và có rất nhiều cái khác nhau trong google. Có ai đang thực sự sử dụng thành công trong mã sản xuất hay muốn giới thiệu không?

Để làm rõ, tôi không tìm kiếm một thư viện tạo biểu đồ / biểu đồ, tôi đang tìm một thư viện trợ giúp với các thuật toán đồ thị, ví dụ như cây bao trùm tối thiểu, Nút thuật toán của Kruskal, Edges, v.v ... Lý tưởng nhất là có một số thuật toán / dữ liệu tốt cấu trúc trong API OO Java đẹp.

Câu trả lời:


108

Nếu bạn đang sử dụng JGraph, bạn nên dùng thử JGraphT được thiết kế cho các thuật toán. Một trong những tính năng của nó là trực quan hóa bằng thư viện JGraph. Nó vẫn phát triển, nhưng khá ổn định. Tôi đã phân tích sự phức tạp của các thuật toán JGraphT một thời gian trước đây. Một số trong số chúng không phải là nhanh nhất, nhưng nếu bạn sẽ tự mình thực hiện chúng và cần hiển thị biểu đồ của mình, thì đó có thể là lựa chọn tốt nhất. Tôi thực sự thích sử dụng API của nó, khi tôi nhanh chóng phải viết một ứng dụng đang hoạt động trên biểu đồ và hiển thị nó sau này.


JGraph hiện có gói phân tích bao gồm một loạt các chức năng phân tích, jgraph.github.com/mxgraph/java/docs/index.html .
David

63

Tóm lược:

  • JGraphT nếu bạn quan tâm hơn đến các cấu trúc dữ liệu và thuật toán.
  • JGraph nếu trọng tâm chính của bạn là trực quan.
  • Jung , yWorksBFG là những thứ khác mọi người đã thử sử dụng.
  • Prefuse là không không vì người ta phải viết lại hầu hết.
  • Google Guava nếu bạn chỉ cần cơ sở dữ liệu tốt.
  • Đồ thị chung của Apache . Hiện đang không hoạt động, nhưng cung cấp triển khai cho nhiều thuật toán. Xem https://issues.apache.org/jira/browse/SANDBOX-458 để biết danh sách các thuật toán được triển khai, cũng được so sánh với Jung, GraphT, Prefuse, jBPT

Rất nhiều trong số đó là vô cùng phức tạp ... Sử dụng Phương pháp nhà máy và vv. Tôi chỉ cần một cái gì đó đơn giản để chuẩn bị cho một cuộc phỏng vấn. Có ý kiến ​​gì không?
Phần

4
Nếu những điều này phức tạp hơn loại công việc bạn đang tìm kiếm
maytham-ɯɐɥʇʎɐɯ

1
Các thuật toán đồ thị được giải thích ở đây geekforgeek.org/graph-data-structure-and-alacticms với mã đơn giản
mosh

40

Hãy xem JGraphT để biết thư viện đồ thị Java rất đơn giản và mạnh mẽ, được thực hiện khá tốt và, để xóa tan mọi sự nhầm lẫn, khác với JGraph . Một số mã mẫu :

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);

Đây là một bản demo tuyệt vời ở đây github.com/jgrapht/jgrapht/wiki/DirectedGraphDemo
Ai đó ở đâu đó

37

JUNG là một lựa chọn tốt để trực quan hóa và cũng có một bộ thuật toán đồ thị có sẵn khá tốt, bao gồm một số cơ chế khác nhau để tạo đồ thị ngẫu nhiên, tua lại, v.v. Tôi cũng thấy nó khá dễ dàng để mở rộng và thích nghi khi cần thiết .


Các gói hep.aida. * Là LGPL ( acs.lbl.gov/software/colt/license.html ). Điều này được nhập qua colt ( jung.sourceforge.net/doad.html ). Điều này ngăn JUNG được sử dụng trong các dự án dưới sự bảo trợ của ASF và ESF. Có lẽ người ta nên sử dụng ngã ba github github.com/rortian/jung2 và loại bỏ sự phụ thuộc đó. github.com/rortian/jung2/commit/ khăn đang phản ánh cam kết CVS cuối cùng. Các cam kết hiện tại dường như loại bỏ chức năng hiển thị.
koppor

Không có bản phát hành nào kể từ năm 2010, tôi nghĩ rằng dự án này đã bị hủy bỏ
Yacino

14

Apache Commons cung cấp biểu đồ chung . Trong http://svn.apache.org/viewvc/commons/sandbox/graph/trunk/ người ta có thể kiểm tra nguồn. Việc sử dụng API mẫu cũng có trong SVN . Xem https://issues.apache.org/jira/browse/SANDBOX-458 để biết danh sách các thuật toán được triển khai, cũng được so sánh với Jung, GraphT, Prefuse, jBPT

Google Guava nếu bạn chỉ cần cơ sở dữ liệu tốt.

JGraphT là một thư viện đồ thị với nhiều Thuật toán được triển khai và có (theo ý kiến ​​của tôi) một mô hình đồ thị tốt. Ví dụ Hellowworld . Giấy phép: LGPL + EPL.

JUNG2 cũng là một thư viện được cấp phép BSD với cấu trúc dữ liệu tương tự như JGraphT. Nó cung cấp các thuật toán bố trí, hiện đang thiếu trong JGraphT. Cam kết gần đây nhất là từ năm 2010 và các gói hep.aida.*là LGPL (thông qua thư viện colt , được nhập bởi JUNG ). Điều này ngăn JUNG được sử dụng trong các dự án dưới sự bảo trợ của ASF và ESF. Có lẽ người ta nên sử dụng ngã ba github và loại bỏ sự phụ thuộc đó. Cam kết f4ca0cd đang phản ánh cam kết CVS cuối cùng. Các cam kết hiện tại dường như loại bỏ chức năng hiển thị. Cam kết d0fb491c thêm a .gitignore.

Prefuse lưu trữ các biểu đồ bằng cách sử dụng cấu trúc ma trận, không hiệu quả về bộ nhớ đối với các biểu đồ thưa thớt. Giấy phép: BSD

Eclipse Zest đã xây dựng các thuật toán bố trí đồ thị, có thể được sử dụng độc lập với SWT. Xem org.eclipse.zest.layouts.alacticms . Cấu trúc biểu đồ được sử dụng là một trong Eclipse Draw2d , trong đó các Nút là các đối tượng rõ ràng và không được đưa vào thông qua Generics (như nó xảy ra trong Apache Commons Graph, JGraphT và JUNG2).


12

http://neo4j.org/ là một cơ sở dữ liệu đồ thị chứa nhiều thuật toán đồ thị và tỷ lệ tốt hơn hầu hết các thư viện trong bộ nhớ.


1
Có máy khách Neo4J (máy khách java) nào mà bạn có thể hình dung ra nó không?
Vishrant

10

Trong một dự án đại học, tôi đã chơi đùa với yFiles bởi yWorks và thấy nó có API khá tốt.


Tôi đã sử dụng yFiles để trực quan hóa sự phụ thuộc lẫn nhau giữa các mục dữ liệu (như một phần của nền tảng phần mềm thương mại). Tôi đã không thực sự sử dụng bất kỳ thuật toán phân tích biểu đồ nào, nhưng hãy kiểm tra xem gói y.algo có những gì bạn cần không: yworks.com/products/yfiles/doc/api
Jonik

2
yFiles không phải là nguồn mở, nhưng cung cấp giấy phép thương mại
koppor

9

Thủ tục thanh toán Kế hoạch chi tiết :

Blueprints là một tập hợp các giao diện, triển khai, triển khai và các bộ kiểm tra cho mô hình dữ liệu đồ thị thuộc tính. Blueprints tương tự như JDBC, nhưng đối với cơ sở dữ liệu đồ thị. Trong ngăn xếp phần mềm nguồn mở TinkerPop, Blueprints đóng vai trò là công nghệ nền tảng cho:

Ống : Khung lười biếng, luồng dữ liệu

Gremlin : Một ngôn ngữ truyền tải đồ thị

Khung : Trình ánh xạ đối tượng

Lò lửa : Một gói thuật toán đồ thị

Rexster : Một máy chủ đồ thị



7

JDSL (Thư viện cấu trúc dữ liệu trong Java) phải đủ tốt nếu bạn tham gia vào các thuật toán đồ thị - http://www.cs.brown.edu/cgc/jdsl/


Cảm ơn vì điều này, tôi sẽ không bao giờ bắt gặp nó. Bạn đang sử dụng nó?
Nick FortesTHER

1
Vâng, tôi đang sử dụng nó. Tôi bắt đầu sử dụng nó có thể 4 năm trước. Cho đến nay rất tốt, tôi chỉ ước có một cổng đó cho .NET.
mr.sverrir

Đáng buồn thay, trang jdsl.org dường như là một trang spam.
Ross Judson

1
Tôi đã cập nhật các liên kết trong bài viết gốc. Cảm ơn.
mr.sverrir

5

Để hình dung, nhóm của chúng tôi đã có một số thành công với prefuse . Chúng tôi đã mở rộng nó để xử lý các bản vẽ kiến ​​trúc sàn và sơ đồ bong bóng, và nó đã không phàn nàn quá nhiều. Họ có một bộ công cụ Flex mới được gọi là Flare sử dụng API rất giống nhau.

CẬP NHẬT: Tôi phải đồng ý với nhận xét, cuối cùng chúng tôi đã viết rất nhiều chức năng tùy chỉnh / làm việc xung quanh các giới hạn tiền sử dụng. Tôi không thể nói rằng bắt đầu từ đầu sẽ tốt hơn mặc dù chúng tôi có thể chứng minh sự tiến bộ từ ngày 1 bằng cách sử dụng tiền tố. Mặt khác, nếu chúng tôi đang thực hiện lần thứ hai cho cùng một thứ, tôi có thể bỏ qua việc sử dụng trước vì chúng tôi hiểu các yêu cầu tốt hơn rất nhiều.


Suy nghĩ cá nhân của bạn với prefuse là gì? Ở công việc cuối cùng của tôi, một dự án bắt đầu sử dụng nó, nhưng kết thúc với phiên bản 90% + được viết lại (và được tối ưu hóa, với các bổ sung các tính năng mới) của phiên bản tiền sử dụng.
Thomas Owens


5

Thật tốt khi tin rằng Biểu đồ có thể được biểu diễn đơn giản như sau:

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

và tự mình thực hiện hầu hết các thuật toán mà bạn thấy thú vị. Nếu bạn rơi vào câu hỏi này ở giữa một số buổi thực hành / học tập trên biểu đồ, đó là cách tốt nhất để xem xét. ;)

Bạn cũng có thể thích ma trận kề cho hầu hết các thuật toán phổ biến:

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

hoặc một ma trận cho một số hoạt động:

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


4

Nếu bạn cần hiệu suất, bạn có thể xem Grph. Thư viện được phát triển tại Đại học Pháp và CNRS / Inria.

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

Dự án đang hoạt động và hỗ trợ phản ứng được cung cấp!


3

Việc triển khai thuật toán đồ thị hướng dẫn trong java có thể được tìm thấy ở đây (bởi prof. Sedgewick và cộng sự): http://algs4.cs.princeton.edu/code/

Tôi đã được giới thiệu với họ trong khi tham dự các khóa học thuật toán đặc biệt này trên coursera (cũng được giảng dạy bởi giáo sư. Sedgewick):

https://www.coursera.org/c thuyết / achs4partI

https://www.coursera.org/c thuyết / achs4partII


0

Nếu bạn thực sự đang tìm kiếm các thư viện Biểu đồ chứ không phải các thư viện Node / Edge Graph, tôi sẽ khuyên bạn nên sử dụng thư viện Big Facless Graph ( BFG ). Cách sử dụng dễ dàng hơn JFreeChart, trông đẹp hơn, chạy nhanh hơn, có nhiều tùy chọn đầu ra hơn, thực sự không có so sánh.


Bạn đã hiểu nhầm câu hỏi: đó là về loại đồ thị có nút và cạnh, không phải loại có bánh nướng và thanh.
amarillion

-1

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

Cung cấp một phần mềm mạnh mẽ để làm việc với các biểu đồ (trực tiếp hoặc không trực tiếp). Cũng tạo mã Graphivz, bạn có thể thấy các biểu diễn đồ họa. Bạn có thể đặt các thuật toán mã của riêng bạn vào pakage, ví dụ: mã quay lui. Gói cung cấp một số thuật toán: Dijkstra, quay lại chi phí đường dẫn minimun, ect ..

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.