ดีห้องสมุดอัลกอริทึมกราฟ Java? [ปิด]


237

มีใครเคยมีประสบการณ์ที่ดีกับห้องสมุด Java สำหรับกราฟอัลกอริทึม ฉันลองJGraphแล้วพบว่าใช้ได้และมีหลายอย่างใน Google มีใครบ้างที่ใช้งานจริงในรหัสการผลิตหรือจะแนะนำ?

เพื่อความกระจ่างแจ้งฉันไม่ได้มองหาห้องสมุดที่สร้างกราฟ / แผนภูมิฉันกำลังมองหาห้องสมุดที่ช่วยในเรื่องอัลกอริธึมกราฟเช่นแผนผังที่ครอบคลุมพื้นที่น้อยที่สุด โครงสร้างใน Java OO API ที่ดี

คำตอบ:


108

หากคุณใช้ JGraph คุณควรลองJGraphTซึ่งออกแบบมาสำหรับอัลกอริทึม หนึ่งในคุณสมบัติของมันคือการสร้างภาพโดยใช้ห้องสมุด JGraph มันยังคงพัฒนาอยู่ แต่ก็ค่อนข้างเสถียร ฉันวิเคราะห์ความซับซ้อนของอัลกอริทึม JGraphT เมื่อหลายปีก่อน บางตัวไม่ใช่วิธีที่เร็วที่สุด แต่ถ้าคุณจะนำไปใช้ด้วยตัวเองและต้องการแสดงกราฟของคุณนั่นอาจเป็นตัวเลือกที่ดีที่สุด ฉันชอบใช้ API ของมันเมื่อฉันต้องเขียนแอปที่ทำงานบนกราฟอย่างรวดเร็วและแสดงในภายหลัง


JGraph จะมีแพคเกจการวิเคราะห์ในขณะนี้ที่มีช่วงของการทำงานการวิเคราะห์, jgraph.github.com/mxgraph/java/docs/index.html
David

63

สรุป:

  • JGraphTหากคุณสนใจโครงสร้างข้อมูลและอัลกอริทึมมากกว่า
  • JGraphหากเป้าหมายหลักของคุณคือการสร้างภาพ
  • Jung , yWorksและBFGเป็นสิ่งอื่น ๆ ที่ผู้คนลองใช้
  • Prefuseนั้นไม่ใช่สิ่งที่ใครจะเขียนได้เป็นส่วนใหญ่
  • Google Guavaหากคุณต้องการโครงสร้างข้อมูลที่ดีเท่านั้น
  • Apache คอมกราฟ ปัจจุบันอยู่เฉยๆ แต่ให้การใช้งานสำหรับอัลกอริทึมมากมาย ดูhttps://issues.apache.org/jira/browse/SANDBOX-458สำหรับรายการอัลกอริทึมที่นำไปใช้เปรียบเทียบกับ Jung, GraphT, Prefuse, jBPT

จำนวนมากนั้นซับซ้อนมาก ... ใช้วิธีการของโรงงานและอื่น ๆ ฉันต้องการอะไรที่ง่าย ๆ ในการเตรียมตัวสำหรับการสัมภาษณ์ ความคิดใด ๆ
SoftwareSavant

4
หากสิ่งเหล่านี้ซับซ้อนกว่างานที่คุณกำลังมองหา
maytham-ɯɐɥʇʎɐɯ

1
อัลกอริทึมกราฟมีการอธิบายที่นี่geeksforgeeks.org/graph-data-structure-and-algorithmsกับรหัสที่ง่าย
ร็อก

40

ตรวจสอบJGraphTสำหรับห้องสมุดกราฟ Java ง่ายมากและมีประสิทธิภาพที่จะทำสวยดีและเพื่อบรรเทาความสับสนใด ๆ ที่แตกต่างจาก JGraph โค้ดตัวอย่างบางส่วน:

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

นี่คือตัวอย่างที่ยอดเยี่ยมที่นี่github.com/jgrapht/jgrapht/wiki/DirectedGraphDemo
ใครสักคนที่ไหนสักแห่ง

37

JUNGเป็นตัวเลือกที่ดีสำหรับการสร้างภาพและยังมีชุดอัลกอริทึมกราฟที่มีอยู่ค่อนข้างดีรวมถึงกลไกต่าง ๆ สำหรับการสร้างกราฟแบบสุ่มการเดินสายไฟ ฯลฯ ฉันยังพบว่ามันง่ายที่จะขยายและปรับตามความจำเป็น .


แพ็คเกจ hep.aida. * คือ LGPL ( acs.lbl.gov/software/colt/license.html ) สิ่งนี้นำเข้าผ่านทาง colt ( jung.sourceforge.net/download.html ) สิ่งนี้จะป้องกัน JUNG จากการถูกใช้ในโครงการภายใต้ ASF และ ESF บางทีเราควรใช้ github fork github.com/rortian/jung2และนำการพึ่งพานั้นออก github.com/rortian/jung2/commit/…กำลังทำมิเรอร์ CVS ล่าสุดที่คอมมิชชัน ความมุ่งมั่นในปัจจุบันดูเหมือนจะลบฟังก์ชั่นการสร้างภาพ
koppor

