static Osobnik SelekcjaTurniejowa(Osobnik[] populacja) { Osobnik osobnik1 = populacja[Program.random.Next(Program.wielkośćPopulacji)]; Osobnik osobnik2 = populacja[Program.random.Next(Program.wielkośćPopulacji)]; return(Osobnik.PorównajOsobników(osobnik1, osobnik2)); }
static Osobnik KrzyżowanieOX(Osobnik tata, Osobnik mama) { int punkt1 = Program.random.Next(tata.genotyp.Count); int punkt2 = Program.random.Next(tata.genotyp.Count); if (punkt1 > punkt2) { int temp = punkt1; punkt1 = punkt2; punkt2 = temp; } Osobnik dziecko = new Osobnik(); for (int i = punkt1 + 1; i <= punkt2; i++) { dziecko.genotyp.Add(tata.genotyp[i]); } for (int i = 0; i < tata.genotyp.Count; i++) { if (!dziecko.genotyp.Contains(mama.genotyp[i])) { dziecko.genotyp.Add(mama.genotyp[i]); } } if (Program.random.NextDouble() < Program.prawdopodobieństwoMutacji) { dziecko = dziecko.Mutacja(); } Program.niebo = Osobnik.PorównajOsobników(dziecko, Program.niebo); return(dziecko); }
static Osobnik KrzyżowaniePrzezWymianęPodtras(Osobnik tata, Osobnik mama) { SortedList <int, int> tataGenotypSąsiedztwa = ZmianaReprezentacjiNaSąsiedztwa(tata); SortedList <int, int> mamaGenotypSąsiedztwa = ZmianaReprezentacjiNaSąsiedztwa(mama); SortedList <int, int> dzieckoGenotypSąsiedztwa = new SortedList <int, int>(); int długośćOsobnika = tataGenotypSąsiedztwa.Count; bool flaga = false; //mama int punktPoczątkowy = Program.random.Next(1, tataGenotypSąsiedztwa.Count); int długośćObecnejPodtrasy = Program.random.Next(1, tataGenotypSąsiedztwa.Count); int losowyIndeksRodzica = 0; int wylosowanaWartość = 0; dzieckoGenotypSąsiedztwa.Add(punktPoczątkowy, tataGenotypSąsiedztwa[punktPoczątkowy]); int ostatnioDodanyKluczDziecka = punktPoczątkowy; int ostatnioDodanaWartośćDziecka = tataGenotypSąsiedztwa[punktPoczątkowy]; tataGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka); tataGenotypSąsiedztwa.RemoveAt(tataGenotypSąsiedztwa.IndexOfValue(ostatnioDodanyKluczDziecka)); mamaGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka); mamaGenotypSąsiedztwa.RemoveAt(mamaGenotypSąsiedztwa.IndexOfValue(ostatnioDodanyKluczDziecka)); while (dzieckoGenotypSąsiedztwa.Count < długośćOsobnika - 1) { if (tataGenotypSąsiedztwa.Count < mamaGenotypSąsiedztwa.Count) { długośćObecnejPodtrasy = Program.random.Next(1, tataGenotypSąsiedztwa.Count); } else { długośćObecnejPodtrasy = Program.random.Next(1, mamaGenotypSąsiedztwa.Count); } if (flaga == true) //tata { for (int i = 0; i < długośćObecnejPodtrasy; i++) { if (tataGenotypSąsiedztwa.ContainsKey(ostatnioDodanaWartośćDziecka) && !dzieckoGenotypSąsiedztwa.ContainsValue(tataGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka])) { dzieckoGenotypSąsiedztwa.Add(ostatnioDodanaWartośćDziecka, tataGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka]); ostatnioDodanyKluczDziecka = ostatnioDodanaWartośćDziecka; ostatnioDodanaWartośćDziecka = tataGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka]; if (mamaGenotypSąsiedztwa.ContainsValue(ostatnioDodanaWartośćDziecka)) { mamaGenotypSąsiedztwa.RemoveAt(mamaGenotypSąsiedztwa.IndexOfValue(ostatnioDodanaWartośćDziecka)); } tataGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka); } else //jeśli dziecko już zawiera tę wartość, losujemy jakąś inną z puli wartości taty { losowyIndeksRodzica = Program.random.Next(tataGenotypSąsiedztwa.Count); wylosowanaWartość = tataGenotypSąsiedztwa[tataGenotypSąsiedztwa.Keys[losowyIndeksRodzica]]; if (!dzieckoGenotypSąsiedztwa.ContainsValue(wylosowanaWartość)) { dzieckoGenotypSąsiedztwa.Add(ostatnioDodanaWartośćDziecka, wylosowanaWartość); ostatnioDodanyKluczDziecka = ostatnioDodanaWartośćDziecka; ostatnioDodanaWartośćDziecka = wylosowanaWartość; if (mamaGenotypSąsiedztwa.ContainsValue(ostatnioDodanaWartośćDziecka)) { mamaGenotypSąsiedztwa.RemoveAt(mamaGenotypSąsiedztwa.IndexOfValue(ostatnioDodanaWartośćDziecka)); } tataGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka); } } } flaga = false; } else //mama { for (int i = 0; i < długośćObecnejPodtrasy; i++) { if (mamaGenotypSąsiedztwa.ContainsKey(ostatnioDodanaWartośćDziecka) && !dzieckoGenotypSąsiedztwa.ContainsValue(mamaGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka])) { dzieckoGenotypSąsiedztwa.Add(ostatnioDodanaWartośćDziecka, mamaGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka]); ostatnioDodanyKluczDziecka = ostatnioDodanaWartośćDziecka; ostatnioDodanaWartośćDziecka = mamaGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka]; if (tataGenotypSąsiedztwa.ContainsValue(ostatnioDodanaWartośćDziecka)) { tataGenotypSąsiedztwa.RemoveAt(tataGenotypSąsiedztwa.IndexOfValue(ostatnioDodanaWartośćDziecka)); } mamaGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka); } else { losowyIndeksRodzica = Program.random.Next(mamaGenotypSąsiedztwa.Count); wylosowanaWartość = mamaGenotypSąsiedztwa[mamaGenotypSąsiedztwa.Keys[losowyIndeksRodzica]]; if (!dzieckoGenotypSąsiedztwa.ContainsValue(wylosowanaWartość)) { dzieckoGenotypSąsiedztwa.Add(ostatnioDodanaWartośćDziecka, wylosowanaWartość); ostatnioDodanyKluczDziecka = ostatnioDodanaWartośćDziecka; ostatnioDodanaWartośćDziecka = wylosowanaWartość; if (tataGenotypSąsiedztwa.ContainsValue(ostatnioDodanaWartośćDziecka)) { tataGenotypSąsiedztwa.RemoveAt(tataGenotypSąsiedztwa.IndexOfValue(ostatnioDodanaWartośćDziecka)); } mamaGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka); } } } flaga = true; } } dzieckoGenotypSąsiedztwa.Add(ostatnioDodanaWartośćDziecka, punktPoczątkowy); Osobnik dziecko = ZmianaReprezentacjiNaŚcieżkową(dzieckoGenotypSąsiedztwa); if (Program.random.NextDouble() < Program.prawdopodobieństwoMutacji) { dziecko = dziecko.Mutacja(); } Program.niebo = Osobnik.PorównajOsobników(dziecko, Program.niebo); return(dziecko); }