public static Tuple <GeneticSolution, GeneticSolution> TwoPointCrossover(GeneticSolution s1, GeneticSolution s2)
        {
            int[]           c;
            int             q = Randomizer.Next(s1.graph.NodeCount - 1);
            int             r = q;
            int             tmp;
            GeneticSolution o1, o2;

            while (r == q)
            {
                r = Randomizer.Next(s1.graph.NodeCount - 1);
            }

            if (r < q)
            {
                tmp = r;
                r   = q;
                q   = tmp;
            }

            c = s1.colors.Take(q).Concat(s2.colors.Skip(q).Take(r - q)).Concat(s1.colors.Skip(r)).ToArray();

            o1 = new GeneticSolution(s1.graph, c);

            c = s2.colors.Take(q).Concat(s1.colors.Skip(q).Take(r - q)).Concat(s2.colors.Skip(r)).ToArray();

            o2 = new GeneticSolution(s1.graph, c);

            return(new Tuple <GeneticSolution, GeneticSolution>(o1, o2));
        }
        public static Tuple <GeneticSolution, GeneticSolution> OnePointCrossover(GeneticSolution s1, GeneticSolution s2)
        {
            int[]           c;
            int             p = Randomizer.Next(s1.graph.NodeCount - 1) + 1;
            GeneticSolution o1, o2;

            c = s1.colors.Take(p).Concat(s2.colors.Skip(p)).ToArray();

            o1 = new GeneticSolution(s1.graph, c);

            c = s2.colors.Take(p).Concat(s1.colors.Skip(p)).ToArray();

            o2 = new GeneticSolution(s1.graph, c);

            return(new Tuple <GeneticSolution, GeneticSolution>(o1, o2));
        }