jgrapht包简介

Download Report

Transcript jgrapht包简介

JGraphT包简介
1
JGraphT简介
• 项目主页: http://jgrapht.sourceforge.net/
• 项目创造人:巴拉克西奈
( [email protected] )
• 版权所有( C ) 2003-2007年,由巴拉克西奈和编辑者。
•
• 这个库是免费软件,如果您拥有GNU通用公共许可证或
者2.1版(及其以后版本)的授权,那么您可以重新分配
或修改它。
• 0.8.0版现已有售。 JGraphT现在需要在Java 1.6建立和运
行。
2
JGraphT简介(续)
• JGraphT是一个免费的Java图形库,
提供数学图论对象和算法。
• JGraphT支持各种类型的图表,其中包括:
*有向图和无向图
*加权图/无权图
*简单图,复合图 ,伪图。
* 不可修改图(允许模块提供“只读”方式访问
图的内部)
* listenable graphs(可监听图) -允许外部监
听器跟踪修改。
3
*
子图的自动更新
•
图形可视化
JGraphT涉及了几乎所有的对图这一数据结
构的操作。例如,创建图,修改图,删除
图,添加顶点,构造边,图的遍历,图的
映射,连通性检查,求最短路径,求图的
最小点覆盖……
4
尽管JGraphT的设计是简单,安全类型的 ,
但是功能却很强大。例如,图的顶点可是
任何对象。您可以基于字符串,URL,XML文
档,等等创建图。甚至,你可以根据图来
创建图。
5
与其他包(库,组件)的联系
java.util(包含 collection 框架、遗留的
collection 类、事件模型、日期和时间设
施、国际化和各种实用工具类(字符串
标记生成器、随机数生成器和位数组))
2. Jgraph J纯Java开发的图形组件,支持拖,放,
缩放,合并等其它操作。它可以被结合到
任何的Swing应用程序当中。
1.
3. java.awt包含用于创建用户界面和绘制图
形图像的所有类。
6
前端API的接口和类
7
Grapht接口
图结构的根接口
public interface Graph<V, E>{
1. public Set<E> getAllEdges(V
sourceVertex, V targetVertex);
2. public E getEdge(V sourceVertex, V
targetVertex);
3. public EdgeFactory<V, E>
getEdgeFactory();
8
4. public E addEdge(V sourceVertex, V
targetVertex);
5. public boolean addEdge(V sourceVertex,
V targetVertex, E e);
6. public boolean addVertex(V v);
7. public boolean containsEdge(E e);
8. public boolean containsVertex(V v);
9. public boolean containsEdge(V
sourceVertex, V targetVertex);
9
10. public Set<E> edgesOf(V vertex);
11. public Set<E> edgeSet();
12. public Set<E> removeAllEdges(V
sourceVertex, V targetVertex);
13. public boolean removeAllEdges(E
edges);
14. public boolean removeAllVertices( V
vertices);
15. public E removeEdge(V sourceVertex, V
targetVertex);
10
16. public boolean removeEdge(E e);
Jgrapht简介
17. public boolean removeVertex(V v);
18. public Set<V> vertexSet();
19. public V getEdgeSource(E e);
20. public V getEdgeTarget(E e);
21. public double getEdgeWeight(E e);
11
DirectedGraph.java
有向图
public interface DirectedGraph<V, E>
extendsGraph<V, E>{
1. public int inDegreeOf(V vertex);
2. public Set<E> incomingEdgesOf(V vertex);
3. public int outDegreeOf(V vertex);
4. public Set<E> outgoingEdgesOf(V vertex);
}
12
UndirectedGraph.java
无向图
public interface UndirectedGraph<V, E>
extends Graph<V, E>{
public int degreeOf(V vertex);
}
13
EdgeFactory.java
1.GraphHelper.java(public abstract class
GraphHelpe extends Graphs)
2.GraphMapping.java(bidirectional mapping )
3.GraphPath.java
4.VertexFactory.java
5.ListenableGraph.java
6.WeightedGraph.java
14
Alg包
包简介(或作用):
提供图的一些基本算法。
1.ConnectivityInspector.java(连通性检查)
(主要用的是图的遍历方法)
2. DijkstraShortestPath.java
3. VertexCovers.java(点覆盖)
15
迪杰斯特拉算法
用来求从某个源点到其余各个顶点的
最短路径,按照路径长度递增的次序
产生的。
16
从顶点A(源点)到顶点B,C,D,E,F的最
短距离初态为{∞,10,∞,30,100}
S={A}
T={B ,C , D , E , F}
17
从集合T中选取到顶点A路径长度最短的顶点u
加入到集合S中
S、T集合的状态变为:
S={A ,C } T={B, D,E , F}
(10) (∞,∞,30,100)
18
根据算法思想:集合S每加入一个新的顶点u,都要
修改顶点A到集合T中剩余顶点的最短路径长度值
当S={A,C}后,A到其它顶点B,D,E,F的最短路径
改变为
S={A ,C } T={B, D,E , F}
(10) (∞,60,30,100)
不断重复上述过程,直到集合T的顶点全部加入到S
中或无通路为止。
19
B
C
∞
∞
50
(A,E,D)
V(J)
30
(A,E)
100
(A,F)
C
60
(A,C,D)
30
(A,E)
100
(A,F)
E
90
(A,E,F)
D
60
(A,E,D,F)
F
S
{A,C}
{A,C,E}
{A,C,E,D}
{A,C,E,D,F}
D
E
F
∞
10
(A,C)
∞
∞
20
VertexCovers
设G=<V,E>, V*包含于V,若对于e∈E,
v∈V*,使得v与e相关联,则称v覆盖e,并称
V*为G的点覆盖集或简称点覆盖。V*是G的
点覆盖,若V*的任何真子集都不是点覆盖,
则称V*是极小点覆盖,顶点个数最少的点覆
盖称为最小的点覆盖,其顶点个数称为点
覆盖数,记作α0(G)或简记为α0.
21
该类中主要有两个函数
1. public static <V, E> Set<V>
find2ApproximationCover(Graph<V, E> g)
(近似的,相似的)
2. Set<V> findGreedyCover(UndirectedGraph<V,
E> g) (贪婪算法,每次循环中,找出度
最大的顶点加到集合中,直到所有边被覆
盖)
找到一个图的真正的最小点覆盖是一个
NP-Complete problem
22
Demo包
包简介(或作用):演示程序
1. HelloJGraphT.java
( A simple introduction to using JGraphT )
2.JGraphAdapterDemo.java
( A demo(演示) applet (小程序)that shows
how to use JGraph to visualize(使可视化)
JGraphT graphs. )
3.PerformanceDemo.java
( A simple demo to test memory and CPU
consumption on a graph with 3 million elements.一
个简单的演示,测试内存和CPU消耗图300万的内
容)
23
Event包
包简介(或作用):
Event classes and listener interfaces, used to
provide a change notification mechanism on
graph modification(修改变动) events.
事件类和监听器的接口,在图修改事件中用
来提供变动通知机制
24
1. ConnectedComponentTraversalEvent.java
(关于连通分量的一个遍历事件)
2. EdgeTraversalEvent.java(边的遍历)
3. GraphChangeEvent.java(定义了一个
protected int type用来指示状态)
4. GraphEdgeChangeEvent.java
5. GraphVertexChangeEvent.java(指示一个图的
顶点是否发生变化或者即将变化)
6. GraphListener.java(如果图发生变化则通知
监听器)
25
7. TraversalListener.java(listener on graph
iterator or on a graph traverser)
8. TraversalListenerAdapter.java(An empty donothing implementation(实施,执行) of
the TraversalListener interface used for
subclasses.
)
9. VertexSetListener.java(当图中点的集合发
生变化时通知监听器)
10. VertexTraversalEvent.java
26
Ext包
包简介(或作用):
Extensions (扩展)and integration(集成)
means to other products.
我们只用到了其中的一个类
JGraphModelAdapter.java
一个适配器,把JGraphT图转换成Jgraph图,
当要把一个JGraphT图可视化的时候用到这
个类。
27
Generate包
包的简介(或作用):
Generators(发生器) for graphs of various
topologies(拓扑结构).
用到的类有:
1. EmptyGraphGenerator.java(创建一个任意
大小的空图,只有顶点没有边)
2. GraphGenerator.java(为创建新的图结构定
义了一个接口)
28
• 3. LinearGraphGenerator.java (产生一个任
意大小的线性图)
• 4. RingGraphGenerator.java(创建一个环形
图)
• 5. WheelGraphGenerator.java(创建一个轮
图,一个圈C和一个顶点v,C上的所有点都
与v相邻)
29
Traverse包
包的简介(或作用):
Graph traversal means.
用到的类有:
1. AbstractGraphIterator.java(一个graph
iterator的空的实现,以尽量减少执行graph
iterator所需消耗。)
2. BreadthFirstIterator.java(图的一个广度优
先模式)
3. ClosestFirstIterator.java(图的一个closestfirst最近优先模式)
30
4. DepthFirstIterator.java(深度优先模式)
5. CrossComponentIterator.java(Provides a
cross-connected-component traversal
functionality for iterator subclasses. )
6. GraphIterator.java(图迭代器)
7. TopologicalOrderIterator.java(拓扑排序迭
代器)
31
拓扑排序
方法:
1.在有向图中选一个没有前驱的顶点并且输出
2.从图中删除该顶点和所有以它为尾的边。
重复1,2步,直至所有顶点都已经输出。
32
B
B
D
C
C
F
E
E
D
F
B
B
C
D
D
F
F
33
B
F
F
最后得到的拓扑排序为A,E,C,D,B,F
1
3
2
5
4
34
• /*
* @title:拓扑排序
* @input: 一个有向无环图,表述为一个邻接矩阵
graph[n][],其中graph[i][0]为顶点i的入度,其余为其后继
结点
* @output: 一个拓扑序列list
*/
import java.util.*;
public class TopologicalSortTest
{
public static void main(String[] args)
{
int[][] graph={{0,1,2,3,},{2,},{1,1,4,},{2,4,},{3,},{0,3,4,},};
int[] list=new int[graph.length];;
35
TopologicalSort topologicalSort=new TopologicalSort();
topologicalSort.input(graph);
list=topologicalSort.getList();
for(int l : list){
System.out.print(l+" ");
}
}
}
class TopologicalSort
{
int[][] graph;
int[] list;
void input(int[][] graph)
{
this.graph=graph;
list=new int[graph.length];
calculate();
}
36
•
void calculate()
{
Stack stack=new Stack();
for(int i=0; i<graph.length; i++){
if(graph[i][0]==0){
stack.push(i);
}
}
int i=0;
while(stack.empty()!=true){
list[i]=(Integer)stack.pop();
for(int j=1; j<graph[list[i]].length; j++){
int k=graph[list[i]][j];
if((--graph[k][0])==0){
stack.push(k);
}
}
i++;
}
if(i<graph.length){
System.out.println("存在环,不可排序!");
System.exit(0);
}
•
}
}
int[] getList()
{
return list;
}
37
Util包
包的简介(或作用):
Non-graph-specific data structures, algorithms,
and utilities used by JGraphT.
被JGraphT用到的非图的具体数据结构,算
法和实用程序。
只用到了一个类
FibonacciHeap.java
这个类实现一个Fibonacci堆数据结构。
38
斐波那契堆中的树都是有根的但是
无序。每个节点x包含指向父节点
的指针p[x]和指向任意一个子结点
的child[x]。x的所有子节点都用双
向循环链表链接起来,叫做x的子
链表。子链表中的每一个节点y都
有指向它的左兄弟的left[y]和右兄
弟的right[y]。如果节点y是x仅有的
子节点,则left[y]=right[y]=y。
39
谢谢!
40