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 DokonajSelekcji(Osobnik[] populacja, Fenotyp fenotyp, FunkcjaCelu funkcja_celu) { int indeks_kandydata1 = LosowaKlasa.Los.Next(Algorytm.Liczba_osobników); int indeks_kandydata2 = LosowaKlasa.Los.Next(Algorytm.Liczba_osobników); Osobnik kandydat1 = populacja[indeks_kandydata1]; Osobnik kandydat2 = populacja[indeks_kandydata2]; if (kandydat1.Wartość < kandydat2.Wartość) { return(kandydat1); } else { return(kandydat2); } }
public override Osobnik DokonajSelekcji(Osobnik[] populacja, Fenotyp fenotyp, FunkcjaCelu funkcja_celu) { Osobnik[] tymczasowa_populacja = new Osobnik[Algorytm.Liczba_osobników]; populacja.CopyTo(tymczasowa_populacja, 0); tymczasowa_populacja = tymczasowa_populacja.OrderByDescending(x => x.Wartość).ToArray(); double wylosowane_prawdopodobieństwo = LosowaKlasa.Los.NextDouble(); double akumulator_prawdopodobieństw = 0; for (int i = 0; i < Algorytm.Liczba_osobników; i++) { akumulator_prawdopodobieństw += prawdopodobieństwa[i]; if (akumulator_prawdopodobieństw >= wylosowane_prawdopodobieństwo) { return(tymczasowa_populacja[i]); } } Console.WriteLine("UPS"); return(new Osobnik(null, null, null)); }
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[] 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 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); }
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 Osobnik(int[] genotyp, Fenotyp fenotyp, FunkcjaCelu funkcja_celu) { this.genotyp = genotyp; this.fenotyp = fenotyp.Oblicz(genotyp); Oblicz(funkcja_celu); }
public abstract Osobnik DokonajSelekcji(Osobnik[] populacja, Fenotyp fenotyp, FunkcjaCelu funkcja_celu);