internal void GenerateMultipleGraph(IBasicAdjList network) { int n = NodeCount; int m = EdgeCount; int[] deg = new int[n]; INode[] V = new INode[n]; for (int i = 0; i < n; i++) V[i] = network.CreateNode(); for (int i = 0; i < m; i++) deg[_rand.Next(n)]++; for (int i = 0; i < n; i++) { INode v = V[i]; int d = deg[i]; while (d > 0) { int j = _rand.Next(n); if (j == i && (!AllowCycles || !AllowSelfLoops)) continue; network.CreateEdge(v, V[j]); d--; } } if (!AllowCycles) { List<IEdge> edgesToReverse = new List<IEdge>(); foreach (IEdge edge in network.Edges) { if (edge.SourceNode.Index > edge.DestinationNode.Index) { edgesToReverse.Add(edge); } } for (int k = 0; k < edgesToReverse.Count; k++) { network.ReverseEdge(edgesToReverse[k]); edgesToReverse[k] = null; } } }
internal void GenerateSparseGraph(IBasicAdjList network) { int n = NodeCount; int m = Math.Min(MaxAllowableEdges, EdgeCount); INode[] V = new INode[n]; for (int i = 0; i < n; i++) { V[i] = network.CreateNode(); } int count = m; while (count > 0) { int vi = _rand.Next(n); INode v = V[vi]; INode w = V[_rand.Next(n)]; if (v.IsEdge(w) || (v == w && (!AllowSelfLoops || !AllowCycles))) { continue; } network.CreateEdge(v, w); count--; } if (!AllowCycles) { List<IEdge> edgesToReverse = new List<IEdge>(); foreach (IEdge edge in network.Edges) { if (edge.SourceNode.Index > edge.DestinationNode.Index) { edgesToReverse.Add(edge); } } for (int k = 0; k < edgesToReverse.Count; k++) { network.ReverseEdge(edgesToReverse[k]); edgesToReverse[k] = null; } } }
internal void GenerateDenseGraph(IBasicAdjList network) { for (int i = 0; i < NodeCount; i++) { network.CreateNode(); } if (EdgeCount < MaxAllowableEdges) EdgeCount = MaxAllowableEdges; IList<Point> nodePairs = GetNodePairs(EdgeCount); foreach (Point p in nodePairs) { network.CreateEdge(network.Nodes[p.X], network.Nodes[p.Y]); } }