1 25 38 package org.jgrapht.generate; 39 40 import java.util.*; 41 42 import org.jgrapht.*; 43 import org.jgrapht.graph.*; 44 45 46 60 public class RandomGraphGenerator<V, E> 61 implements GraphGenerator<V, E, V> 62 { 63 64 66 private static long seedUniquifier = 8682522807148012L; 67 68 70 protected int numOfVertexes; 71 protected int numOfEdges; 72 protected Random randomizer; 73 private long randomizerSeed; 74 75 77 public RandomGraphGenerator(int aNumOfVertexes, int aNumOfEdges) 78 { 79 if ((numOfVertexes < 0) || (numOfEdges < 0)) { 80 throw new IllegalArgumentException ("must be non-negative"); 81 } 82 this.numOfVertexes = aNumOfVertexes; 83 this.numOfEdges = aNumOfEdges; 84 85 this.randomizerSeed = chooseRandomSeedOnce(); 86 this.randomizer = new Random(this.randomizerSeed); 87 } 88 89 91 100 private synchronized static long chooseRandomSeedOnce() 101 { 102 return (++seedUniquifier + System.nanoTime()); 103 } 104 105 108 private void resetRandomSeed() 109 { 110 this.randomizer.setSeed(this.randomizerSeed); 111 } 112 113 126 public void generateGraph( 127 Graph<V, E> target, 128 VertexFactory<V> vertexFactory, 129 Map<String , V> resultMap) 130 { 131 resetRandomSeed(); 132 133 Map<Integer , V> orderToVertexMap = 136 new HashMap<Integer , V>(this.numOfVertexes); 137 138 for (int i = 0; i < this.numOfVertexes; i++) { 139 V currVertex = vertexFactory.createVertex(); 140 target.addVertex(currVertex); 141 orderToVertexMap.put(Integer.valueOf(i), currVertex); 142 } 143 144 EdgeTopologyFactory<V, E> edgesFactory = 147 edgeTopologyFactoryChooser(target, numOfEdges); 148 if (!edgesFactory.isNumberOfEdgesValid(target, numOfEdges)) { 149 throw new IllegalArgumentException ( 150 "numOfEdges is not valid for the graph type " 151 + "\n-> Invalid number Of Edges=" + numOfEdges + " for:" 152 + " graph type=" + target.getClass() 153 + " ,number Of Vertexes=" + this.numOfVertexes 154 + "\n-> Advice: For the Max value , check the javadoc for" 155 + " org.jgrapht.generate.RandomGraphGenerator.DefaultEdgeTopologyFactory"); 156 } 157 158 edgesFactory.createEdges( 159 target, 160 orderToVertexMap, 161 this.numOfEdges, 162 this.randomizer); 163 } 164 165 173 private EdgeTopologyFactory<V, E> edgeTopologyFactoryChooser( 174 Graph<V, E> target, 175 int numOfEdges) 176 { 177 return new DefaultEdgeTopologyFactory<V, E>(); 178 } 179 180 182 188 public interface EdgeTopologyFactory<VV, EE> 189 { 190 202 public void createEdges( 203 Graph<VV, EE> targetGraph, 204 Map<Integer , VV> orderToVertexMap, 205 int numberOfEdges, 206 Random randomizer); 207 208 217 public boolean isNumberOfEdgesValid( 218 Graph<VV, EE> targetGraph, 219 int numberOfEdges); 220 } 221 222 224 241 public class DefaultEdgeTopologyFactory<VV, EE> 242 implements EdgeTopologyFactory<VV, EE> 243 { 244 public void createEdges( 245 Graph<VV, EE> targetGraph, 246 Map<Integer , VV> orderToVertexMap, 247 int numberOfEdges, 248 Random randomizer) 249 { 250 int iterationsCounter = 0; 251 int edgesCounter = 0; 252 while (edgesCounter < numberOfEdges) { 253 VV startVertex = 256 orderToVertexMap.get( 257 Integer.valueOf(randomizer.nextInt(numOfVertexes))); 258 VV endVertex = 259 orderToVertexMap.get( 260 Integer.valueOf(randomizer.nextInt(numOfVertexes))); 261 try { 262 EE resultEdge = targetGraph.addEdge(startVertex, endVertex); 263 if (resultEdge != null) { 264 edgesCounter++; 265 } 266 } catch (Exception e) { 267 } 269 270 iterationsCounter++; 271 } 272 } 273 274 334 public boolean isNumberOfEdgesValid( 335 Graph<VV, EE> targetGraph, 336 int numberOfEdges) 337 { 338 boolean result; 339 340 boolean infinite = false; 341 int maxAllowedEdges = getMaxEdgesForVertexNum(targetGraph); 342 if (maxAllowedEdges == -1) { 343 infinite = true; 344 } 345 346 if (true == infinite) { 347 result = true; 348 } else if (numberOfEdges <= maxAllowedEdges) { 349 result = true; 350 } else { 351 result = false; 352 } 353 return result; 354 } 355 356 359 public int getMaxEdgesForVertexNum(Graph<VV, EE> targetGraph) 360 { 361 int maxAllowedEdges = 0; 362 if (targetGraph instanceof SimpleGraph) { 363 maxAllowedEdges = numOfVertexes * (numOfVertexes - 1) / 2; 364 } else if (targetGraph instanceof SimpleDirectedGraph) { 365 maxAllowedEdges = numOfVertexes * (numOfVertexes - 1); 366 } else if (targetGraph instanceof DefaultDirectedGraph) { 367 maxAllowedEdges = numOfVertexes * numOfVertexes; 368 } else if ( 369 (targetGraph instanceof Multigraph) 370 || (targetGraph instanceof Pseudograph) 371 || (targetGraph instanceof DirectedMultigraph)) { 372 maxAllowedEdges = -1; } else { 374 throw new ClassCastException ( 375 "cannot find the appropriate graph type"); 376 } 377 return maxAllowedEdges; 378 } 379 } 380 } 381 | Popular Tags |