private static PathGraph[] CycleCrossover(PathGraph Parent1, PathGraph Parent2)
        {
            Mark[]    P1Marked = new Mark[Parent1.Count];
            Mark[]    P2Marked = new Mark[Parent1.Count];
            PathGraph Child1   = new PathGraph(Parent1.Count, Parent1.SupersetGraph);
            PathGraph Child2   = new PathGraph(Parent1.Count, Parent1.SupersetGraph);

            for (int i = 1; i < Parent1.Count - 1; ++i)
            {
                if (P1Marked[Parent1[i].Index].IsMarked == true)
                {
                    continue;
                }

                Graph.Vertex X1 = Parent1[i]; P1Marked[X1.Index].Set(true, i);
                Graph.Vertex X2 = Parent2[i]; P2Marked[X2.Index].Set(true, i);
                do
                {
                    X1 = Parent1[Parent1.IndexOf(X2)]; P1Marked[X1.Index].Set(true, i);
                    X2 = Parent2[Parent1.IndexOf(X2)]; P2Marked[X2.Index].Set(true, i);
                } while (X2 != Parent1[i]);
            }

            // Set initial and final vertices to 0
            Child1[0] = Parent1[0];
            Child2[0] = Parent1[0];
            Child1[Parent1.Count - 1] = Parent1[0];
            Child2[Parent1.Count - 1] = Parent1[0];

            // Fill the children from cycles detected above
            for (int i = 1; i < Parent2.Count - 1; ++i)
            {
                if (P1Marked[Parent1[i].Index].Order % 2 == 0)         // 1, 3, 5 - Cycles
                {
                    Child1[i] = Parent1[i];
                    Child2[i] = Parent2[i];
                }
                else                                            // 2, 4, 6 - Cycles
                {
                    Child1[i] = Parent2[i];
                    Child2[i] = Parent1[i];
                }
            }
            return(new PathGraph[] { Child1, Child2 });
        }