public override Osobnik DokonajRekombinacji(Osobnik mama, Osobnik tata, Mutacja mutacja, Fenotyp fenotyp, FunkcjaCelu funkcja_celu) { int liczba_miast = Miasta.Liczba_miast; Osobnik dziecko; int[] genotyp_dziecka = new int[liczba_miast]; int punkt_przecięcia = LosowaKlasa.Los.Next(liczba_miast); for (int i = 0; i < punkt_przecięcia; i++) { genotyp_dziecka[i] = mama.Genotyp[i]; } for (int i = punkt_przecięcia; i < liczba_miast; i++) { genotyp_dziecka[i] = tata.Genotyp[i]; } double wylosowana_liczba = LosowaKlasa.Los.NextDouble(); if (wylosowana_liczba < mutacja.Prawdopodobieństwo_mutacji) { genotyp_dziecka = mutacja.Mutuj(genotyp_dziecka); } dziecko = new Osobnik(genotyp_dziecka, fenotyp, funkcja_celu); return(dziecko); }
public override Osobnik DokonajRekombinacji(Osobnik mama, Osobnik tata, Mutacja mutacja, Fenotyp fenotyp, FunkcjaCelu funkcja_celu) { int liczba_miast = Miasta.Liczba_miast; int[] genotyp_dziecka = new int[liczba_miast]; Osobnik dziecko; int punkt_przecięcia = LosowaKlasa.Los.Next(0, liczba_miast); int punkt_przecięcia2 = LosowaKlasa.Los.Next(punkt_przecięcia, liczba_miast); bool[] czy_użyte = new bool[liczba_miast]; for (int i = punkt_przecięcia; i < punkt_przecięcia2; i++) { genotyp_dziecka[i] = mama.Genotyp[i]; czy_użyte[mama.Genotyp[i] - 1] = true; } int indeks = punkt_przecięcia2; for (int i = punkt_przecięcia2; i < liczba_miast; i++) { while (czy_użyte[tata.Genotyp[indeks] - 1]) { indeks++; indeks %= liczba_miast; } genotyp_dziecka[i] = tata.Genotyp[indeks]; indeks++; indeks %= liczba_miast; } for (int i = 0; i < punkt_przecięcia; i++) { while (czy_użyte[tata.Genotyp[indeks] - 1]) { indeks++; indeks %= liczba_miast; } genotyp_dziecka[i] = tata.Genotyp[indeks]; indeks++; indeks %= liczba_miast; } double wylosowana_liczba = LosowaKlasa.Los.NextDouble(); if (wylosowana_liczba < mutacja.Prawdopodobieństwo_mutacji) { genotyp_dziecka = mutacja.Mutuj(genotyp_dziecka); } dziecko = new Osobnik(genotyp_dziecka, fenotyp, funkcja_celu); return(dziecko); }
public Algorytm(Osobnik[] populacja_startowa, Selekcja selekcja, Rekombinacja rekombinacja, Mutacja mutacja, WarunekStopu warunek_stopu, int parametr_stopu, Fenotyp fenotyp, FunkcjaCelu funkcja_celu) { populacja = populacja_startowa; this.selekcja = selekcja; this.rekombinacja = rekombinacja; this.mutacja = mutacja; this.fenotyp = fenotyp; this.funkcja_celu = funkcja_celu; liczba_osobników = populacja_startowa.Length; this.warunek_stopu = warunek_stopu; this.parametr_stopu = parametr_stopu; nowa_populacja = new Osobnik[Liczba_osobników]; }
public override Osobnik DokonajRekombinacji(Osobnik mama, Osobnik tata, Mutacja mutacja, Fenotyp fenotyp, FunkcjaCelu funkcja_celu) { int liczba_miast = Miasta.Liczba_miast; int[] genotyp_dziecka = new int[liczba_miast]; Osobnik dziecko; int[] na_którym_miejscu_w_matce = new int[liczba_miast]; for (int i = 0; i < liczba_miast; i++) { na_którym_miejscu_w_matce[mama.Genotyp[i] - 1] = i; } int indeks = 0; do { genotyp_dziecka[indeks] = mama.Genotyp[indeks]; indeks = na_którym_miejscu_w_matce[tata.Genotyp[indeks] - 1]; } while (indeks != 0); for (int i = 0; i < liczba_miast; i++) { if (genotyp_dziecka[i] == 0) { genotyp_dziecka[i] = tata.Genotyp[i]; } } double wylosowana_liczba = LosowaKlasa.Los.NextDouble(); if (wylosowana_liczba < mutacja.Prawdopodobieństwo_mutacji) { genotyp_dziecka = mutacja.Mutuj(genotyp_dziecka); } dziecko = new Osobnik(genotyp_dziecka, fenotyp, funkcja_celu); return(dziecko); }
public abstract Osobnik DokonajRekombinacji(Osobnik mama, Osobnik tata, Mutacja mutacja, Fenotyp fenotyp, FunkcjaCelu funkcja_celu);
public override Osobnik DokonajRekombinacji(Osobnik mama, Osobnik tata, Mutacja mutacja, Fenotyp fenotyp, FunkcjaCelu funkcja_celu) { int liczba_miast = Miasta.Liczba_miast; int[] genotyp_dziecka = new int[liczba_miast]; Osobnik dziecko; int punkt_przecięcia = LosowaKlasa.Los.Next(liczba_miast); int punkt_przecięcia2 = LosowaKlasa.Los.Next(liczba_miast); bool[] czy_dziecko_zawiera = new bool[liczba_miast]; int[] na_którym_miejscu_w_ojcu = new int[liczba_miast]; for (int i = 0; i < liczba_miast; i++) { na_którym_miejscu_w_ojcu[tata.Genotyp[i] - 1] = i; } if (punkt_przecięcia > punkt_przecięcia2) { for (int i = punkt_przecięcia; i < liczba_miast; i++) { genotyp_dziecka[i] = tata.Genotyp[i]; czy_dziecko_zawiera[genotyp_dziecka[i] - 1] = true; } for (int i = 0; i < punkt_przecięcia2; i++) { genotyp_dziecka[i] = tata.Genotyp[i]; czy_dziecko_zawiera[genotyp_dziecka[i] - 1] = true; } for (int i = punkt_przecięcia2; i < punkt_przecięcia; i++) { int tymczasowa_liczba = mama.Genotyp[i]; while (czy_dziecko_zawiera[tymczasowa_liczba - 1]) { tymczasowa_liczba = mama.Genotyp[na_którym_miejscu_w_ojcu[tymczasowa_liczba - 1]]; } genotyp_dziecka[i] = tymczasowa_liczba; } } else { for (int i = punkt_przecięcia; i < punkt_przecięcia2; i++) { genotyp_dziecka[i] = tata.Genotyp[i]; czy_dziecko_zawiera[genotyp_dziecka[i] - 1] = true; } for (int i = 0; i < punkt_przecięcia; i++) { int tymczasowa_liczba = mama.Genotyp[i]; while (czy_dziecko_zawiera[tymczasowa_liczba - 1]) { tymczasowa_liczba = mama.Genotyp[na_którym_miejscu_w_ojcu[tymczasowa_liczba - 1]]; } genotyp_dziecka[i] = tymczasowa_liczba; } for (int i = punkt_przecięcia2; i < liczba_miast; i++) { int tymczasowa_liczba = mama.Genotyp[i]; while (czy_dziecko_zawiera[tymczasowa_liczba - 1]) { tymczasowa_liczba = mama.Genotyp[na_którym_miejscu_w_ojcu[tymczasowa_liczba - 1]]; } genotyp_dziecka[i] = tymczasowa_liczba; } } double wylosowana_liczba = LosowaKlasa.Los.NextDouble(); if (wylosowana_liczba < mutacja.Prawdopodobieństwo_mutacji) { genotyp_dziecka = mutacja.Mutuj(genotyp_dziecka); } dziecko = new Osobnik(genotyp_dziecka, fenotyp, funkcja_celu); return(dziecko); }