ไม่มีการเปิดตัวตั้งแต่ปี 2010 ฉันคิดว่าโครงการนี้ถูกทอดทิ้ง
Yacino

14

Apache Commons ให้บริการกราฟทั่วไป ภายใต้ http://svn.apache.org/viewvc/commons/sandbox/graph/trunk/เราสามารถตรวจสอบแหล่งที่มา ตัวอย่างการใช้ API อยู่ใน SVNเช่นกัน ดูhttps://issues.apache.org/jira/browse/SANDBOX-458สำหรับรายการอัลกอริทึมที่นำไปใช้เปรียบเทียบกับ Jung, GraphT, Prefuse, jBPT

Google Guavaหากคุณต้องการโครงสร้างข้อมูลที่ดีเท่านั้น

JGraphTเป็นไลบรารีกราฟที่มีอัลกอริทึมมากมายนำไปใช้และมีโมเดลกราฟที่ดี ตัวอย่าง HelloWorld ใบอนุญาต: LGPL + EPL

JUNG2ยังเป็นห้องสมุดลิขสิทธิ์ BSD ที่มีโครงสร้างข้อมูลคล้ายกับ JGraphT มันมีอัลกอริทึมการจัดวางซึ่งปัจจุบันขาดหายไปใน JGraphT การคอมมิชชันล่าสุดคือ 2010 และแพคเกจhep.aida.*คือ LGPL (ผ่านไลบรารี coltซึ่งนำเข้าโดย JUNG ) สิ่งนี้จะป้องกัน JUNG จากการถูกใช้ในโครงการภายใต้ ASF และ ESF บางทีเราควรใช้github forkและลบการพึ่งพานั้น Commit f4ca0cdกำลังทำมิรเรอร์ CVS ล่าสุดที่คอมมิท ความมุ่งมั่นในปัจจุบันดูเหมือนจะลบฟังก์ชั่นการสร้างภาพ Commit d0fb491c.gitignoreเพิ่ม

Prefuseเก็บกราฟโดยใช้โครงสร้างเมทริกซ์ซึ่งไม่มีหน่วยความจำที่มีประสิทธิภาพสำหรับกราฟกระจัดกระจาย ใบอนุญาต: BSD

Eclipse Zestได้สร้างอัลกอริธึมโครงร่างกราฟขึ้นมาซึ่งสามารถใช้งานได้อย่างอิสระจาก SWT ดูorg.eclipse.zest.layouts.algorithms โครงสร้างกราฟที่ใช้เป็นหนึ่งในEclipse Draw2dซึ่งโหนดเป็นวัตถุที่ชัดเจนและไม่ถูกฉีดผ่าน Generics (เนื่องจากเกิดขึ้นใน Apache Commons Graph, JGraphT และ JUNG2)


12

http://neo4j.org/เป็นฐานข้อมูลกราฟที่ประกอบด้วยอัลกอริธึมกราฟและสเกลจำนวนมากที่ดีกว่าไลบรารีในหน่วยความจำส่วนใหญ่


1
มีลูกค้า Neo4J (ไคลเอนต์ java) ที่คุณสามารถเห็นภาพได้หรือไม่
Vishrant

10

ในโครงการมหาวิทยาลัยฉันเล่นกับ yFiles โดยyWorksและพบว่ามันมี API ที่ดีทีเดียว


ฉันใช้ yFiles เพื่อแสดงภาพการพึ่งพาซึ่งกันและกันระหว่างรายการข้อมูล (เป็นส่วนหนึ่งของแพลตฟอร์มซอฟต์แวร์เชิงพาณิชย์) ฉันไม่ได้จริงๆใช้ขั้นตอนวิธีการวิเคราะห์กราฟใด ๆ แต่ตรวจสอบว่าแพคเกจ y.algo มีสิ่งที่คุณต้องการ: yworks.com/products/yfiles/doc/api
Jonik

2
yFiles ไม่ใช่ opensource แต่ให้สิทธิ์การใช้งานเชิงพาณิชย์
koppor

9

ตรวจสอบพิมพ์เขียว :

พิมพ์เขียวเป็นชุดของอินเทอร์เฟซการใช้งานการใช้งานและชุดการทดสอบสำหรับโมเดลข้อมูลกราฟคุณสมบัติ พิมพ์เขียวคล้ายคลึงกับ JDBC แต่สำหรับฐานข้อมูลกราฟ ภายในซอฟต์แวร์โอเพ่นซอร์สของ TinkerPop พิมพ์เขียวทำหน้าที่เป็นเทคโนโลยีพื้นฐานสำหรับ:

ท่อ : กรอบการไหลของข้อมูลที่ขี้เกียจ

Gremlin : ภาษาสำรวจกราฟ

เฟรม : ตัวทำแผนที่วัตถุกับกราฟ

Furnace : แพ็คเกจอัลกอริทึมกราฟ

Rexster : เซิร์ฟเวอร์กราฟ



7

JDSL (Data Structures Library ใน Java) ควรจะดีพอถ้าคุณเข้าสู่ขั้นตอนวิธีกราฟ - http://www.cs.brown.edu/cgc/jdsl/


