예제 #1
0
        ///<summary>
        /// Random graph generator for sparse graphs.
        ///</summary>
        private void GenerateSparseGraph(IGraph G)
        {
            G.Clear();
            IMapper <IPortOwner, int> index = new DictionaryMapper <IPortOwner, int>();

            int n = NodeCount;

            int m = Math.Min(GetMaxEdges(), EdgeCount);

            INode[] V = new INode[n];

            for (int i = 0; i < n; i++)
            {
                V[i]        = G.CreateNode();
                index[V[i]] = i;
            }

            RandomSupport.Permutate(random, V);

            int count = m;

            while (count > 0)
            {
                int   vi = random.Next(n);
                INode v  = V[vi];
                INode w  = V[random.Next(n)];

                if (G.GetEdge(v, w) != null || (v == w && (!AllowSelfLoops || !AllowCycles)))
                {
                    continue;
                }
                G.CreateEdge(v, w);
                count--;
            }

            if (!AllowCycles)
            {
                foreach (IEdge edge in G.Edges)
                {
                    IPort sourcePort = edge.SourcePort;
                    IPort targetPort = edge.TargetPort;
                    if (index[sourcePort.Owner] > index[targetPort.Owner])
                    {
                        G.SetEdgePorts(edge, targetPort, sourcePort);
                    }
                }
            }
        }
예제 #2
0
        ///<summary>
        /// Random graph generator for dense graphs.
        ///</summary>
        private void GenerateDenseGraph(IGraph g)
        {
            g.Clear();
            INode[] nodes = new INode[NodeCount];

            for (int i = 0; i < NodeCount; i++)
            {
                nodes[i] = g.CreateNode();
            }

            RandomSupport.Permutate(random, nodes);

            int m = Math.Min(GetMaxEdges(), EdgeCount);
            int n = NodeCount;

            int adder = (AllowSelfLoops && AllowCycles) ? 0 : 1;

            bool[] edgeWanted = RandomSupport.GetBoolArray(random, GetMaxEdges(), m);
            for (int i = 0, k = 0; i < n; i++)
            {
                for (int j = i + adder; j < n; j++, k++)
                {
                    if (edgeWanted[k])
                    {
                        if (AllowCycles && random.NextDouble() > 0.5f)
                        {
                            g.CreateEdge(nodes[j], nodes[i]);
                        }
                        else
                        {
                            g.CreateEdge(nodes[i], nodes[j]);
                        }
                    }
                }
            }
        }