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

            int n = NodeCount;

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

            INode[] nodes = new INode[n];

            for (int i = 0; i < n; i++)
            {
                nodes[i]        = CreateNode(graph);
                index[nodes[i]] = i;
            }

            RandomSupport.Permutate(random, nodes);

            int count = m;

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

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

            if (!AllowCycles)
            {
                foreach (IEdge edge in graph.Edges)
                {
                    IPort sourcePort = edge.SourcePort;
                    IPort targetPort = edge.TargetPort;
                    if (index[sourcePort.Owner] > index[targetPort.Owner])
                    {
                        graph.SetEdgePorts(edge, targetPort, sourcePort);
                    }
                }
            }
        }
Exemple #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] = CreateNode(g);
            }

            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]);
                        }
                    }
                }
            }
        }