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