private static void Crossover()

in Source/Extensions/TSP Resources/GeneticTspAlgorithm.cs [346:474]


        private static void Crossover(int cp1, int cp2, int[] p1, int[] p2, int[] o1, int[] o2, int number, Random random)
        {
            for (int i = 0; i < number; i++)
            {
                o1[i] = o2[i] = -1;
            }

            for (int i = cp1; i <= cp2; i++)
            {
                o1[i] = p2[i];
                o2[i] = p1[i];
            }

            for (int i = 0; i < cp1; i++)
            {
                bool found = false;
                int t = p1[i];

                for (int j = i + 1; !found && j < number; j++)
                {
                    found = t == o1[j];
                }

                if (!found)
                {
                    o1[i] = t;
                }
            }

            for (int i = cp2 + 1; i < number; i++)
            {
                bool found = false;
                int t = p1[i];

                for (int j = 0; !found && j < number; j++)
                {
                    found = t == o1[j];
                }

                if (!found)
                {
                    o1[i] = t;
                }
            }

            List<int> used = new List<int>();

            for (int i = 0; i < number; i++)
            {
                if (o1[i] != -1)
                {
                    used.Add(o1[i]);
                }
            }

            for (int i = 0; i < number; i++)
            {
                if (o1[i] == -1)
                {
                    int x;

                    do
                    {
                        x = random.Next(number);
                    } while (used.Contains(x));

                    o1[i] = x;
                    used.Add(x);
                }
            }

            for (int i = 0; i < cp1; i++)
            {
                bool found = false;
                int t = p2[i];

                for (int j = i + 1; !found && j < number; j++)
                {
                    found = t == o2[j];
                }

                if (!found)
                {
                    o2[i] = t;
                }
            }

            for (int i = cp2 + 1; i < number; i++)
            {
                bool found = false;
                int t = p2[i];

                for (int j = 0; !found && j < number; j++)
                {
                    found = t == o2[j];
                }

                if (!found)
                {
                    o2[i] = t;
                }
            }

            used = new List<int>();

            for (int i = 0; i < number; i++)
            {
                if (o2[i] != -1)
                {
                    used.Add(o2[i]);
                }
            }

            for (int i = 0; i < number; i++)
            {
                if (o2[i] == -1)
                {
                    int x;

                    do
                    {
                        x = random.Next(number);
                    } while (used.Contains(x));

                    o2[i] = x;
                    used.Add(x);
                }
            }
        }