ขอบคุณสำหรับสิ่งนี้ฉันไม่เคยเจอเลย คุณใช้มันหรือเปล่า?
Nick Fortescue

1
ใช่ฉันกำลังใช้งานอยู่ ฉันเริ่มใช้มันเมื่อ 4 ปีก่อน จนถึงตอนนี้ดีมากฉันแค่หวังว่าจะมีพอร์ตของ. NET สำหรับเช่นกัน
mr.sverrir

น่าเศร้าที่หน้า jdsl.org ดูเหมือนจะเป็นหน้าสแปมในขณะนี้
Ross Judson

1
ฉันได้อัพเดทลิงค์ในโพสต์ดั้งเดิม ขอบคุณ
mr.sverrir

5

สำหรับการแสดงกลุ่มของเราประสบความสำเร็จบางอย่างกับPrefuse เราขยายมันเพื่อจัดการปูพื้นสถาปัตยกรรมและทำแผนภาพฟองสบู่และมันก็ไม่ได้บ่นอะไรมากเกินไป พวกเขามีชุดเครื่องมือ Flex ใหม่ที่เรียกว่า Flare ซึ่งใช้ API ที่คล้ายกันมาก

ปรับปรุง: ฉันต้องเห็นด้วยกับความคิดเห็นเราจบลงด้วยการเขียนฟังก์ชั่นที่กำหนดเองจำนวนมาก / ทำงานเกี่ยวกับข้อ จำกัด prefuse ฉันไม่สามารถพูดได้ว่าการเริ่มต้นจากศูนย์จะดีกว่าแม้ว่าเราจะสามารถแสดงความคืบหน้าตั้งแต่วันที่ 1 โดยใช้คำนำหน้า ในทางกลับกันหากเราทำการใช้งานสิ่งที่สองฉันอาจข้ามคำนำเนื่องจากเราเข้าใจความต้องการมากขึ้น


คุณคิดอย่างไรกับการใช้คำนำล่วงหน้า? ในงานสุดท้ายของฉันโครงการเริ่มใช้งาน แต่จบลงด้วยการเขียนใหม่ 90% + (และปรับให้เหมาะสมพร้อมกับการเพิ่มคุณสมบัติใหม่) ของ prefuse
Thomas Owens


5

นอกจากนี้ยังเป็นการดีที่จะเชื่อมั่นว่าสามารถแสดงกราฟได้อย่างง่ายดายเช่น:

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

และใช้อัลกอริทึมส่วนใหญ่ที่คุณสนใจด้วยตัวเอง หากคุณตกอยู่ในคำถามนี้ในระหว่างการฝึกฝน / การเรียนรู้บางส่วนบนกราฟนั่นเป็นสิ่งที่ดีที่สุดที่คุณควรพิจารณา ;)

คุณสามารถชอบเมทริกซ์ adjacency สำหรับอัลกอริทึมทั่วไป

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

หรือเมทริกซ์สำหรับการดำเนินการบางอย่าง:

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


4

หากคุณต้องการประสิทธิภาพคุณอาจดูที่ Grph ห้องสมุดได้รับการพัฒนาในมหาวิทยาลัยฝรั่งเศสและ CNRS / Inria

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

โครงการมีการใช้งานและให้การสนับสนุนปฏิกิริยา!


3

การใช้งานอัลกอริทึมกราฟการเรียนการสอนใน java สามารถพบได้ที่นี่ (โดยศ. Sedgewick และคณะ): http://algs4.cs.princeton.edu/code/

ฉันได้รับการแนะนำให้รู้จักกับพวกเขาในขณะที่เข้าร่วมหลักสูตรอัลกอริทึมพิเศษเหล่านี้ในหลักสูตร (สอนโดยศ. Sedgewick):

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

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


0

หากคุณกำลังมองหา Charting libraries ไม่ใช่สำหรับ Node / Edge Graph libraries ฉันขอแนะนำ splurging บน Big Faceless Graph library ( BFG ) วิธีใช้งานง่ายกว่า JFreeChart ดูดีกว่าทำงานเร็วขึ้นมีตัวเลือกเอาต์พุตมากขึ้นไม่มีการเปรียบเทียบจริงๆ


คุณเข้าใจผิดคำถาม: มันเกี่ยวกับชนิดของกราฟที่มีโหนดและขอบไม่ใช่แบบที่มีพายและแท่ง
เงินล้าน

-1

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

จัดเตรียมซอฟต์แวร์ที่มีประสิทธิภาพเพื่อทำงานกับกราฟ (โดยตรงหรือไม่บอกทิศทาง) นอกจากนี้ยังสร้างรหัส Graphivz คุณสามารถดูการแสดงกราฟิก คุณสามารถใส่อัลกอริทึมโค้ดของคุณเองเป็น pakage ตัวอย่างเช่นโค้ดย้อนรอย แพคเกจให้อัลกอริทึมบางอย่าง: Dijkstra, backtracking เส้นทางค่าใช้จ่ายขั้นต่ำ, ฯลฯ ..

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.