Witam. Na zajęciach mamy napisać algorytm komiwojażera. Doszłam do problemu z krzyżowaniem PMX. Oto mój kawałek kodu:
Console.WriteLine("krzyżujemy");
// PIERWSZY OSOBNIK środek
for (int j = lpp; j < ppp; j++)
{
populacja[b][j] = populacja2[b][j];
}
//drugi osobnik środek
for (int o = lpp; o < ppp; o++)
{
populacja[b + 1][o] = populacja2[b + 1][o];
}
// boki pierwszego osobnika
for (int i = 0; i < lpp; i++)
{
int gen = populacja2[b + 1][i];
//Console.WriteLine(gen);
int indeks = Array.IndexOf(populacja[b], gen, lpp, ppp - lpp);
//Console.Write(indeks);
while (indeks > -1)
{
gen = populacja2[b][indeks];
indeks = Array.IndexOf(populacja[b], gen, lpp, ppp - lpp);
}
populacja[b][i] = gen;
}
for (int k = ppp; k < populacja2[b].Length; k++)
{
int gen = populacja2[b + 1][k];
int indeks = Array.IndexOf(populacja[b], gen, lpp, ppp - lpp);
while (indeks > -1)
{
gen = populacja2[b][indeks];
indeks = Array.IndexOf(populacja[b], gen, lpp, ppp - lpp);
}
populacja[b][k] = gen;
}
//boki drugiego osobnika
for (int i = 0; i < lpp; i++)
{
int gen = populacja2[b][i];
int indeks = Array.IndexOf(populacja[b+1], gen, lpp, ppp - lpp);
while (indeks > -1)
{
gen = populacja2[b + 1][indeks];
indeks = Array.IndexOf(populacja[b + 1], gen, lpp, ppp - lpp);
}
populacja[b + 1][i] = gen;
}
for (int k = ppp; k < populacja2[b].Length; k++)
{
int gen = populacja2[b][k];
int indeks = Array.IndexOf(populacja[b + 1], gen, lpp, ppp - lpp);
while (indeks > -1)
{
gen = populacja2[b + 1][indeks];
indeks = Array.IndexOf(populacja[b + 1], gen, lpp, ppp - lpp);
}
populacja[b + 1][k] = gen;
}
Ogólnie w kodzie chodzi o to, że mam zapisanego osobników w populacji2 i muszę ich skrzyżować. lpp i ppp są to punkty przecięcia losowane randomowo za każdym razem w którym krzyżują się te osobniki(środek zostaje tylko przepisany). Następnie zapisujemy tych osobników w populacji.
Problem w tym, że moim zdaniem zapętla się w pętli while.
Proszę o pomoc, albo wskazówki.