Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Osobnik rodzic1 = listaOsobnikow[indeksRodzica1]; //przypisania pierwszego wylosowanego wczesniej osobnika do nowego obiektu
- Osobnik rodzic2 = listaOsobnikow[indeksRodzica2]; //przypisania drugiego wylosowanego wczesniej osobnika do nowego obiektu
- vector<int>drogaDziecka; // będzie tutaj zapisywana uzyskana droga po krzyzowaniu
- int poczatekSciezkiRodzica = rand() % (iloscMiast-1)+1; //wybieramy początkowy wierzcholek od którego będziemy
- //kopiować kolejne wierzchołki do potomka
- //wybieramy końcowy wiechołek do którego kopiować będziemy kolejne wierzcholki potomka
- // ograniczamy wybor konca sciezki do konca danej populacji - drogi danego osobnika
- int koniecSciezkiRodzica = rand() % (iloscMiast - poczatekSciezkiRodzica) + poczatekSciezkiRodzica;
- vector<int>drogaTmp; // vector do którego kopiujemy zawartosc sciezki patrz ponizej
- for (int j = poczatekSciezkiRodzica; j <= koniecSciezkiRodzica; j++)
- {
- drogaTmp.push_back(rodzic1.droga[j]); // w tej petli kopiujemy pierwszą część wierzcholki(genow) dla nowego potomka
- // zaczynając od indeksu poczatekSciezkiRodzica az do koniecSciezkiRodzica
- }
- int licznik = koniecSciezkiRodzica + 1; //pozycja do której w pierwszej kolejności zostanie dodane miasto
- //inaczej mowiac pierwsza pozycja za skopiowana czescia z pierwszego osobnika
- while (drogaTmp.size() != iloscMiast - 1) // dopóki nie uzupłenimy drogi do końca.
- {
- if (licznik == iloscMiast) licznik = 1; // jezeli pozycja jest rowna ilosci miast, oznacza to,
- // ze jest ona ostatnia pozycja w tej drodze - musimy wiec uzupełnic
- // pozostałe miasta, zaczynajac od pierwszego
- int miastoTmp = rodzic2.droga[licznik]; //do zmiennej zapisujemy pierwsza wartosc rodzica2 z jego sciezki, która znajduje się
- //za skopiowaną wczesniej czescia drogi do drogaTMP
- //sprawdzamy czy droga naszego nowego osobnika z już przekopiowanym fragmentem z rodzica1 zawiera miasto
- // które znajduje się w rodzicu2
- if (find(drogaTmp.begin(), drogaTmp.end(), miastoTmp) != drogaTmp.end())
- {
- licznik++; //jezeli zawiera nie dodajemy go do nowego osobnika - kontynuujemy iteracje licznika w celu
- //pobrania nastepnego miasta z rodzica2 oraz ponownym sprawdzeniu czy te miasto znajduje się w naszym potomku
- continue;
- }
- else
- {
- drogaTmp.push_back(miastoTmp); // jezeli jednak nie zawiera, dodajemy te miasto do potomka z oraz iterujemy licznik
- licznik++; // aby sprawdzic kolejne miasto
- }
- }
- drogaDziecka.push_back(0); //miasto poczatkowe jako 0
- for (int j = (iloscMiast-poczatekSciezkiRodzica); j < iloscMiast-1; j++)
- {
- drogaDziecka.push_back(drogaTmp[j]); // kopiujemy zawartość ściezki od indeksu wycietej sciezki z rodzica1 do konca drogi nowego potomka
- }
- for (int j = 0; j < (iloscMiast - poczatekSciezkiRodzica); j++)
- {
- drogaDziecka.push_back(drogaTmp[j]); //tutaj uzupełniamy poczatek drogi nowego potomka zaczynajac od poczatku
- }
- drogaDziecka.push_back(0); // miasto koncowe jako 0
- Osobnik dziecko(drogaDziecka, miasta); //tworzymy nowego osobnika z parametrami - nowa sciezka nowego potomka, oraz iloscia miast
- listaOsobnikow.push_back(dziecko); // dodajemy potomka do listyObosnikow
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement