⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 networkbuilder.java

📁 P2P模拟器P2Psim的程序源码
💻 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 + -