Esempio n. 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="n"></param>
        /// <param name="p"></param>
        /// <param name="k"></param>
        /// <returns></returns>
        public static MultiDirectedGraph <int, int> GenerateTrees(int n, int p, int k)
        {
            // Create empty graph and label provider
            var graph = new MultiDirectedGraph <int, int>();

            graph.Name = "Synthetic_Trees_" + k + "_" + p + "_" + n;

            // Find the degree necessary for a k-depth tree to achieve at least p number of nodes
            int degree = 1;

            while ((int)Math.Pow(degree, k + 1) - 1 < p)
            {
                degree += 1;
            }
            int branchSize = (int)Math.Pow(degree, k + 1) - 1;

            // Keep adding trees while we lack nodes
            for (int treeOffset = 0; treeOffset < n; treeOffset += branchSize)
            {
                int partitionSize = k + 1;

                // Add nodes
                for (int i = 0; i < branchSize; i++)
                {
                    graph.AddNode(treeOffset + i);

                    if (partitionSize < p && Math.Log(i + 1, degree) % 1 != 0)
                    {
                        graph.SetNodeLabel(treeOffset + i, i);
                        partitionSize += 1;
                    }
                    else
                    {
                        graph.SetNodeLabel(treeOffset + i, branchSize);
                    }
                }

                // Add edges
                for (int i = 0; i < branchSize / degree; i++)
                {
                    for (int j = 1; j <= degree; j++)
                    {
                        graph.AddEdge(treeOffset + i, treeOffset + degree * i + j, 0);
                    }
                }
            }

            return(graph);
        }