📄 networkbuilder.java
字号:
package graph;
import org.jgraph.graph.DefaultGraphModel;
import org.jgraph.graph.DefaultGraphCell;
import org.jgraph.graph.GraphConstants;
import org.jgraph.graph.DefaultPort;
import org.jgraph.graph.DefaultEdge;
import org.jgraph.graph.ConnectionSet;
import CLI;
import Graph;
import Node;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.Font;
import java.util.Map;
import java.util.Hashtable;
import java.util.ListIterator;
import java.util.LinkedList;
import java.util.Iterator;
public class NetworkBuilder
{
public static Map createBounds(int x, int y, Color c, String label) {
Map map = GraphConstants.createMap();
GraphConstants.setBounds(map, new Rectangle(x, y, 100, 50));
DefaultGraphCell jc;
Properties p = new Properties(label);
GraphConstants.setValue(map, p);
GraphConstants.setBackground(map, c);
GraphConstants.setForeground(map, Color.white);
GraphConstants.setFont(map, GraphConstants.defaultFont.deriveFont(Font.BOLD, 12));
GraphConstants.setOpaque(map, true);
return map;
}
public static Map createEdgeAttributes(String label, int capacity)
{
Map implementStyle = GraphConstants.createMap();
GraphConstants.setLineEnd(implementStyle,0);
GraphConstants.setBeginSize(implementStyle, 10);
GraphConstants.setDashPattern(implementStyle, new float[] { 3, 3 });
GraphConstants.setFont(implementStyle, GraphConstants.defaultFont.deriveFont(10));
GraphConstants.setValue(implementStyle, new Properties(""));
EdgeProperties p = new EdgeProperties(label, capacity);
//Properties p = new Properties(label);
GraphConstants.setValue(implementStyle, p);
return implementStyle;
}
public static DefaultGraphModel getGraph(int graphtype, int[] nbnodes, int[] organisation, double[] edgeprobs, int[] capacities)
{
DefaultGraphModel model = new DefaultGraphModel();
Map attributes = new Hashtable();
ConnectionSet cs = new ConnectionSet();
addNewNodes(graphtype, nbnodes[0], organisation[0], edgeprobs[0], model, null, capacities[0], 0);
int previousRootCount = 0;
int newRootCount = model.getRootCount();
int teller = 0;
int[] nummering = new int[nbnodes.length];
for (int depth = 1; depth < nbnodes.length; depth++)
{
for (int b = 0; b < depth; b++)
{
nummering[b] = 1;
}
for (int j=previousRootCount; j < newRootCount; j++)
{
// Overloop alle knopen
if (! (model.getRootAt(j) instanceof DefaultEdge))
{
teller=0;
for (int k=0; k<depth; k++)
{
teller += nummering[k]*(Math.pow(10,depth-k-1));
}
addNewNodes(graphtype, nbnodes[depth], organisation[depth], edgeprobs[depth], model, (DefaultGraphCell)model.getRootAt(j),capacities[depth], teller);
nummering[depth-1]++;
for(int m = depth-1; m>0; m--)
{
if(nummering[m]-1 == nbnodes[m])
{
nummering[m-1]++;
nummering[m] = 1;
}
}
}
}
previousRootCount = newRootCount;
newRootCount = model.getRootCount();
}
return model;
}
public static DefaultGraphModel getExistingGraph(String pathToFile)
{
DefaultGraphModel model = new DefaultGraphModel();
Map attributes = new Hashtable();
ConnectionSet cs = new ConnectionSet();
Object[] newNodes;
Object[] newEdges;
String args[] = new String[2];
args[0] = "-dimacs";
args[1] = String.valueOf(pathToFile);
CLI.main(args);
Graph graph = CLI.getGraph();
int j=-1;
int node1, node2;
int nodes = graph.getNodes().size();
int edges = 0;
newNodes = new Object[nodes];
//boolean newNodesConnected[] = new boolean[nodes];
for (int m = 1; m < nodes; m++)
{
//System.out.println("Node " + ((Node)(graph.getNodes().get(m))) );
int depth = 0;
LinkedList ll = ((Node)(graph.getNodes().get(m))).getNeighbors();
LinkedList ll2 = /*ll;//*/(LinkedList)ll.clone();
boolean lonelyNode = false;
if (ll.isEmpty())
{
lonelyNode = true;
//System.out.println("Lonely node, first");
}
while (! lonelyNode && depth < nodes && ! contains(ll, ((Node)(graph.getNodes().get(0)))))
{
depth++;
//Iterator i = ll.iterator();
for (int i = 0; i < ll.size(); i++)
//while (i.hasNext())
{
//i.next();
//Iterator i2 = ((Node)i.next()).getNeighbors().iterator();
Iterator i2 = ((Node)ll.get(i)).getNeighbors().iterator();
while (i2.hasNext())
{
Node newNode = (Node)i2.next();
if (! contains(ll2, newNode) )
{
ll2.add(newNode);
}
}
//ll2.addAll(((Node)i.next()).getNeighbors());
}
if (ll == ll2)
{
//System.out.println("niets toegevoegd, totaal: " + ll.size() + " knopen");
lonelyNode = true;
}
ll = ll2;
}
if (! contains(ll, (Node)(graph.getNodes().get(0))) )
{
((Node)(graph.getNodes().get(m))).addNeighbor((Node)(graph.getNodes().get(0)));
((Node)(graph.getNodes().get(0))).addNeighbor((Node)(graph.getNodes().get(m)));
//System.out.println("Disconnected node found !" + ((Node)(graph.getNodes().get(m))) );
//System.out.println("Node not longer disconnected");
}
//System.out.println("Node " + ((Node)(graph.getNodes().get(m))) );
}
System.out.println("NetworkBuilder :: loadExistingGraph : nbNodes " + nodes);
for (int i=0; i<nodes; i++)
{
newNodes[i] = new DefaultGraphCell("Vertex " +String.valueOf(i+1));
((DefaultGraphCell)newNodes[i]).add(new DefaultPort("JComponent/Center"));
attributes.put(((DefaultGraphCell)newNodes[i]), createBounds(i*100,i*75, Color.red, "Vertex " +String.valueOf(i+1)));
}
model.insert(newNodes, attributes, null, null, null);
// reset the attributes
attributes = new Hashtable();
edges = 0;
for (node1=0; node1<nodes; node1++) {
ListIterator iterator = ((Node)graph.getNodes().get(node1)).getNeighbors().listIterator();
while(iterator.hasNext())
{
node2 = ((Node)iterator.next()).getID();
if (node1 < node2)
{
edges++;;
}
}
}
System.out.println("NetworkBuilder :: loadExistingGraph : nbEdges " + edges);
newEdges = new Object[edges];
for (node1=0; node1<nodes; node1++) {
ListIterator iterator = ((Node)graph.getNodes().get(node1)).getNeighbors().listIterator();
while(iterator.hasNext())
{
node2 = ((Node)iterator.next()).getID();
if (node1 < node2)
{
j++;
newEdges[j] = new DefaultEdge("Edge " + (node1+1) + " -> " + (node2+1));
//cs.connect(newEdges[j], ((DefaultGraphCell)newNodes[node1]).getChildAt(0), ((DefaultGraphCell)newNodes[node2]).getChildAt(0));
cs.connect(newEdges[j], ((DefaultGraphCell)model.getRootAt(node1)).getChildAt(0), ((DefaultGraphCell)model.getRootAt(node2)).getChildAt(0));
attributes.put(newEdges[j], createEdgeAttributes("Edge " + (node1+1) + " -> " + (node2+1), 5));
}
}
}
model.insert(newEdges, attributes, cs, null, null);
return model;
}
public static void addNewNodes(int graphtype, int nbnodes, int organisation, double edgeprob, DefaultGraphModel model, DefaultGraphCell connectingPoint, int capacity, int number)
{
int beginAtPosition = model.getRootCount();
Map attributes = new Hashtable();
ConnectionSet cs = new ConnectionSet();
Object[] newNodes;
Object[] newEdges;
if (organisation == 1)
{ // Fully Interconnected
edgeprob = 1;
}
if (organisation == 3)
{ // Star, edges are constructed by algorithm to correct unconnectedness
edgeprob = 0;
}
if (organisation == 2)
{
newNodes = new Object[nbnodes];
for (int i=0; i<nbnodes; i++)
{
newNodes[i] = new DefaultGraphCell("Vertex " + number + "" +String.valueOf(i+1));
attributes.put(((DefaultGraphCell)newNodes[i]), createBounds(i*100,i*75, Color.red, "Vertex " + number + "" +String.valueOf(i+1)));
((DefaultGraphCell)newNodes[i]).add(new DefaultPort("JComponent/Center"));
}
model.insert(newNodes, attributes, null, null, null);
attributes = new Hashtable();
if (connectingPoint != null)
{
if (nbnodes<3)
{
newEdges = new Object[nbnodes];
}
else
{
newEdges = new Object[nbnodes+1];
}
}
else
{
if (nbnodes<3)
{
newEdges = new Object[nbnodes-1];
}
else
{
newEdges = new Object[nbnodes];
}
}
int i = 0;
if (nbnodes<3)
{
for (i=0; i<newEdges.length-1; i++)
{
newEdges[i] = new DefaultEdge("Edge " + number + "" + (i+1)%nbnodes + " -> " + number + "" + (i+2)%nbnodes);
cs.connect(newEdges[i], ((DefaultGraphCell)newNodes[i]).getChildAt(0), ((DefaultGraphCell)newNodes[(i+1)%nbnodes]).getChildAt(0));
attributes.put(newEdges[i], createEdgeAttributes(("Edge " + number + "" + (i+1)%nbnodes + " -> " + number + "" + (i+2)%nbnodes), capacity));
}
}
else
{
//for (i=0; i<newEdges.length; i++)
for (i=0; i<nbnodes; i++)
{
newEdges[i] = new DefaultEdge("Edge " + number + "" + (i+1)%nbnodes + " -> " + number + "" + (i+2)%nbnodes);
cs.connect(newEdges[i], ((DefaultGraphCell)newNodes[i]).getChildAt(0), ((DefaultGraphCell)newNodes[(i+1)%nbnodes]).getChildAt(0));
attributes.put(newEdges[i], createEdgeAttributes(("Edge " + number + "" + (i+1)%nbnodes + " -> " + number + "" + (i+2)%nbnodes), capacity));
}
}
if (connectingPoint != null)
{
//System.out.println("boog " + i + " / " + nbnodes + " ** ");
newEdges[i] = new DefaultEdge("ConnectingEdge" + i);
cs.connect(newEdges[i], ((DefaultGraphCell)newNodes[0]).getChildAt(0), connectingPoint.getChildAt(0));
attributes.put(newEdges[i], createEdgeAttributes("Connecting-edge " + i, capacity));
}
model.insert(newEdges, attributes, cs, null, null);
}
else
{
String args[] = new String[6];
args[0] = "-graphtype";
args[1] = String.valueOf(graphtype);
args[2] = "-nbnodes";
args[3] = String.valueOf(nbnodes);
args[4] = "-edgeprob";
args[5] = String.valueOf(edgeprob);
CLI.main(args);
Graph graph = CLI.getGraph();
int j=-1;
int node1, node2;
int nodes = graph.getNodes().size();
int edges = 0;
newNodes = new Object[nodes];
//boolean newNodesConnected[] = new boolean[nodes];
for (int m = 1; m < nodes; m++)
{
int depth = 0;
LinkedList ll = ((Node)(graph.getNodes().get(m))).getNeighbors();
LinkedList ll2 = /*ll;//*/(LinkedList)ll.clone();
boolean lonelyNode = false;
if (ll.isEmpty())
{
lonelyNode = true;
//System.out.println("Lonely node");
}
while (! lonelyNode && depth < nodes && ! contains(ll, ((Node)(graph.getNodes().get(0)))))
{
depth++;
//Iterator i = ll.iterator();
for (int i = 0; i < ll.size(); i++)
//while (i.hasNext())
{
//i.next();
//Iterator i2 = ((Node)i.next()).getNeighbors().iterator();
Iterator i2 = ((Node)ll.get(i)).getNeighbors().iterator();
while (i2.hasNext())
{
Node newNode = (Node)i2.next();
if (! contains(ll2, newNode) )
{
ll2.add(newNode);
}
}
//ll2.addAll(((Node)i.next()).getNeighbors());
}
if (ll == ll2)
{
//System.out.println("niets toegevoegd, totaal: " + ll.size() + " knopen");
lonelyNode = true;
}
ll = ll2;
}
if (! contains(ll, (Node)(graph.getNodes().get(0))) )
{
((Node)(graph.getNodes().get(m))).addNeighbor((Node)(graph.getNodes().get(0)));
((Node)(graph.getNodes().get(0))).addNeighbor((Node)(graph.getNodes().get(m)));
//System.out.println("Disconnected node found !" + ((Node)(graph.getNodes().get(m))) );
//System.out.println("Node not longer disconnected");
}
}
for (int i=0; i<nodes; i++)
{
newNodes[i] = new DefaultGraphCell("Vertex " + number + "" +String.valueOf(i+1));
((DefaultGraphCell)newNodes[i]).add(new DefaultPort("JComponent/Center"));
attributes.put(((DefaultGraphCell)newNodes[i]), createBounds(i*100,i*75, Color.red, "Vertex " + number + "" +String.valueOf(i+1)));
//edges += ((Node)graph.getNodes().get(i)).getNeighbors().size();
//System.out.print("Node " + (i+1) + " heeft " + ((Node)graph.getNodes().get(i)).getNeighbors().size() + " edges, nl naar " );
//Iterator iii = ((Node)graph.getNodes().get(i)).getNeighbors().iterator();
//while (iii.hasNext())
//{
//System.out.print(" " + (((Node)iii.next()).getID()+1));
//}
//System.out.println();
}
model.insert(newNodes, attributes, null, null, null);
// reset the attributes
attributes = new Hashtable();
edges = 0;
for (node1=0; node1<nodes; node1++) {
ListIterator iterator = ((Node)graph.getNodes().get(node1)).getNeighbors().listIterator();
while(iterator.hasNext())
{
node2 = ((Node)iterator.next()).getID();
if (node1 < node2)
{
edges++;;
}
}
}
if (connectingPoint != null)
{
newEdges = new Object[edges+1];
}
else
{
newEdges = new Object[edges];
}
for (node1=0; node1<nodes; node1++) {
ListIterator iterator = ((Node)graph.getNodes().get(node1)).getNeighbors().listIterator();
while(iterator.hasNext())
{
node2 = ((Node)iterator.next()).getID();
if (node1 < node2)
{
j++;
newEdges[j] = new DefaultEdge("Edge " + number + "" + (node1+1) + " -> " + number + "" + (node2+1));
//cs.connect(newEdges[j], ((DefaultGraphCell)newNodes[node1]).getChildAt(0), ((DefaultGraphCell)newNodes[node2]).getChildAt(0));
cs.connect(newEdges[j], ((DefaultGraphCell)model.getRootAt(beginAtPosition+node1)).getChildAt(0), ((DefaultGraphCell)model.getRootAt(beginAtPosition+node2)).getChildAt(0));
attributes.put(newEdges[j], createEdgeAttributes("Edge " + number + "" + (node1+1) + " -> " + number + "" + (node2+1), capacity));
}
}
}
if (connectingPoint != null)
{
newEdges[j+1] = new DefaultEdge("ConnectingEdge" + number);
cs.connect(newEdges[j+1], ((DefaultGraphCell)newNodes[0]).getChildAt(0), connectingPoint.getChildAt(0));
//cs.connect(newEdges[j+1], ((DefaultGraphCell)model.getRootAt(beginAtPosition)).getChildAt(0), connectingPoint.getChildAt(0));
attributes.put(newEdges[j+1], createEdgeAttributes("Connecting-edge " + number, capacity));
}
model.insert(newEdges, attributes, cs, null, null);
}
}
public static boolean contains(LinkedList ll, Node node)
{
Iterator li = ll.iterator();
while (li.hasNext())
{
if (node.equals(li.next()))
{
return true;
}
}
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -