JUNG2(Java Universal Network/Graph Framework)�Ȥ�
��Ū
2009ǯ4��ˡ�Java�饤�֥��Ǥ��� JUNG �� 2.0(JUNG2-2.0) ���������줿�褦����������ޤǤ�JUNG1.X�Ȥϲ�������äƤ������ᡤ���ܸ�Υ����ȤΥ���ץ륳���ɤ�ư�������������ܿ����������ʤ����Ȥ����Τ������˥���Ĥ����Ȼפä��Τ����ä�����
�����餯�ͥåȥ����ʬ����Ū�ǡ�JUNG��Ȥä�Java�ǥץ������뤰�餤�ʤ�Ŭ���ʥ��եȤ����Ƕ�(2009ǯ����)�Ǥϡ�R�Υ饤�֥�꤬���¤��Ƥ������Ȥ⤢�ꡤ���ΤƤ��ĤĤ���Τ��⤷��ʤ����ޤ����絬�Ϥʤ�Τˤʤ�Ȥ�Ϥ�Java����C++���ʤȤʤä�Boost��Ȥ����Ȥˤʤ����Ȥ��⤦��
��������å����åפ�Ĥ���Τ�C++���⡤Java���ڤ��Ȼפ���������������äȤ�������չ�¤�Ǥ�����ȴ������ƥ��르�ꥺ����Ȥ�Ω�Ƥ�Τ����ݡ�Ŭ���ʥ饤�֥���õ���Ƥ�����k���� JUNG2 ��Ȥ����Ȥʤä�������ۤɡ��Ť��饤�֥��Ǥ�ʤ������ɤ����ˤޤȤ�Ƥ��륵���Ȥ��餤���뤫�Ȥ���ä�����ͽ�۰ʾ�˻��ͤˤʤ륵���Ȥ����ʤ��ä��Τǥ��Ȥ��Ƥ��Υڡ�����Ĥ��Ƥ������ʤˤ������Ω�äƤ���й����Ǥ���
JUNG1.X����ΰ㤤
���Υڡ�����������褦�Ȥ���ä��⤦��Ĥ���ͳ�Ȥ��ơ�JUNG2�ȸƤФ�Ƥ���С������JUNG 1.X �κ��ȤϤ����������ؤ�äƤ��ޤäƤ�����ʪ�Ȥ��äƤ⤤����ΤȤʤäƤ�������
����Ū�ˡ���ΤȤ��ƴְ㤤̵���褤��ΤˤϤʤäƤ��뤬���㤨�Х饤�֥���̾�����֤��Ѥ�äƤ���Ȥ�������դι������ǤȤ���Vertex�Ȥ�Node�Ȥ��������Ƥ�����Τ�̵���ʤä��Ȥ������̸ߴ����Ϥޤä����ʤ����ͤˤ��������ȤˤʤäƤ��륵��ץ�Υ���ѥ��뤬�̤�ʤ��äƶ�ϫ������
ñ�ˡ�Java��Generic�ˤ��äƼ������ʤ������Ȥ⤤���������ɡ�
���ޤΤȤ���ʬ���äƤ���㤤�Ȥ��Ƥϥ饤�֥�꤬ʣ����JAR�ե������ʬ�䤵�줿�Τȡ�̾�����֤���ľ���줿?���ȡ����Ȥ�PageRank��DirectedGraph�Τߤ��ä��Τ� UndirectedGraph���ǽ�ˤʤä����Ȥ��������������ɬ�פ˱������ɲäǤ���ФȻפ���
�����ȡ���
�����Υ����Ȥ���Х��ʥ��������롥
- JUNG2-2.0(SOURCE FORGE)
���������ե������Ÿ�������ɬ�פ� JAR �ե����뤬���äƤ���Τǡ������� CLASSPATH ���̤��������餯 Java �Υ��ץ���� -cp �Ȥ������ꤷ�Ƥ⤤��������¿���ΤǴĶ��ѿ������ꤷ���ۤ��������餯�ڤ��Ȼפ���
���Ȥϴ�ñ�ʥ���ץ��������ƥѥ����̤ä����ɤ������ǧ����ǧ��������ʤ� import �����ǽ�ʬ���ʡ�
������դμ���
JUNG2���������Ƥ��륰��դμ���ϰʲ��Ǥ��롥
- Hypergraph<V,E>
- Graph<V,E>
- DirectedGraph<V,E>
- UndirectedGraph<V,E>
- Tree<V,E>
- Forest<V,E>
- KPartiteGraph<V,E>
JUNG2�Ǵ���Ȥʤ륯�饹�Τ褦�����Ρ��ɤȥ��å����鹽�������Τϰ���Ū�ʥ���դ��Ѥ��ʤ��������ʥ롼�פ���Ƥ���....���ʤ��ä���
�ɤ��⤤���Ĥ����¤�����äݤ����Ȥ��������ŤߤĤ�����դ�ɤ����Ĥ����Τ���������
�Ρ��ɤȥ��å��ǹ��������Τ��Ѥ��ʤ�����Hypergraph�ȤΤ������ϡ����å���ξü���ۤʤ�Ρ���Ʊ�Τ�Ϣ�뤵��Ƥ��뤳�Ȥ�ɬ�ܡ�
���Τޤ��ڹ�¤��directed �ȤΤ��ȤʤΤ��������ꡥ�ƥΡ��ɤȥ롼�ȥΡ��ɤȤη�ϩ��ͣ�졩����ʤ����ƤΥΡ��ɴ֤η�ϩ��ͣ��ˤʤ�ʤ���
�ڹ�¤�Ȥΰ㤤�Ͻ۴�ϩ���ʤ����Ĥޤ�ʣ����ϩ�Ϥ��ꤨ�롥���ȡ�consists of a collection of rooted���Ȥ���Τ�ʣ���Υ롼�ȥΡ��ɤ�����Ǥ���Τ��ʡ�
���İʾ�Υ���ݡ��ͥ�Ȥ���ʤ�ͥåȥ�������Υ����ѡ����饹�� Graph �� Hypergraph ����̵���äƤ��Ȥ�¾��Ϣ�륰��դǤϤʤ��Ȥ���äƤ��ȡ�
�Ρ��ɤȥ��å������
JUNG2�Ǥϡ�Vertex��Edge���������̵���ʤäƤ��ޤä���������ϵդ�Integer��String�ʤɤδ�¸�Υ��饹�Τޤޡ��Ρ��ɤ䥨�å�������Ȥ������ѤǤ���褦�ˤʤäƤ��롥���������Ťߤ��̾�����ʤ�䤫����°�������ߤ����ʤ�Τ��������ʤΤ�Ŭ���˺�äƤ������ۤ���̵����Ȥ��⤦��
�Ȥꤢ�������������ǡ����Ѥ��Ƥ��륯�饹��Ǻܤ��Ƥ������ʲ��˽ФƤ���Vertex��Edge�ϡ������ǤΥ��饹�Τ��Ȥ���
-- Vertex.java --
class Vertex {
private int m_id;
private Vec m_pos;
private String m_name;
private static int m_tid = 0;
public Vertex() { m_id = m_tid++; m_pos = new Vec(0,0); }
public Vertex(double x, double y) {
this();
m_pos = new Vec(x,y);
}
public int id() { return m_id; }
public Vec pos() { return m_pos; }
public double x() { return pos().x; }
public double y() { return pos().y; }
public double distanceTo(Vertex v) {
return pos().distance(v.pos());
}
public String toString() { return "n"+id()+" ("+x()+","+y()+")"; };
public boolean equals(Vertex v) { return v.id() == id(); }
}
-- Edge.java --
class Edge {
private double m_capacity;
private String m_name;
private int m_id;
private double m_weight;
private static int m_tid = 0;
public Edge(double weight, double capacity) {
m_id = m_tid++;
m_weight = weight;
m_capacity = capacity;
}
public String toString() { return "e"+m_id; }
public double weight() { return m_weight; }
public int id() { return m_id; }
}
���ͥåȥ���ι�¤Ū��ħ�������
�ͥåȥ���ι�¤Ū��ħ�������ˤ�"edu.uci.ics.jung.algorithms.scoring.*;"�� import ����С����פʥ��르�ꥺ��Ϥۤܡ��ޤޤ�Ƥ��롥
- BarycenterScorer
- BetweennessCentrality
- ClosenessCentrality
- DegreeScorer
- DistanceCentralityScorer
- EigenvectorCentrality
- HITS
- HITS.Scores
- HITSWithPriors
- KStepMarkov
- PageRank
- PageRankWithPriors
- VoltageScorer
��ľ�������Ĥ��Τ�ʤ���ɸ�⤢�뤬���ºݿ��äƤߤ��ʬ����Ȼפ��Τǡ��٤��������Ͼʤ���
Degree Centrality�����
Closeness Centrality�����
Betweenness Centrality�����
PageRank�����
JUNG1.X �Ǥϡ�DirectedGraph �Τߤ��оݤ��ä����� Hypergraph�˳�ĥ������UndirectedGraph�����ǽ�Ȥʤä��褦������Ū�ˤ��Ф����Ѥ��ʤ��Ȼפ��Τ����ʤ���������
����ʥץ������Ȥ��Ƥϡ�PageRank�Υ��֥������Ȥ�������ơ�evaluate() ����з��Ͻ�λ�������餯�����դ���Τ�PageRank�Υ��֥������Ȥ��������Ȥ��ˤ����������������ܳ�Ψ��page�����ʸ�Ǥ� 0.15 �����ꤵ��Ƥ��롥
Graph graph = new SparseMultigraph();
PageRank rank = new PageRank(graph,0.15);
rank.evaluate();
��HITS�������
HITS��PageRank�Ȼ��Ƥ��ơ�WebPage�ν����٤��̤뤿��λ�ɸ�����������㤤�Ǥʤ����2������ո����η���ˡ���ä��褦�˻פ���
����Ū����ʬ��PageRank���Ѥ��ʤ������ߤ����������������줾��˽��Ϥ�����ͤ��㤦������ɸ�������������פʤΤ�����Ū�ʽ���Ȥ��κ��ˤ���Τ����顤�ޤ�����ʤ���
���ŤߤĤ�����դΰ���
�ɤ��� JUNG2 �˥��åפ����Ȥ��ˡ�Vertex, Edge ���饹��̵���ʤä�����ʤΤ����ŤߤĤ�����դΰ������褯�狼��ʤ����ȤˤʤäƤ��롥���������Ȥˤʤ�Toutrial��p.5��3.2�����ȡ�����դȤϤ٤Ĥ�Transformer�Ȥ������饹��edge�� weight�ȤΥ��������ʤ��Ȥ���äݤ���������
�Ȥ����櫓�ǡ��ޤ��ϥ��å����饹��������ʤ���
Transformer������
Transformer���饹�����Ѥ���ˤ�commons collections �� import����ɬ�פ����롥
import org.apache.commons.collections15.Transformer;
³���ơ�turtorial�ˤ���褦�� Transformer ���饹�Υ������������Τ�����turtrial �ɤ���Ǥϥ���ѥ��뤬�̤�ʤ��ä��Τǡ��ʲ��Τ褦���ѹ�����ɬ�פ����롥
Transformer wtTransformer =
new Transformer() {
public Number transform(MyLink link) {
return link.weight;
}
};
��DijkstraShortestPath alg =
new DijkstraShortestPath(g, wtTransformer);
�ѹ����ϡ�Double�ȤʤäƤ���Ȥ�����Number���ѹ����ơ�new DijkstraShortestPath �� <MyNode,MyLink>���ɲä��롥
�ʤ�������齤�����˴ؤ��Ƥϡ����Ĥ����ν�����������줿��ΤǤ��롥
������դ������Ϣ
���Ρ��ɤΰ��֤���ꤹ��
StaticLayout����Ѥ���
setLocation(vertex object, x, y)�ǻ��ꤹ�뤬��x �������� y���ļ��ȤʤäƤ����ͻҡ�
��graph2 = new UndirectedSparseMultigraph();
��for(int i = 0; i < 20; i++) { // (600,400)�����襨�ꥢ�˥����������
����// ����int����, Vertex �Ǥ� double �dz�Ǽ
int x = (int)(Math.random() * 560.0) + 15;
int y = (int)(Math.random() * 360.0) + 10;
Vertex v = new Vertex(x,y);
vertices.add(v.id(), v);
graph2.addVertex(vertices.get(v.id()));
��}
��StaticLayout layout2 = new StaticLayout(graph2);
// �쥤�����Ⱦ��setLocation�ǥΡ��ɤκ�ɸ������
��for(Vertex i : graph2.getVertices()) {
layout2.setLocation(i, i.x(), i.y());
��}
���Ρ��ɤΥ��������ѹ�����
JUNG��Ȥä����̤����褷�Ƥߤ�ȡ����Τ褦�ˤʤ롥
����Ǥϡ��Ρ��ɤ����襵�����������礭������Τǡ������������ꡤ�Ρ��ɤ��Ȥ��礭�����Ѥ������Ȥ������Ȥ�����Ȼפ���
���ΤȤ��ˡ��ɤ�������褤���ȥ饤�֥���õ���Ƥߤ������ɤ�������ǤϤ����ʤ�������
��������Ĵ�٤Ƥߤ���̡�visualization �� RenderContext() ����Ф褵�����ʤΤ�ץ��ߤ�ʬ���ä��������ˤ����åɤ�
- void setVertexDrawPaintTransformer(Transformer<V,Paint> vertexDrawPaintTransformer)
- void setVertexFillPaintTransformer(Transformer<V,Paint> vertexFillPaintTransformer)
- void setVertexFontTransformer(Transformer
vertexFontTransformer) - void setVertexIconTransformer(Transformer
vertexIconTransformer) - void setVertexIncludePredicate(Predicate
,V>> vertexIncludePredicate) - void setVertexLabelRenderer(VertexLabelRenderer vertexLabelRenderer)
- void setVertexLabelTransformer(Transformer
vertexStringer) - void setVertexShapeTransformer(Transformer
vertexShapeTransformer) - void setVertexStrokeTransformer(Transformer
vertexStrokeTransformer)
���Τʤ��Ǥ⡤setVertexShapeTransformer ��Ȥ��Ȥɤ�������η����Τ��ѹ��Ǥ���äݤ����Ȥ������Ȥǡ�
public class MyVertexShapeTransformer implements Transformer {
public Shape transform(V v) {
return new Rectangle(-5,-5,10,10);
}
}
�Ȥ��������ǡ�Rectangle���֤� Transformer �������
BasicVisualizationServer vv
= new BasicVisualizationServer(layout);
vv.getRenderContext().setVertexShapeTransformer(new MyVertexShapeTransformer());
�ĤŤ��ơ�VisualizationServer �������ꤲ�Ƥߤ��
�Ǥ⡤����Ǥϡ��Ρ��ɤ��ͳѤȤ������褵��뤱�ɡ��ߤλ��ˤϤɤ�������Τ�����ǰ�ʤ���Shape�ˤ�Circle�Ȥ����Τ��ߤ�����ʤ����Ǥ⡤�褯������ Arc2D �Ȥ����Τ�����ΤǤ����ȤäƤߤ롥
public class MyVertexShapeTransformer implements Transformer {
public Shape transform(V v) {
������return new Arc2D.Double(-5, -5, 10, 10, 0, 360, Arc2D.OPEN);
}
}
����ǡ��Ρ��ɤξ��ʤɤǷ����礭�����ѹ��Ǥ��롥��οޤǤϡ������ܤ��狼��ʤ����ɡ�������������Shape��(0,0)�����Ρ��ɤθ���(edge��������)�ʤΤǡ�����������դ�ɬ�ס�
Arc2D.Double(����X,����Y,��,��,�߸̤λ���,�߸̤ν���, Ⱦ�¤����褹�뤫��)�ȤʤäƤ��롥���αߤ�����ϲ��̥ԥ����륵�����˸���ʤΤǡ�Window�������˱������Ѥ���ʤ餽��ʤ����ɬ�ס�
����٥��ĥ���դ�
���ä�������դ����褹��ʤ��٥��ĥ���դ�������ͤȤ������Ȥǡ���٥��ĥ���դ�����ˡ�ϴ���Ū�ˤϤ���ޤǤ�Ʊ���� Transformer ����Ѥ��Ƽ������롥
���ȻפäƤ��������äȰ�ä���
���䡤����Ū�ˤ���Ǥ����Τ������饤�֥��ˤ� ToStringLabeller �Ȥ������饹���Ѱդ���Ƥ��Ƥ���Ǥ�褤�ߤ�����
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
�ޤ�������� import ���롥�����ơ�
StaticLayout layout = new StaticLayout(graph);
BasicVisualizationServer vv
= new BasicVisualizationServer(layout);
vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
�Ȥ������ǡ��������ȥ�٥뤬ĥ���դ����롥�Ǥ⡤���ΤȤ�ĥ�����٥�Ϥʤ�?�Ȥʤ�Ȥ��⤦��������ϡ��оݤȤ��륯�饹�� toString() ��������줿���ϤȤʤ롥�����ޤǤ�ʤ������Υ��饹(�����Ǥ�Vertex)�ˤ� String toString() ���������ɬ�פ����롥
�Ȥ����ǡ����Ϥΰ��֤äƤʤ�Ȥ��ʤ���Τ���
�����������ѹ�
Jung-TECHSCORE-�Ǥϡ�renderer �����Ѥ����ѹ���ˡ������ץ�Ȥ��ƤΤ����Ƥ��뤬��RendererContext �����Ѥ����ѹ���ˡ��ܤ��Ƥ�����
import edu.uci.ics.jung.visualization.decorators.EdgeShape;
���������פ��Ȼפ�������Υѥå������� import ���롥³���ơ�setEdgeShapeTransformer ����Ѥ��ƥ��å������西���פ���ꤹ�롥
VisualizationImageServer vv = new VisualizationImageServer(layout, panelsize());
vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line());
����¾�ˤ�
- EdgeShape.BentLine: ��������ޤ줿��
- EdgeShape.Box: ����
- EdgeShape.CubicCurve: S��������
- EdgeShape.Line: �Ρ��ɴ֤�ľ��������
- EdgeShape.Loop: �褯�狼��ʤ�
- EdgeShape.Orthogonal: ľ�ѡ�
- EdgeShape.QuadCurve: �߸�
- EdgeShape.SimpleLoop: ����
- EdgeShape.Wedge: ����ѥ��뤬�̤�ʤ�
���줾������Ѥ������褷���Ȥ��ˤϡ������Τ褦�ʥ���դ����褵��롥��������Wedge�ϥ���ѥ��뤬�̤�ʤ��ä�����������
BentLine Draw |
Box, Loop, SimpleLoop draw |
CubicCurve Draw |
Line Draw |
Orthogonal Draw |
QuadCurve Draw |
�������
�����ѹ�����ݤ���ˡ�⤤����������褦����������Ū�ˤϡ�setEdgeDrawPaintTransformer(Transformer) ��ȤäƼ�������ߤ������Ȥ������Ȥǡ�sample �Υ����������ɤȤ���ߤ�ȡ�LazyMap�Ȥ���ȤäƤ��뤬��¾��Ʊ���褦�ʽ���������̵��ư��롥
BasicVisualizationServer vv
= new BasicVisualizationServer(layout);
Transformer epTransformer = new Transformer(){
public Paint transform(Edge edge) {
return Color.LIGHT_GRAY; // ��ο������ƥ饤�ȥ��쥤�˻���
}
};
vv.getRenderContext().setEdgeDrawPaintTransformer(epTransformer);
����ǡ��ǥե���ȤǤϹ����ä���ο��饤�ȥ��쥤���ѹ��Ǥ��롥
GradientEdgePaintTransformer��ȤäƤߤ롥
JUNG�Υ饤�֥��������Ƥߤ�ȡ�GradientEdgePaintTransformer �Ȥ������饹�����롥̾�����餷�ƴط����ꤽ���ʤΤǤȤꤢ�����ȤäƤߤ롥
javadoc �ˤϡ����ȥ饯���ǡ�Color��դ��ġ�VisualViewer��°���ͤȤ��ƻ��ꤹ������Ǥ����ߤ������Ȥ������Ȥǡ������Τ褦�˵��Ҥ��Ƥߤ롥
vv.getRenderContext().setEdgeDrawPaintTransformer(new GradientEdgePaintTransformer(Color.black,
Color.LIGHT_GRAY,new VisualizationViewer(layout)));
�ʤ���VisualizationViewer��ɬ�פʤΤ��狼��ʤ��������Ѥ��Ƥ�������ѡ��Ĥ�Server���ä��Τǻ��ѤǤ��ʤ��ä����Ȥ⤢�ꡤ����� new ���Ƥߤ������褵�줿��̤ϡ�2�Ĥ�ο����濴�Ȥ��ơ�ξü����Ĥ�ο��Ȥʤ롥
¿�����ˤ���������ι������褵�줿��Τ���Ӥ��Ƥߤ�Фʤ�Ȥʤ�ʬ����ΤǤϤʤ�����������
simple black Draw |
gradient edge paint draw |
��������������ˤ�ȾƩ����(�㤨�� new Color(0,0,0,0) �ʤ�)������ǽ���ͻҡ�
������դΥ�����μ��Ф�
VisualizationViewer�Ǥϡ��ѥͥ����Τ�ĥ��Ĥ��Ƥ��ޤ������Τ��ᡤ����ռ��Τ��طʤȤ��Ƥ��뤳�ȤϤǤ��ʤ�������ʤȤ��ˤϡ�VisualizationImageServer��Ȥ��ȥ������������Ф���
����Ū����ʬ�ϡ�VisualizationViewer���Ѥ��ʤ���
Graph g; // ¾�Ǻ�����������դ��Ѱ�
StaticLayout layout = new StaticLayout(g);
��layout.setSize(panelsize());
��for(Vertex v: g.getVertices()) { // static layout �ʤΤǺ�ɸ��ؼ�
�� layout.setLocation(v, drawX(v.x()), drawY(v.y()));
��}
��VisualizationImageServer vv =
new VisualizationImageServer(layout, panelsize());
��// ��٥�ȥΡ��ɷ����λ���
vv.getRenderContext().setVertexLabelTransformer(new MyVertexLabelTransformer());
��vv.getRenderContext().setVertexShapeTransformer(new MyVertexShapeTransformer());
vv.setBackground(Color.gray); // �طʿ��λ��ꡥȾƩ�������ǽ
// buf ���ط��ѥ������Хåե���
��// (0,0)����panelseize���ΰ�ޤǤΥ�������ڤ�Ф���ĥ���դ�
buf.image(vv.getImage(new Point(0,0), panelsize()),0,0,this);
- JUNG Official?
- Jung-TECHSCORE-
- ����չ�¤�˴ؤ��륽�եȥ�����
- �Ƽ異�르�ꥺ��� C++ �ˤ�����
Jung 1.x �Τ�Τ����ɥ���ץ�ʤɤ�˭�٤ʤΤǻ��ͤˤʤ�ޤ���
����¾������դ��饤�֥��ꥹ��
�ʤ�Ȥʤ��ᤤ��Τ�����Τ