Krzyżowanie PMX

0

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.

0

ruszylas z tym?

1 użytkowników online, w tym zalogowanych: 0, gości: 1