Exemplo n.º 1
0
        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;
                }
            }
        }
Exemplo n.º 2
0
        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;
                }
            }
        }
Exemplo n.º 3
0
        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]);
            }
        }